爬蟲--技術棧

1.熟悉Python大部分的API

這是爲了能夠更好的處理程序所必須花費的代價。
對我來說我很熟悉Java,那麼python就類比着瞭解。

2.批處理序列化

在爬取一本漫畫時,非常的耗時。
需要將任務分成任務隊列。
常用的任務隊列有kafkabeanstalkdcelery等。

3.靈活&熟練1門最火的開源的數據庫技術

有時候一些小數據也可以保存成json或者csv等。我有時想抓一些圖片就直接按照文件夾保存文件。

推薦使用NoSQL的數據庫,比如mongodb,因爲爬蟲抓到的數據一般是都字段-值得對應,有些字段有的網站有有的網站沒有,mongo在這方面比較靈活,況且爬蟲爬到的數據關係非常非常弱,很少會用到表與表的關係。

4.熟悉編譯前端的技術

xpath,Regex。自不必說。

5.蒐集關於HTTP相關的內容

最典型的就是請求頭fake-header。最好將資源彙總到博客或github。

6.瞭解應對措施&知己知彼

爬蟲與反爬

這同樣是很深的一個話題,就像攻擊武器與防禦武器一樣,雙方總是在不斷升級。常見的反爬措施(我遇到過的)有下面幾種:

1.訪問頻率

很好理解,如果訪問太頻繁網站可能針對你的ip封鎖一段時間,這和防DDoS的原理一樣。對於爬蟲來說,碰到這樣的限制一下任務的頻率就可以了,可以儘量讓爬蟲想人類一樣訪問網頁(比如隨機sleep一段時間,如果每隔3s訪問一次網站很顯然不是正常人的行爲)。

2.登錄限制

也比較常見。不過公開信息的網站一般不會有這個限制,這樣讓用戶也麻煩了。其實反爬措施都或多或少的影響真實用戶,反爬越嚴格,誤殺用戶的可能性也越高。對爬蟲來說,登錄同樣可以通過模擬登錄的方式解決,加個cookie就行了(話又說回來,網絡的原理很重要)。

3.通過Header封殺

一般瀏覽器訪問網站會有header,比如Safari或者Chrome等等,還有操作系統信息。如果使用程序訪問並不會有這樣的header。破解也很簡單,訪問的時候加上header就行。

4.JavaScript腳本動態獲取網站數據

有一些網站(尤其是單頁面網站)的內容並不是通過服務器直接返回的,而是服務器只返回一個客戶端JavaScript程序,然後JavaScript獲取內容。更高級的是,JavaScript在本地計算一個token,然後拿這個token來進行AJAX獲取內容。而本地的JavaScript又是經過代碼混淆和加密的,這樣我們做爬蟲的通過看源代碼幾乎不可能模擬出來這個請求(主要是token不可能破解),但是我們可以從另一個角度:headless的瀏覽器,也就是我們直接運行這個客戶端程序,這可以100%地模擬真實用戶!

5.驗證碼

這幾乎是終極武器了,驗證碼是專門用來區分人和計算機的手段。對於反爬方來說,這種方式對真實用戶和搜索引擎(其實可以通過記錄搜索引擎爬蟲的ip來區別對待,可以解決)的危害比較大,相信讀者都有輸入驗證碼的痛苦經歷。但這種方法也並不是無敵的!通過現在很火的機器學習可以輕鬆的識別大部分的驗證碼!Google的reCAPTCHA是一種非常高級的驗證碼,但是聽過通過模擬瀏覽器也是可以破解的。

6.ip限制

網站可能將識別的ip永久封殺,這種方式需要的人力比較大,而且誤傷用戶的代價也很高。但是破解辦法卻非常簡單。目前代理池幾乎是搞爬蟲的標配了,甚至還有很多高匿代理等好用的東西。所以這基本上只能殺殺小爬蟲。

7.網站內容反爬

有一些網站將網站內容用只有人類可以接收的形式來呈現(其實反爬就是區別對待人類和機器嘛)。比如將內容用圖片的形式顯示。但是近幾年來人類和機器的差別越來越小,圖片可以用OCR準確率非常高地去識別。

7.職業道德

成規模的爬蟲一般都會使用集羣,一般的小網站服務器規模可能不如爬蟲集羣的規模大。所以很多時候我們最好對要爬的網站限制一下頻率。否則這些爬蟲就相當於DoS攻擊集羣了!一般的網站都會有robots.txt可以參考。


作者:xlzd
鏈接:https://www.zhihu.com/question/36832667/answer/73237444
來源:知乎
著作權歸作者所有。商業轉載請聯繫作者獲得授權,非商業轉載請註明出處。

那些給你安利什麼gevent/xpath什麼的人,一定沒有寫過爬千萬級或者億級以上數據量的爬蟲。按照你的需求,你有1500萬條數據需要抓取,這1500萬條數據分佈在100萬頁網頁中。那麼,從以下幾個方面給題主一點建議。首先,存儲的問題,爬蟲的數據,尤其到了一個比較大的兩極,sqlite3這種文件型的數據庫最好不要用了,建議使用MongoDB做存儲,簡單實用,方便拓展爬蟲的數據。其次,如果可以,將這100萬頁頁碼分解成100萬個任務,放到一個MessageQueue中。接着,在寫程序的時候,不要考慮任何多線程多進程gevent或者任何會讓你的程序“提速”的東西,你的爬蟲只要完成一個簡單的功能:接受一個輸入,這裏就是某一頁的頁碼,得到的輸出是這一頁的15條數據,最好直接存儲到數據庫中。最後一步,將上兩步具體實現,建議使用RabbitMQ或者ActiveMQ,然後在上一步的接受輸入變成從Queue中取一條任務。如果源網站不會因爲訪問頻率過高而封你的IP,那麼你可以在一臺機器上多部幾個爬蟲實例,否則的話,你可以將你的代碼部署到多臺機器上。阿里雲按時間付費的機器很便宜,你可以開多點機器以加快速度。這樣的好處是,你可以隨時新增或減少一個爬蟲實例,而不會影響之前已經部署的任何爬蟲,也可以隨時將抓取失敗的頁碼數再次放入Queue中,而不影響正在抓取任務的爬蟲。最後,如果你按照這樣的思路完成,你只需要寫爬蟲和搭建MessageQueue,它們之間的交互已經有了現成的庫xtls可以幫你:pypi: https://pypi.python.org/pypi/xtls/文檔:xtls: awesome tools by xlzdgithub:xlzd/xtls · GitHub


ssl認證:模擬瀏覽器

代理池:request:可以填


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章