1.問題
目前主流的搜尋引擎,非 google 莫屬,但其對於非法(流量異常、爬蟲)請求的封鎖也是異常嚴厲
本人前段時間有個指令碼用到了谷歌搜尋,當時直接使用的是一個 python 開源專案
但在使用過程中,單 ip 的情況下爬取速度可謂感人,稍不留神還會被封,所以對於獲取谷歌搜尋結果的爬蟲有必要進行改進
本人對於Python學習建立了一個小小的學習圈子,為各位提供了一個平臺,大家一起來討論學習Python。歡迎各位到來Python學習群:960410445一起討論視訊分享學習。Python是未來的發展方向,正在挑戰我們的分析能力及對世界的認知方式,因此,我們與時俱進,迎接變化,並不斷的成長,掌握Python核心技術,才是掌握真正的價值所在。
說一說爬取谷歌搜尋結果的問題:
1.正常開啟谷歌搜尋,然後審查元素想獲取目標內容的時候,會發現是一大串js。
2.訪問過快就會出現流量異常
2.如何解決
對於第一個問題:
應該有看到審查元素出來的都是js,然後檢索的url是這樣的:
https://www.google.com.hk/search?q=hello&oq=hello&aqs=chrome..69i57j69i60l2j69i65j69i60j0.876j0j7&sourceid=chrome&ie=UTF-8&google_abuse=GOOGLE_ABUSE_EXEMPTION%3DID%3Daa946d8c657cf359:TM%3D1484917472:C%3Dr:IP%3D118.193.241.44-:S%3DAPGng0tGiKFaIr7YCaivUEmmEHOYJhG4jg%3B+path%3D/%3B+domain%3Dgoogle.com%3B+expires%3DFri,+20-Jan-2017+16:04:32+GMT
這裡解決辦法很粗暴,禁止掉js就好,讓我們看看禁止js後是什麼樣的:
然後再看url: https://www.google.com.hk/search?q=hello&btnG=Search&safe=active&gbv=1
對於這個 url ,相信機智的你應該會明白些什麼
這裡可以寫個簡單的指令碼,比如說獲取,谷歌搜尋第一頁所有結果的 html ,簡單寫下:
到了這裡,問題才剛開始,你可以做個實驗,我假設你是使用代理進行谷歌搜尋,如果你連續不斷無間隔使用谷歌搜尋某一關鍵字二三十下,不出意外你會被要求進行這樣的驗證:
這個問題可真是讓人十分厭惡,我並沒有很好的解決辦法,能做的唯有儘量避免:
1.ip輪詢 2.每次結果爬取增加休眠 3.隨機user_agent是必備
第一點和第三點不必多說,對於第二點增加休眠時間則需要我們好好地進行檢測。 假設在單ip隨機ua情況下:
1.這種情況下不休眠的話請求個兩三次就會直接被封(第二天會被解封)
2.個人覺得這不是個解決辦法,因為對休眠時間把控不好的話就會造成封ip,如果不想被封,我測試的話需要休眠60s浮動,這沒什麼意義
3.而且這種情況下發現是直接封ip,對開發者太不友好
對於這種情況,受同事神來一句,發現一個暫時的解決辦法,請看下圖:
單一ip不停地訪問統一谷歌域名自然很容易被察覺,谷歌全球190+的域名,難道都在實時的統計ip麼,可能有,但絕對不會像單域名那樣嚴格,來做個測試。
我將全球190+谷歌域名集中起來,像ua一樣隨機輪換,然後進行測試(單ip),結果還不錯:
1.首先沒有出現被封ip,只會提示流量異常
2.還是需要休眠,本人休眠5~15s沒有被封過,可根據自身情況來,如果想穩妥點就5~30s吧
我將這些寫成了一個專案,magic_google-python,若你是phper,可以看看我寫的php版本php-google,具體程式碼可以看這裡,對應的功能很簡單:
3.總結
對google搜尋結果的爬取,有以下建議:
1.ip輪詢
2.ua隨機
3.domain隨機
4.休眠
原始碼已開源在GitHub,有興趣可檢視原始碼:https://github.com/howie6879/magic_google