我一直在使用亚马逊的产品广告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链接并在引号之间使用上面的链接.
亚马逊拒绝使用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.他们解释说他们在这里这样做.
这是因为亚马逊不允许自动访问他们的数据,因此他们拒绝您的请求,因为它不是来自适当的浏览器.如果您查看503响应的内容,它会说:
要讨论对亚马逊数据的自动访问,请联系api-services-support@amazon.com.有关迁移到我们的API信息,请参阅我们的市场API在https://developer.amazonservices.com/ref=rm_5_sv,或者在我们的产品广告API https://affiliate-program.amazon.com/gp/advertising/api /detail/main.html/ref=rm_5_ac 用于广告用例.
这是因为User-Agent
Python的urllib
显然不是浏览器.你总是可以假装User-Agent
,但这不是真正的好(或道德)练习.
作为旁注,如另一个答案所述,该requests
库非常适合Python中的HTTP访问.