13161216443

您所在位置: 首頁> 學習課程> python培訓 | Python網絡爬蟲技術經驗淺談

python培訓 | Python網絡爬蟲技術經驗淺談

發布百知教育 來源:學習課程 2019-11-18

關于什么是網絡爬蟲我就不在這里詳細介紹了,如果你不知道,那后面的文字你可能看不懂。


我是2018年7月份開始自學Python然后做網絡爬蟲的,到今天2019年11月17日,一年多點的經驗。在這里我想談點我的經驗,拋磚引玉。


在搜索引擎上搜網絡爬蟲,出來的絕大多數都是Python培訓相關的廣告。搞網絡爬蟲,基本上大家都首選Python編程語言。我想原因無非就是Python更簡單易學,代碼量更小。如果你完全沒有編程基礎,想學習編程,選擇學習Python可能更適合,因為它最簡單,更接近于英語的自然表達。如果Python都學不會,那么其它的Java之類的就更不可能學會了。如果你不想專業從事IT職業,只想學習了解一下,或者只想學點代碼解決工作中遇到的問題,那么Python也很適合,Python有大量的開源庫可以利用,比如說Pandas用來處理Excel數據等??傊?,開發網絡爬蟲其實用很多語言都可以實現,用Java可以,JavaScript(Node.js)可以,Go也可以,甚至是被調侃為世界上最好的言語的PHP都可以,但基本上都沒有Python更簡單。


這段時間從新聞上看到房地產大老板潘石屹都在學習Python,人家超級富豪而且五十多的人了都在學習,說明Python入門簡單而且這門編程語言很有用,越是有錢的人越更愛學習越努力。我去年因為工作需要開始自學Python,把Python當做我的第二開發語言,感覺還好。


言歸正傳。搞網絡爬蟲開發,首先得了解網絡爬蟲的技術原理。其實網絡爬蟲的技術原理很簡單,無非就是http或https協議,通過代碼發GET或POST請求,得到網頁代碼,然后解析HTML、JavaScript或其它資源,然后獲取到想要的數據,然后保存,就這么回事。了解了原理,那么你用什么編程語言就不重要了。網絡爬蟲開發的難點主要是突破各種反爬蟲的技術,比如說驗證碼、封殺IP、Cookie識別、網絡字體、JavaScript渲染等。


以下是我常用的Python庫或軟件:Request、Scrapy、lxml、selenium、Redis、Mongodb


我用的Python版本是3.7


Request庫:簡單的爬蟲,用Request + lxml就夠了,Request 用來發送HTTP請求,lxml用來解析HTML以便提取數據。


Scrapy:如果爬蟲規模較大,強調抓取速度,就可能需要Scrapy了。當然你自己寫異步方法也可以加快抓取速度,但不如直接用Scrapy方便。


Selenium:如果你要抓取的網頁是大量使用了JavaScript前端渲染的頁面,則可能需要Selenium了。Selenium操控chrome瀏覽器,無頭瀏覽器的模式在服務器上也是可以的。少量使用了JavaScript的網頁,用PyExecJS也可以搞定,不需要上Selenium。


Redis:Redis主要是用于網址去重。Redis可以結合Scrapy做分布式爬取。


MongoDB:MongoDB用于數據保存。我不建議用MySQL這類關系數據庫,因為爬蟲提取出來的數據比較亂,使用MySQL的話,一旦需要新增字段或刪除字段,或者字段需要變更長度和類型,數據量大的情況下MySQL就比較麻煩了,而Mongodb則很靈活,所以強烈推薦MongoDB用來保存爬蟲數據。


一般的小網站,基本上沒什么反爬蟲的手段,很容易就可以爬取。大型商業網站一般都有反爬蟲措施,爬取難度就大大提高了。爬蟲與反爬蟲是矛與盾的關系,想要穩定的爬取到數據,就必須了解反爬蟲技術,這樣才能有針對的去突破網站的反爬蟲技術。下面談談商業網站的反爬蟲技術。一般來說,商業網站的反爬蟲技術會有以下這些:


一、封鎖IP

封鎖IP是常見的反爬蟲措施。網站檢測到某個IP短時間請求了大量的網頁,就封禁IP,這是最簡單的辦法。網站一般會使用Redis這類緩存,記錄每個IP訪問的網頁,如果發現某個IP在一定的時間段內瀏覽的網頁數量較大,則列入黑名單禁止訪問,當然這個黑名單一般都是設置了有效期的,如果是長期的話黑名單就會越來越大。


