2009-03-01 127 views
17

考慮以下Python代碼:爲什麼Google搜索會返回HTTP錯誤403?

 
30 url = "http://www.google.com/search?hl=en&safe=off&q=Monkey" 
31 url_object = urllib.request.urlopen(url); 
32 print(url_object.read()); 

當此運行,引發異常:

File "/usr/local/lib/python3.0/urllib/request.py", line 485, in http_error_default 
    raise HTTPError(req.get_full_url(), code, msg, hdrs, fp) 
urllib.error.HTTPError: HTTP Error 403: Forbidden 

然而,當這個被放入瀏覽器,搜索將返回預期。這裏發生了什麼?我該如何克服這個問題,才能以編程方式搜索Google?

有什麼想法?

回答

24

如果您想通過編程界面「正常」進行Google搜索,請查看Google APIs。這不僅是搜索Google的官方方式,如果Google更改其結果頁面佈局,它們也不可能發生變化。

0

你經常這樣做。谷歌有限制的地方,以防止被搜索機器人淹沒。您也可以嘗試將用戶代理設置爲更接近普通瀏覽器的東西。

+0

我今天只試過兩次。 – AgentLiquid 2009-03-01 21:21:35

+1

錯誤的答案。它阻止了第一次嘗試。 – nosklo 2009-03-01 21:28:23

+1

這是正確的用戶代理使所有的區別。 – Evgeny 2009-08-23 07:17:20

22

這應該做的伎倆

user_agent = 'Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9.0.7) Gecko/2009021910 Firefox/3.0.7' 

url = "http://www.google.com/search?hl=en&safe=off&q=Monkey" 
headers={'User-Agent':user_agent,} 

request=urllib2.Request(url,None,headers) //The assembled request 
response = urllib2.urlopen(request) 
data = response.read() // The data u need 
1

由於lacqui suggestedGoogle API's是他們想要你做的代碼請求的方式。不幸的是,我發現他們的文檔針對的是編寫AJAX網頁的人,而不是製作原始的HTTP請求。我使用LiveHTTP Headers來跟蹤樣本製作的HTTP請求,並且我發現ddipaolo's blog post有幫助。

還有一件事讓我感到困惑:它們將您限制在查詢中的前64個結果。如果您只是向網絡用戶提供搜索框,通常不會造成問題,但如果您嘗試使用Google進行數據挖掘則無濟於事。我想他們不希望你使用他們的API進行數據挖掘。這64位數字隨着時間的推移發生了變化,並因搜索產品而異

更新:看來他們絕對不希望你去數據挖掘。最終,你得到一個403錯誤,並鏈接到這個API access notice

請查看您正在使用的API的使用條款(鏈接在右側邊欄中)並確保合規。我們很可能因下列其中一項使用條款違規而阻止您:我們收到了自動請求,例如抓取和預取。自動請求被禁止;所有請求都必須作爲最終用戶操作的結果。

他們還列出其他違規行爲,但我認爲這是觸發我的。我可能需要調查雅虎的BOSS服務。它似乎沒有太多限制。

相關問題