閱讀436 返回首頁    go 阿裏雲 go 技術社區[雲棲]


數據抓取的藝術(三):抓取Google數據之心得

 本來是想把這部分內容放到前一篇數據抓取的藝術(二)數據抓取程序優化》之中。但是隨著任務的完成,我越來越感覺到其中深深的趣味,現總結如下:

   (1)時間
     時間是一個與抓取規模相形而生的因素,數據規模越大,時間消耗往往越長。所以程序優化變得相當重要,要知道抓取時間越長,出錯的可能性就越大,這還不說程序需要人工幹預的情境。一旦運行中需要人工幹預,時間越長,幹預次數越多,出錯的幾率就更大了。在數據太多,工期太短的情況下,使用多線程抓取,也是一個好辦法,但這會增加程序複雜度,對最終數據準確性產生一定影響。
     所以,千萬不能看不起小小的調優,那怕隻是0.02秒一次的改進,對於上萬乃至千萬級別的數據量而言,都可以節省數小時甚至數天的時間,同時也能在某種程度上降低出錯的概率。於是,我得出一個原則:“程序優化要力求極致”。
     這是“軟”的因素。

   (2)效率
      嗬嗬,效率可以被視為是時間的另一種說辭,雖然這種說法並不全麵。在這裏我所謂的效率,指的是I/O效率。一旦算法優化已經完善,那麼還有什麼可以提高效率以縮短程序完成的時間呢?這回抓取,我使用的是SSD硬盤,與實驗室的機械硬盤相比(可惜用的是筆記本),速度得到了明顯的提升。
     我感覺以後處理大規模數據(或“大數據”),需要使用內存數據庫。首先,使用數據庫而非Excel就已經能夠提高效率,如果再采用內存數據庫的話,效率將得到更大幅度的攀升。當然,如果你機器內存足夠大的話,可以試試Redis。
     SSD硬盤與內存數據庫是特別重要的兩個方麵。但我們也不能忽略CPU,一個好的CPU就是一顆“強勁的心”,但是筆記本的CPU一般都做過“調優”(想想吧:有限的電力,為了延時,隻好吃一口“藍色小丸藥”),我覺得I3處理器性能有些低下,如果不是I5+還不如直接用奔騰雙核結構。當然最好是運行在台式機、工作站、服務器甚至雲係統中。嘿嘿,下次我要試試Sae。
     這是“硬”的因素。

   (3)了解你的對手
     常言道,知己知彼百戰不殆。做數據抓取,最重要的就是了解你的對手。這一輪,我很倒黴,我碰到了Google姐,由於我的數據隻能從Google上析出,所以沒的選擇,不過雖說她也把我折騰地夠嗆,但最終我還是享受到了“神秘的”幸福。
     這是“人”(目標對手)的因素。
     八卦一下我和Google姐一夜大戰的六個回合吧。
     第一回合,簡單地使用urllib2或其它庫是不行的,我的血淚史說明,搜索超不過8個Google就強行和你失去連接了。重新搜這幾個還可以,但接著第8個往後走,她就又不幹了,還是不能連接。姐姐一臉壞笑地看著我,就這點小把戲,還想過來扒我褲子?我十分汗顏,責怪自己沒能正確估計出她那雄壯的腰圍。
     第二回合,我開始設計欺騙Google。由於人類訪問網站,不會有極短而均勻的點擊行為,所以我設計了一個小函數,每次搜索完畢,隨機暫停1~3秒,這是在模仿人的訪問模式。不幸再次降臨到我身上,姐姐的壞笑依舊,我也沒能觸動到她的一根毫毛。
     第三回合,我生氣了。我準備上代理,我的戰術很簡單,弄一大堆代理站成一隊,排得一眼望不到邊,失去連接我就換一個代理,再失去就再換,嚇死她!結果這條路仍沒走通,這種硬碰硬的方式不是好方式,姐姐其實是過來人,從小嚇大的,這招沒用:一方麵是我找到的可用代理IP實在有限,根本不夠換的;另一方麵,代理的引入大大增加了程序出錯的可能性,因為代理本來就不都靠譜。好幾次,不是Google斷掉的而是代理跑著跑著給斷的。
     第四回合,我沒氣可生了。我開始深入研究,靜下心來耐心學習這個領域的知識,仔細欣賞、研究Google這個熟女。功夫不負有心人,我找到了終極解決方案:瀏覽器。不必再模擬手工行為(Mechanize),咱就直接用瀏覽器訪問,看她還有什麼話說。其實這樣的方法很多,核心就是使用測試工具。所以你也可以使用selenium或Windmill,也可以使用QT+Webkit等等就不一一列舉了。當然,我用的是Selenium+Phantomjs+BeautifulSoup,後來想想也不用BS,直接正則算了,但畢竟BS比較簡單哈。
     第五回合,我編寫好程序,進行優化,特意選擇深夜悄然開始執行。我用的校園網,晚上網速極快,所以嗖嗖地抽取出結果,但有個問題,就是Google對單IP短時持續訪問請求是有限製的,這個限製不論是蜘蛛還是人都繞不開,她會證
給你一個填寫驗碼的證明頁麵,上書“不能未婚先孕”,到街道辦開了證明才能讓你繼續。唉,對此,一開始,太年輕,真沒什麼辦法,隻能在程序中識別這個頁麵,然後保存結果退出。再重新啟動繼續這個斷點接著執行。不過由於每隔70、80個就會因驗證碼頁麵停掉一次,我的抓取速度一直不高,因為需要手工幹預。
     [虛擬第六回合,我用一個新線程執行抓取,當這個線程遇到驗證碼時,保存、退出並回饋斷點參數,然後帶入參數重啟一個新的線程。時間原因,還沒如此實現。]
     第六回合,較長的抓取時間,我在傻傻等待,時不時斷點續抓一次。我受不了了,我開始做點其他的事情,比如瀏覽新聞、聽聽音樂、看看電影什麼的。終於,我發現,竟然碰不到驗證碼頁麵了。這點十分驚喜,仔細研究了這個過程,我得出結論,抓取時其他程序對抓取程序網速的影響,正好讓Google認為這似乎就是人在搜索,所以從95個左右開始,到最後的152個的共詞搜索,還是那個程序,但由於我的其他休閑活動導致後半程一次都沒有遇到驗證碼。Oh Yeah~神馬重啟一個新線程,NND都是浮雲,一邊爬取數據一邊輕鬆生活才是王道。(隻是別因下片把網速全占滿了,使你的抓取程序一直處於一個等待狀態,就像《潛伏》最後一幕一樣,翠平抱著孩子一直在等待一個永遠不能歸來的人)。所以要向普天下的男人們大聲說:不要那麼直接,一上來就隻知道抓,一起多看看電影、多聽聽歌,效果會更好!難道不是麼?

      最後,我站在高崗上,手握著Google的內褲,讓它盡情隨風舞動......
      這就是技術,這也是生活!

最後更新:2017-04-03 18:51:59

  上一篇:go 百度360騰訊競購搜狗
  下一篇:go 基於bootstrap實現可視化布局工具