爬蟲筋粗,幾家歡喜幾人愁策橘。爬者,拿到有利數(shù)據(jù)娜亿,分析行為丽已,產生價值。被爬者买决,一是損失數(shù)據(jù)沛婴,二是遇到不懷好意的爬蟲往往被全站復制或服務器受沖擊而無法服務。今天說的是一只友好的爬蟲是如何構建出來的督赤,請勿用它傷害他人嘁灯。
爬蟲一生所遇
俗話說,如果我比別人看得遠些,那是因為我站在巨人們的肩上躲舌。前人之鑒,后人之師丑婿。小爬蟲在胎教的時候就該傳授它的前輩參悟的人生經(jīng)驗,了解網(wǎng)絡的可怕之處孽糖】莞裕看看我提供的胎教課程:
- 被爬網(wǎng)站偶然出現(xiàn)服務無法響應,需重試
- 網(wǎng)站檢查某些header办悟,特別是referer這個參數(shù),請警惕
- 訪問頻率限制滩褥,短時間單IP或者單帳號內往往有頻率限制病蛉。更高級的還可能用近段時間訪問頻率,時間段請求頻率來識別爬蟲行為。
- 目標爬取網(wǎng)站需要登錄
- 網(wǎng)站采用js運算產生最終頁面
小爬蟲身份成謎
爬蟲如此泛濫铺然,網(wǎng)站安能不防備俗孝,識別之,封禁之爬蟲就無可奈何了魄健。你問該如何做赋铝?我們從tcp/ip的角度來看,網(wǎng)站可以識別到ip地址沽瘦。那么如此說來革骨,網(wǎng)站封的很有可能就是ip地址。網(wǎng)絡上可是有代理服務器這種可怕東西存在的析恋,爬蟲依靠代理服務器偽裝身份良哲,一旦被封禁,換代理又可以愉快的玩耍了助隧。
代理服務器那里來筑凫?這種東西,用搜索引擎一搜索就有了并村。如果你想省時省力巍实,直接購買。然而在手頭拮據(jù)的時候哩牍,只能尋找一些免費的代理棚潦。一般來說每個網(wǎng)站都會提供一點點免費代理,我們只要勤快定時定后抓取入庫即可姐叁,集腋成仇瓦盛。
千萬不要相信代理服務器就是可用的,要定時檢查入庫的代理是否有用外潜,除了定時檢查之外原环,我們還可以借助squid,我們只要把代理往里面一丟处窥,爬蟲代理直接設置成squid的ip和端口嘱吗,這貨就會自動挑選可用代理來使用,省了自己定時檢測滔驾。
題外話:免費的往往是最貴的谒麦,特別ip,帶寬這種資源哆致。網(wǎng)上提供的代理往往會注入一些廣告js等東西绕德,這個自己想解決方案了。
一個堅持不懈的爬蟲
一只爬蟲的最高境界就是全自動化摊阀,無需人為干預耻蛇,不過這種事情想想即可踪蹬,不可能實現(xiàn)的。但是小爬蟲也有自己的修養(yǎng)的臣咖,最起碼在各種異常面前不能一次就退縮了吧跃捣,出錯重試多次是必須的,最重要的是出現(xiàn)異常進程不能中斷夺蛇,任務還是得接著完成的疚漆。
最簡單的方法是什么呢?在循環(huán)里面搞一個try catch刁赦,是不是完美呢娶聘?大伙來看看這個例子:
然而這樣子寫是不道德,最重要的還不夠優(yōu)雅截型,所以再看看下面這個例子:
應該分別抓取各種錯誤來分別處理趴荸,因為各種出錯的應對策略是不一樣的。
小爬蟲也需要團隊作戰(zhàn)
假如說宦焦,某一天爬蟲接到任務发钝,一天之內要爬取100萬個網(wǎng)頁。假設一個網(wǎng)頁需要10秒波闹,單進程單線程的爬蟲是沒法實現(xiàn)的酝豪。這個時候我們可以利用下面幾個方案:
- 多線程(然而對于python來說有GIL問題,所以優(yōu)勢不明顯)
- 多進程精堕,一旦使用多進程就需要解決任務分配問題孵淘,和進程管理問題,這個時候我們可以使用消息中間件來分配任務歹篓,簡簡單單上一個redis隊列瘫证,問題就迎刃而解了。
- 爬蟲集群庄撮,任務分配依舊可以使用消息中間件背捌,而部署我們可以使用偉大的docker,環(huán)境都無需配置了洞斯。
爬蟲與瀏覽器的愛恨情愁
有很多網(wǎng)站呢毡庆,要么登錄的時候需要提交一些js計算后的值。有些數(shù)據(jù)還要js處理生成烙如,如果我們的爬蟲要模擬js來運算么抗,還得針對每一個網(wǎng)站進行處理,這可一點都不優(yōu)雅亚铁。
那么咋辦呢蝇刀?最簡單的方案是,既然我們的瀏覽器能渲染徘溢,那么我們就去調用瀏覽器來拿到最終頁面嘛熊泵,平時那些稀奇古怪的交互也一并解決了仰迁。對于python來說甸昏,調用瀏覽器一點難度都沒有顽分,因為有神器selenium。
selenium可以很方便的使用python與谷歌呀火狐呀PhantomJS等這些瀏覽器交互施蜜,缺點是只是模擬了GET請求卒蘸,也許你會說不是可以執(zhí)行ajax,聽我一句勸翻默,你會被跨域請求坑住的缸沃。為了實現(xiàn)其它請求請再上一個庫selenium-requests,然而這庫的使用方法請查考requests修械,文檔這樣子也是無奈趾牧。
小爬蟲優(yōu)雅架構
爬蟲與反爬蟲的較量是長久的,爬取過程千萬要注意抓取頁面異常的情況肯污,觸發(fā)反爬蟲預警達到一定次數(shù)翘单,帳號或者IP就會被凍結。模擬登陸驗證碼識別可以借助第三方平臺蹦渣,起碼比自己寫的驗證碼識別高效得多哄芜。