Python爬蟲(chóng)入門(mén),8個(gè)常用爬蟲(chóng)技巧盤(pán)點(diǎn)
來(lái)源:
奇酷教育 發(fā)表于:
Python爬蟲(chóng)入門(mén),8個(gè)常用爬蟲(chóng)技巧盤(pán)點(diǎn)。
編程對(duì)于任何一個(gè)新手來(lái)說(shuō)都不是一件容易的事情,Python對(duì)于任何一個(gè)想學(xué)習(xí)的編程的人來(lái)說(shuō)的確是一個(gè)福音,閱讀Python代碼像是在閱讀文章,源于Python語(yǔ)言提供了非常優(yōu)雅的語(yǔ)法,被稱(chēng)為最優(yōu)雅的語(yǔ)言之一。
python入門(mén)時(shí)
用得最多的還是各類(lèi)爬蟲(chóng)腳本,
寫(xiě)過(guò)抓代理本機(jī)驗(yàn)證的腳本、寫(xiě)過(guò)論壇中自動(dòng)登錄自動(dòng)發(fā)貼的腳本
寫(xiě)過(guò)自動(dòng)收郵件的腳本、寫(xiě)過(guò)簡(jiǎn)單的驗(yàn)證碼識(shí)別的腳本。
這些腳本有一個(gè)共性,都是和web相關(guān)的,
8個(gè)常用爬蟲(chóng)技巧盤(pán)點(diǎn)和大家分享:
1、基本抓取網(wǎng)頁(yè)
get方法
post方法
2.使用代理服務(wù)器
這在某些情況下比較有用,
比如IP被封了,或者比如IP訪(fǎng)問(wèn)的次數(shù)受到限制等等。
3.Cookies處理
是的沒(méi)錯(cuò),如果想同時(shí)用代理和cookie,
那就加入proxy_support然后operner改為 ,如下:
4.偽裝成瀏覽器訪(fǎng)問(wèn)
某些網(wǎng)站反感爬蟲(chóng)的到訪(fǎng),于是對(duì)爬蟲(chóng)一律拒絕請(qǐng)求。
這時(shí)候我們需要偽裝成瀏覽器,
這可以通過(guò)修改http包中的header來(lái)實(shí)現(xiàn):
5、頁(yè)面解析
對(duì)于頁(yè)面解析最強(qiáng)大的當(dāng)然是正則表達(dá)式,
這個(gè)對(duì)于不同網(wǎng)站不同的使用者都不一樣,就不用過(guò)多的說(shuō)明。
其次就是解析庫(kù)了,常用的有兩個(gè)lxml和BeautifulSoup。
對(duì)于這兩個(gè)庫(kù),我的評(píng)價(jià)是,
都是HTML/XML的處理庫(kù),Beautifulsoup純python實(shí)現(xiàn),效率低,
但是功能實(shí)用,比如能用通過(guò)結(jié)果搜索獲得某個(gè)HTML節(jié)點(diǎn)的源碼;
lxmlC語(yǔ)言編碼,高效,支持Xpath。
6.驗(yàn)證碼的處理
碰到驗(yàn)證碼咋辦?
這里分兩種情況處理:
google那種驗(yàn)證碼,沒(méi)辦法。
簡(jiǎn)單的驗(yàn)證碼:字符個(gè)數(shù)有限,只使用了簡(jiǎn)單的平移或旋轉(zhuǎn)加噪音而沒(méi)有扭曲的,
這種還是有可能可以處理的,一般思路是旋轉(zhuǎn)的轉(zhuǎn)回來(lái),噪音去掉,
然后劃分單個(gè)字符,劃分好了以后再通過(guò)特征提取的方法(例如PCA)降維并生成特征庫(kù),
然后把驗(yàn)證碼和特征庫(kù)進(jìn)行比較。
這個(gè)比較復(fù)雜,這里就不展開(kāi)了,
具體做法請(qǐng)弄本相關(guān)教科書(shū)好好研究一下。
7. gzip/deflate支持
現(xiàn)在的網(wǎng)頁(yè)普遍支持gzip壓縮,這往往可以解決大量傳輸時(shí)間,
以VeryCD的主頁(yè)為例,未壓縮版本247K,壓縮了以后45K,為原來(lái)的1/5。
這就意味著抓取速度會(huì)快5倍。
然而python的urllib/urllib2默認(rèn)都不支持壓縮
要返回壓縮格式,必須在request的header里面寫(xiě)明’accept-encoding’,
然后讀取response后更要檢查header查看是否有’content-encoding’一項(xiàng)來(lái)判斷是否需要解碼,很繁瑣瑣碎。
如何讓urllib2自動(dòng)支持gzip, defalte呢?
其實(shí)可以繼承BaseHanlder類(lèi),
然后build_opener的方式來(lái)處理:
8、多線(xiàn)程并發(fā)抓取
單線(xiàn)程太慢的話(huà),就需要多線(xiàn)程了,
這里給個(gè)簡(jiǎn)單的線(xiàn)程池模板 這個(gè)程序只是簡(jiǎn)單地打印了1-10,
但是可以看出是并發(fā)的。
雖然說(shuō)Python的多線(xiàn)程很雞肋
但是對(duì)于爬蟲(chóng)這種網(wǎng)絡(luò)頻繁型,
還是能一定程度提高效率的。
9. 總結(jié)
閱讀Python編寫(xiě)的代碼感覺(jué)像在閱讀英語(yǔ)一樣,這讓使用者可以專(zhuān)注于解決問(wèn)題而不是去搞明白語(yǔ)言本身。
Python雖然是基于C語(yǔ)言編寫(xiě),但是摒棄了C中復(fù)雜的指針,使其變得簡(jiǎn)明易學(xué)。
并且作為開(kāi)源軟件,Python允許對(duì)代碼進(jìn)行閱讀,拷貝甚至改進(jìn)。
這些性能成就了Python的高效率,有“人生苦短,我用Python”之說(shuō),是一種十分精彩又強(qiáng)大的語(yǔ)言。
總而言之,開(kāi)始學(xué)Python一定要注意這4點(diǎn):
1.代碼規(guī)范,這本身就是一個(gè)非常好的習(xí)慣,如果開(kāi)始不養(yǎng)好好的代碼規(guī)劃,以后會(huì)很痛苦。
2.多動(dòng)手,少看書(shū),很多人學(xué)Python就一味的看書(shū),這不是學(xué)數(shù)學(xué)物理,你看例題可能就會(huì)了,學(xué)習(xí)Python主要是學(xué)習(xí)編程思想。
3.勤練習(xí),學(xué)完新的知識(shí)點(diǎn),一定要記得如何去應(yīng)用,不然學(xué)完就會(huì)忘,學(xué)我們這行主要都是實(shí)際操作。
4.學(xué)習(xí)要有效率,如果自己都覺(jué)得效率非常低,那就停不停,找一下原因,去問(wèn)問(wèn)過(guò)來(lái)人這是為什么。