2014-09-19 166 views
10

我一直在使用亞馬遜的產品廣告API來生成包含給定書籍價格的網址。我已經生成一個網址如下:Python urllib2.HTTP錯誤:HTTP錯誤503:服務在有效網站上不可用

http://www.amazon.com/gp/offer-listing/0415376327%3FSubscriptionId%3DAKIAJZY2VTI5JQ66K7QQ%26tag%3Damaztest04-20%26linkCode%3Dxm2%26camp%3D2025%26creative%3D386001%26creativeASIN%3D0415376327

當我點擊鏈接或粘貼地址欄,網頁加載罰款上的鏈接。然而,當我執行下面的代碼我得到一個錯誤:

url = "http://rads.stackoverflow.com/amzn/click/0415376327" 
html_contents = urllib2.urlopen(url) 

的錯誤是urllib2.HTTPError:HTTP錯誤503:服務不可用。首先,我不明白爲什麼我會在網頁成功加載後出現此錯誤。

另外,我注意到另一個奇怪的行爲是下面的代碼有時做,有時不給指出錯誤:

html_contents = urllib2.urlopen("http://rads.stackoverflow.com/amzn/click/0415376327") 

我完全失去了對如何出現這種情況。有沒有解決或解決這個問題?我的目標是閱讀url的html內容。

編輯

我不知道爲什麼存在棧溢出,改變了我的代碼來改變我的代碼rads.stackoverflow我上面列出的亞馬遜鏈接。無論如何,忽略rads.stackoverflow鏈接並在引號之間使用上面的鏈接。

+0

如果我沒有弄錯,'rads.stackoverflow.com'是(或者是)一個廣告服務的SO實施,然後報廢。這很可能是有某種使用限制(引用,客戶端和什麼不是) – Germano 2014-09-19 14:27:58

+0

由於一些隨機原因,我不知道爲什麼鏈接更改爲包含堆棧溢出標記。但是,如果我在地址欄上保留複製和粘貼鏈接,則網站工作正常。 – user2548635 2014-09-19 14:31:34

+0

啊我明白了!尼斯:)這必須是SO評論解析器。 – Germano 2014-09-19 14:33:57

回答

7

這是因爲亞馬遜不允許自動訪問他們的數據,所以他們拒絕您的請求,因爲它不是來自適當的瀏覽器。如果你看看503響應的內容,它說:

To discuss automated access to Amazon data please contact [email protected] For information about migrating to our APIs refer to our Marketplace APIs at https://developer.amazonservices.com/ref=rm_5_sv , or our Product Advertising API at https://affiliate-program.amazon.com/gp/advertising/api/detail/main.html/ref=rm_5_ac for advertising use cases.

這是因爲User-Agent對Python的urllib是如此顯然不是一個瀏覽器。你總是可以假冒User-Agent,但這不是很好(或道德)的做法。

另一個答案中提到,requests庫非常適合Python中的HTTP訪問。

+0

我在查看關於使用User-Agent的聲明,並想知道是否需要按照爲urllib2添加標題的方式來執行某些操作:http://stackoverflow.com/questions/802134/changing-user- agent-on-urllib2-urlopen – user2548635 2014-09-19 15:20:45

+0

是的,這就是你如何改變用戶代理。同樣,'request'庫[這裏](http://docs.python-requests.org/en/latest/)對此更好。 – Ben 2014-09-19 15:58:47

14

亞馬遜正在拒絕urllib2的默認User-Agent。一種解決方法是使用請求模塊

import requests 
page = requests.get("http://rads.stackoverflow.com/amzn/click/0415376327") 
html_contents = page.text 

如果你堅持使用urllib2的,這是一個標題怎樣可以僞造做到這一點:

import urllib2 
opener = urllib2.build_opener() 
opener.addheaders = [('User-agent', 'Mozilla/5.0')] 
response = opener.open('http://www.amazon.com/gp/offer-listing/0415376327%3FSubscriptionId%3DAKIAJZY2VTI5JQ66K7QQ%26tag%3Damaztest04-20%26linkCode%3Dxm2%26camp%3D2025%26creative%3D386001%26creativeASIN%3D0415376327') 
html_contents = response.read() 

不要擔心計算器編輯URL 。他們解釋說他們正在做這個here

+0

出於某種奇怪的原因,鏈接更改爲包含堆棧溢出標籤。但是,如果您複製並粘貼地址欄上的鏈接,一切正常。你可以使用我的以下鏈接更新你的答案,看看它是否工作,因爲它不適合我? – user2548635 2014-09-19 14:37:38

+0

堆棧溢出壓縮較長的鏈接或可能是任何外部鏈接以清潔的方式顯示內容。這也可能沒有將實際鏈接粘貼到可以被格式化爲界面上的代碼的安全漏洞。在你真實的代碼中,把你喜歡的任何鏈接,一切都應該正常工作。 – Spade 2014-09-19 15:12:11

+0

@apadana感謝您指出。更正 – Spade 2016-04-25 20:44:55

相關問題