一只優(yōu)雅的小爬蟲誕生記

爬蟲,幾家歡喜幾人愁。爬者,拿到有利數(shù)據(jù),分析行為,產(chǎn)生價值。被爬者,一是損失數(shù)據(jù),二是遇到不懷好意的爬蟲往往被全站復(fù)制或服務(wù)器受沖擊而無法服務(wù)。今天說的是一只友好的爬蟲是如何構(gòu)建出來的,請勿用它傷害他人。

爬蟲一生所遇

俗話說,如果我比別人看得遠些,那是因為我站在巨人們的肩上。前人之鑒,后人之師。小爬蟲在胎教的時候就該傳授它的前輩參悟的人生經(jīng)驗,了解網(wǎng)絡(luò)的可怕之處??纯次姨峁┑奶ソ陶n程:

  • 被爬網(wǎng)站偶然出現(xiàn)服務(wù)無法響應(yīng),需重試
  • 網(wǎng)站檢查某些header,特別是referer這個參數(shù),請警惕
  • 訪問頻率限制,短時間單IP或者單帳號內(nèi)往往有頻率限制。更高級的還可能用近段時間訪問頻率,時間段請求頻率來識別爬蟲行為。
  • 目標(biāo)爬取網(wǎng)站需要登錄
  • 網(wǎng)站采用js運算產(chǎn)生最終頁面

小爬蟲身份成謎

爬蟲如此泛濫,網(wǎng)站安能不防備,識別之,封禁之爬蟲就無可奈何了。你問該如何做?我們從tcp/ip的角度來看,網(wǎng)站可以識別到ip地址。那么如此說來,網(wǎng)站封的很有可能就是ip地址。網(wǎng)絡(luò)上可是有代理服務(wù)器這種可怕東西存在的,爬蟲依靠代理服務(wù)器偽裝身份,一旦被封禁,換代理又可以愉快的玩耍了。

代理服務(wù)器那里來?這種東西,用搜索引擎一搜索就有了。如果你想省時省力,直接購買。然而在手頭拮據(jù)的時候,只能尋找一些免費的代理。一般來說每個網(wǎng)站都會提供一點點免費代理,我們只要勤快定時定后抓取入庫即可,集腋成仇。

千萬不要相信代理服務(wù)器就是可用的,要定時檢查入庫的代理是否有用,除了定時檢查之外,我們還可以借助squid,我們只要把代理往里面一丟,爬蟲代理直接設(shè)置成squid的ip和端口,這貨就會自動挑選可用代理來使用,省了自己定時檢測。

題外話:免費的往往是最貴的,特別ip,帶寬這種資源。網(wǎng)上提供的代理往往會注入一些廣告js等東西,這個自己想解決方案了。

一個堅持不懈的爬蟲

一只爬蟲的最高境界就是全自動化,無需人為干預(yù),不過這種事情想想即可,不可能實現(xiàn)的。但是小爬蟲也有自己的修養(yǎng)的,最起碼在各種異常面前不能一次就退縮了吧,出錯重試多次是必須的,最重要的是出現(xiàn)異常進程不能中斷,任務(wù)還是得接著完成的。

最簡單的方法是什么呢?在循環(huán)里面搞一個try catch,是不是完美呢?大伙來看看這個例子:

一個簡單粗暴的方式

然而這樣子寫是不道德,最重要的還不夠優(yōu)雅,所以再看看下面這個例子:

優(yōu)雅的錯誤處理

應(yīng)該分別抓取各種錯誤來分別處理,因為各種出錯的應(yīng)對策略是不一樣的。

小爬蟲也需要團隊作戰(zhàn)

假如說,某一天爬蟲接到任務(wù),一天之內(nèi)要爬取100萬個網(wǎng)頁。假設(shè)一個網(wǎng)頁需要10秒,單進程單線程的爬蟲是沒法實現(xiàn)的。這個時候我們可以利用下面幾個方案:

  • 多線程(然而對于python來說有GIL問題,所以優(yōu)勢不明顯)
  • 多進程,一旦使用多進程就需要解決任務(wù)分配問題,和進程管理問題,這個時候我們可以使用消息中間件來分配任務(wù),簡簡單單上一個redis隊列,問題就迎刃而解了。
  • 爬蟲集群,任務(wù)分配依舊可以使用消息中間件,而部署我們可以使用偉大的docker,環(huán)境都無需配置了。

爬蟲與瀏覽器的愛恨情愁

有很多網(wǎng)站呢,要么登錄的時候需要提交一些js計算后的值。有些數(shù)據(jù)還要js處理生成,如果我們的爬蟲要模擬js來運算,還得針對每一個網(wǎng)站進行處理,這可一點都不優(yōu)雅。

那么咋辦呢?最簡單的方案是,既然我們的瀏覽器能渲染,那么我們就去調(diào)用瀏覽器來拿到最終頁面嘛,平時那些稀奇古怪的交互也一并解決了。對于python來說,調(diào)用瀏覽器一點難度都沒有,因為有神器selenium。

selenium可以很方便的使用python與谷歌呀火狐呀PhantomJS等這些瀏覽器交互,缺點是只是模擬了GET請求,也許你會說不是可以執(zhí)行ajax,聽我一句勸,你會被跨域請求坑住的。為了實現(xiàn)其它請求請再上一個庫selenium-requests,然而這庫的使用方法請查考requests,文檔這樣子也是無奈。

小爬蟲優(yōu)雅架構(gòu)

優(yōu)雅的小爬蟲架構(gòu)圖

爬蟲與反爬蟲的較量是長久的,爬取過程千萬要注意抓取頁面異常的情況,觸發(fā)反爬蟲預(yù)警達到一定次數(shù),帳號或者IP就會被凍結(jié)。模擬登陸驗證碼識別可以借助第三方平臺,起碼比自己寫的驗證碼識別高效得多。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 179,045評論 25 709
  • Vector繼承自Vector,Stack是棧。它的特性是:先進后出(FILO, First In Last Ou...
    MrLuo閱讀 194評論 0 0
  • 生活是什么也許是滿身的疲憊是無盡的等待或許又是對成功的渴望我們不知道什么時候才能長大不知道什么時候才會熬過又苦又累...
    過往不戀吧閱讀 135評論 0 1
  • 最近嘗試了件新鮮事兒——作一名演講俱樂部活動主持人。因為前期對主持沒什么概念和經(jīng)驗,嘗試三次后,很有些感觸。于是總...
    袁春楠閱讀 1,046評論 3 17

友情鏈接更多精彩內(nèi)容