為什麼零基礎會入不了Python爬蟲的門?8個常用技巧助你一臂之力
python作為一門高階程式語言,它的定位是優雅、明確和簡單。我學用python差不多一年時間了,用得最多的還是各類爬蟲指令碼:寫過抓代理本機驗證的指令碼,寫過論壇中自動登入自動發貼的指令碼,寫過自動收郵件的指令碼,寫過簡單的驗證碼識別的指令碼。
這些指令碼有一個共性,都是和web相關的,總要用到獲取連結的一些方法,故累積了不少爬蟲抓站的經驗,在此總結一下,那麼以後做東西也就不用重複勞動了。
1、基本抓取網頁
get方法
import urllib2
url = "
response = urllib2.urlopen(url)
print response.read()
post方法
import urllib
import urllib2
url = "
form = {'name':'abc','password':'1234'}
form_data = urllib.urlencode(form)
request = urllib2.Request(url,form_data)
response = urllib2.urlopen(request)
print response.read()
2.使用代理伺服器
這在某些情況下比較有用,比如IP被封了,或者比如IP訪問的次數受到限制等等。
import urllib2
proxy_support = urllib2.ProxyHandler({'http':'})
opener = urllib2.build_opener(proxy_support, urllib2.HTTPHandler)
urllib2.install_opener(opener)
content = urllib2.urlopen(').read()
3.Cookies處理
import urllib2, cookielib
cookie_support= urllib2.HTTPCookieProcessor(cookielib.CookieJar())
opener = urllib2.build_opener(cookie_support, urllib2.HTTPHandler)
urllib2.install_opener(opener)
content = urllib2.urlopen(').read()
是的沒錯,如果想同時用代理和cookie,那就加入proxy_support然後operner改為
opener=urllib2.build_opener(proxy_support, cookie_support, urllib2.HTTPHandler)
4.偽裝成瀏覽器訪問
某些網站反感爬蟲的到訪,於是對爬蟲一律拒絕請求。這時候我們需要偽裝成瀏覽器,這可以透過修改http包中的header來實現:
headers = {
'User-Agent':'Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.1.6) Gecko/20091201 Firefox/3.5.6'
}
req = urllib2.Request(
url = 'http://secure.verycd.com/signin/*/
data = postdata,
headers = headers
)
5、頁面解析
對於頁面解析最強大的當然是正規表示式,這個對於不同網站不同的使用者都不一樣,就不用過多的說明。
其次就是解析庫了,常用的有兩個lxml和BeautifulSoup。
對於這兩個庫,我的評價是,都是HTML/XML的處理庫,Beautifulsoup純python實現,效率低,但是功能實用,比如能用透過結果搜尋獲得某個HTML節點的原始碼;lxmlC語言編碼,高效,支援Xpath。
6.驗證碼的處理
碰到驗證碼咋辦?這裡分兩種情況處理:
google那種驗證碼,沒辦法。
簡單的驗證碼:字元個數有限,只使用了簡單的平移或旋轉加噪音而沒有扭曲的,這種還是有可能可以處理的,一般思路是旋轉的轉回來,噪音去掉,然後劃分單個字元,劃分好了以後再透過特徵提取的方法(例如PCA)降維並生成特徵庫,然後把驗證碼和特徵庫進行比較。這個比較複雜,這裡就不展開了,具體做法請弄本相關教科書好好研究一下。
7. gzip/deflate支援
現在的網頁普遍支援gzip壓縮,這往往可以解決大量傳輸時間,以VeryCD的主頁為例,未壓縮版本247K,壓縮了以後45K,為原來的1/5。這就意味著抓取速度會快5倍。
然而python的urllib/urllib2預設都不支援壓縮,要返回壓縮格式,必須在request的header裡面寫明’accept-encoding’,然後讀取response後更要檢查header檢視是否有’content-encoding’一項來判斷是否需要解碼,很繁瑣瑣碎。如何讓urllib2自動支援gzip, defalte呢?
其實可以繼承BaseHanlder類,然後build_opener的方式來處理:
import urllib2
from gzip import GzipFile
from StringIO import StringIO
class ContentEncodingProcessor(urllib2.BaseHandler):
"""A handler to add gzip capabilities to urllib2 requests """
# add headers to requests
def http_request(self, req):
req.add_header("Accept-Encoding", "gzip, deflate")
return req
# decode
def http_response(self, req, resp):
old_resp = resp
# gzip
if resp.headers.get("content-encoding") == "gzip":
gz = GzipFile(
fileobj=StringIO(resp.read()),
mode="r"
)
resp = urllib2.addinfourl(gz, old_resp.headers, old_resp.url, old_resp.code)
resp.msg = old_resp.msg
# deflate
if resp.headers.get("content-encoding") == "deflate":
gz = StringIO( deflate(resp.read()) )
resp = urllib2.addinfourl(gz, old_resp.headers, old_resp.url, old_resp.code) # 'class to add info() and
resp.msg = old_resp.msg
return resp
# deflate support
import zlib
def deflate(data): # zlib only provides the zlib compress format, not the deflate format;
try: # so on top of all there's this workaround:
return zlib.decompress(data, -zlib.MAX_WBITS)
except zlib.error:
return zlib.decompress(data)
然後就簡單了,
encoding_support = ContentEncodingProcessor
opener = urllib2.build_opener( encoding_support, urllib2.HTTPHandler )
#直接用opener開啟網頁,如果伺服器支援gzip/defalte則自動解壓縮
content = opener.open(url).read()
8、多執行緒併發抓取
單執行緒太慢的話,就需要多執行緒了,這裡給個簡單的執行緒池模板 這個程式只是簡單地列印了1-10,但是可以看出是併發的。
雖然說Python的多執行緒很雞肋,但是對於爬蟲這種網路頻繁型,還是能一定程度提高效率的。
from threading import Thread
from Queue import Queue
from time import sleep
# q是任務佇列
#NUM是併發執行緒總數
#JOBS是有多少任務
q = Queue()
NUM = 2
JOBS = 10
#具體的處理函式,負責處理單個任務
def do_somthing_using(arguments):
print arguments
#這個是工作程式,負責不斷從佇列取資料並處理
def working():
while True:
arguments = q.get()
do_somthing_using(arguments)
sleep(1)
q.task_done()
#fork NUM個執行緒等待佇列
for i in range(NUM):
t = Thread(target=working)
t.setDaemon(True)
t.start()
#把JOBS排入佇列
for i in range(JOBS):
q.put(i)
#等待所有JOBS完成
q.join()
9. 總結
閱讀Python編寫的程式碼感覺像在閱讀英語一樣,這讓使用者可以專注於解決問題而不是去搞明白語言本身。Python雖然是基於C語言編寫,但是摒棄了C中複雜的指標,使其變得簡明易學。並且作為開源軟體,Python允許對程式碼進行閱讀,複製甚至改進。這些效能成就了Python的高效率,有“人生苦短,我用Python”之說,是一種十分精彩又強大的語言。
總而言之,開始學Python一定要注意這4點:
1.程式碼規範,這本身就是一個非常好的習慣,如果開始不養好好的程式碼規劃,以後會很痛苦。
2.多動手,少看書,很多人學Python就一味的看書,這不是學數學物理,你看例題可能就會了,學習Python主要是學習程式設計思想。
3.勤練習,學完新的知識點,一定要記得如何去應用,不然學完就會忘,學我們這行主要都是實際操作。
4.學習要有效率,如果自己都覺得效率非常低,那就停不停,找一下原因,去問問過來人這是為什麼。
加我VX:ww-51testing 回覆關鍵詞“測試”領取限量軟體測試學習資料哦~~
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/31407649/viewspace-2665025/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- Python爬蟲入門,8個常用爬蟲技巧盤點Python爬蟲
- 帶你入門Python爬蟲,8個常用爬蟲技巧盤點Python爬蟲
- 為什麼學習python及爬蟲,Python爬蟲[入門篇]?Python爬蟲
- Python爬蟲開發(一):零基礎入門Python爬蟲
- 什麼是Python爬蟲?python爬蟲入門難嗎?Python爬蟲
- Python爬蟲五大零基礎入門教程Python爬蟲
- 為什麼很多人入門選擇Python爬蟲?Python爬蟲
- 爬蟲入門基礎-Python爬蟲Python
- Python為什麼叫爬蟲?Python為什麼適合寫爬蟲?Python爬蟲
- Python爬蟲入門(2):爬蟲基礎瞭解Python爬蟲
- 什麼是Python爬蟲?Python爬蟲常用框架有哪些?Python爬蟲框架
- 零基礎入門學習Python爬蟲必備的知識點!Python爬蟲
- python爬蟲是什麼?為什麼用python語言寫爬蟲?Python爬蟲
- python為什麼叫爬蟲?Python和爬蟲有什麼關係?Python爬蟲
- 什麼是網路爬蟲?為什麼用Python寫爬蟲?爬蟲Python
- 常用的 Python 爬蟲技巧總結Python爬蟲
- Python爬蟲:一些常用的爬蟲技巧總結Python爬蟲
- Python成為爬蟲常用語言的原因是什麼?Python爬蟲
- Python 爬蟲零基礎教程(1):爬單個圖片Python爬蟲
- 要學會Python爬蟲都需要什麼基礎呢?Python爬蟲
- Python爬蟲入門Python爬蟲
- 十四個爬蟲專案爬蟲超詳細講解(零基礎入門,老年人都看的懂)爬蟲
- Python爬蟲是什麼?常用框架有哪些?Python爬蟲框架
- python爬蟲是什麼?爬蟲可以分為哪幾類?Python爬蟲
- Python爬蟲可以幹什麼?Python爬蟲有什麼用?Python爬蟲
- 你的爬蟲為什麼會被檢測到?爬蟲
- 為什麼選擇Python做爬蟲Python爬蟲
- 爬蟲(1) - 爬蟲基礎入門理論篇爬蟲
- 什麼是MongoDB?Python爬蟲為什麼使用MongoDB?MongoDBPython爬蟲
- 太陽軟體站長:學爬蟲怎麼能不會這8個技巧?爬蟲
- 如何入門 Python 爬蟲?Python爬蟲
- python-爬蟲入門Python爬蟲
- 【爬蟲】python爬蟲從入門到放棄爬蟲Python
- Python爬蟲超詳細講解(零基礎入門,老年人都看的懂)Python爬蟲
- Python爬蟲怎麼入門-初級篇Python爬蟲
- 為什麼python會火?吸引那麼多人零基礎學習Python
- 27 個為什麼,幫助你更好的理解PythonPython
- 老猿為什麼寫Python爬蟲教程Python爬蟲