突破IP封鎖的辦法要么就是降低爬蟲的瀏覽速度,要么更換User-Agent,要么就是使用網絡代理。


搞爬蟲還是抓取速度建議不要太快,萬一把人家服務器搞癱瘓,是要負法律責任的,有可能會坐牢。我建議請求網頁都設置個時間延遲,不要給目標網站的服務器造成太大壓力。


無論是瀏覽器還是爬蟲程序,在向服務器發起網絡請求的時候,都會發過去一個頭文件:headers 這里面的大多數的字段都是瀏覽器向服務器”表明身份“用的,其中一個重要的字段就是User-Agent。一個局域網里面的很多電腦,IP地址都是一樣的,網站如果只是簡單的封鎖IP,會導致誤殺很多用戶,所以網站可以采用IP + User-Agent結合的辦法來封殺。爬蟲對每個請求都隨機更換User-Agent,甚至偽裝成百度或搜狗的爬蟲,也可以降低被反爬蟲措施識別的概率。


關于爬蟲的代理,我不建議使用自建代理IP池,用代理隧道更合適。


二、JavaScript渲染內容

普通的HTML網頁提取就太簡單了,會點XPath技術就可以搞定。但是如果網頁上有JavaScript渲染內容,這時候怎么辦呢?簡單的可以用PyExecJS,復雜的就只能模擬瀏覽器了,用Selenium這類工具。


三、Cookie限制

用戶第一次訪問網頁,網站就會設置個Cookie來識別用戶,當網站識別到某個Cookie訪問過頻,就會封殺。


爬蟲的解決辦法可以用Redis這類內存數據庫建立一個Cookie池,爬蟲訪問的時候隨機更換cookie,這樣而已可以降低被反爬蟲措施識別的概率。


四、檢測用戶行為

網站可以利用JavaScript識別用戶打開網頁后是否有滾動,是否鼠標滑過某個區域等。


爬蟲的解決辦法也很簡單,利用Selenium這類工具模擬瀏覽器訪問,打開網頁后做一些滾動這類操作,就可以繞過這類反爬蟲手段。


五、驗證碼

驗證碼是最難解決的反爬蟲手段。一般的文字驗證碼可以使用百度或阿里云的免費文字識別接口搞定,也可以使用TensorFlow這類工具來自己訓練驗證碼識別模型搞定,如果是很復雜的驗證碼,估計就無能為力了。至于有些驗證碼需要滑動軌跡之類的,人眼觀看都困難,這就更難了。

六、文字顯示成圖片

有些網站會把重要數據用圖片顯示,不是直接顯示成文字。


解決辦法也很簡單,用圖片文字識別工具搞定。百度、阿里云等都有圖片文字識別接口。


七、CSS ::before 偽元素混淆

有些網站的反爬蟲措施比較高明,利用CSS ::before 偽元素混淆,你在HTML里面提取到的是假數據,二它用CSS ::before 偽元素顯示出來的才是真數據。解決辦法:找它的CSS ::before 偽元素混淆規律,研究它的混淆是什么規則,就可以突破。


八、JavaScript混淆給假數據

這個跟CSS ::before 偽元素混淆很相似,通過JavaScript來混淆,你在HTML里面提取到的很可能是假數據。解決辦法:也是需要找到混淆的規律。


九、自定義網絡字體

這個也是跟CSS ::before 偽元素混淆和JavaScript混淆很相似,自定義網絡字體也是很有用的反爬蟲辦法。解決辦法:也是需要找自定義網絡字體的規律。爬蟲與反爬蟲的攻與防無非就是


上面這些手段,詳細的爬蟲方法以后會繼續展開介紹,敬請關注。最難搞定的是復雜的驗證碼。當然有復雜驗證碼的網站也不是完全沒有辦法,畢竟驗證碼太復雜,跳出驗證碼太頻繁,這也會導致網站的用戶體驗太差,所以一般只要經常換IP、換User-Agent、換Cookie,速度降低一些,時間長一點還是能爬取到數據的。


在最后我想提醒的是,搞爬蟲還是不要竭澤而漁,不要拼命的抓取影響人家網站的正常運作,不要去碰隱私數據,否則就違法了。


python培訓:http://www.akpsimsu.com/python2019



上一篇:java培訓 | 測試 props,掛載函數和快照測試

下一篇:應屆生去公司找個Java程序員的職位需要什么技能?

相關推薦

www.akpsimsu.com

有位老師想和您聊一聊

關閉

立即申請