Python urllib2.HTTPError:HTTP错误503:服务在有效网站上不可用

时间:2014-09-19 14:16:59

标签: python urllib2

我一直在使用亚马逊的产品广告API来生成包含给定图书价格的网址。我生成的一个网址如下:

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

当我点击链接或粘贴地址栏上的链接时,网页加载正常。但是,当我执行以下代码时,我收到一个错误:

url = "http://www.amazon.com/gp/offer-listing/0415376327%3FSubscriptionId%3DAKIAJZY2VTI5JQ66K7QQ%26tag%3Damaztest04-20%26linkCode%3Dxm2%26camp%3D2025%26creative%3D386001%26creativeASIN%3D0415376327"
html_contents = urllib2.urlopen(url)

错误是 urllib2.HTTPError:HTTP错误503:服务不可用。首先,我不明白为什么我甚至会因为网页成功加载而出现此错误。

此外,我注意到的另一个奇怪的行为是,以下代码有时会做,有时不会给出指定的错误:

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

我完全迷失了这种行为的发生方式。是否有任何修复或解决方法?我的目标是阅读网址的html内容。

修改

我不知道为什么堆栈溢出会改变我的代码,以便将我在上面列出的amazon链接更改为rads.stackoverflow。无论如何,忽略rads.stackoverflow链接并在引号之间使用上面的链接。

2 个答案:

答案 0 :(得分:17)

亚马逊拒绝使用urllib2的默认用户代理。一种解决方法是使用请求模块

import requests
page = requests.get("http://www.amazon.com/gp/offer-listing/0415376327%3FSubscriptionId%3DAKIAJZY2VTI5JQ66K7QQ%26tag%3Damaztest04-20%26linkCode%3Dxm2%26camp%3D2025%26creative%3D386001%26creativeASIN%3D0415376327")
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()

不要担心stackoverflow编辑URL。他们解释说他们正在做这件事here

答案 1 :(得分:9)

这是因为亚马逊不允许自动访问他们的数据,因此他们拒绝您的请求,因为它并非来自适当的浏览器。如果您查看503响应的内容,它会说:

  

要讨论对亚马逊数据的自动访问,请联系   api-services-support@amazon.com。       有关迁移到API的信息,请参阅https://developer.amazonservices.com/ref=rm_5_sv处的Marketplace API,   或者我们的产品广告API   https://affiliate-program.amazon.com/gp/advertising/api/detail/main.html/ref=rm_5_ac   用于广告用例。

这是因为Python User-Agent的{​​{1}}显然不是浏览器。你总是可以伪造urllib,但那不是真正的好(或道德)练习。

作为旁注,如另一个答案所述,User-Agent库非常适合Python中的HTTP访问。