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

问题描述:

我一直在使用亚马逊的产品广告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.*.com/amzn/click/0415376327" 
html_contents = urllib2.urlopen(url) 

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

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

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

我完全失去了对如何出现这种情况。有没有解决或解决这个问题?我的目标是阅读url的html内容。

编辑

我不知道为什么存在栈溢出,改变了我的代码来改变我的代码rads.*我上面列出的亚马逊链接。无论如何,忽略rads.*链接并在引号之间使用上面的链接。

+0

如果我没有弄错,'rads.*.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

这是因为亚马逊不允许自动访问他们的数据,所以他们拒绝您的请求,因为它不是来自适当的浏览器。如果你看看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://*.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

亚马逊正在拒绝urllib2的默认User-Agent。一种解决方法是使用请求模块

import requests 
page = requests.get("http://rads.*.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