web-dev-qa-db-ja.com

Python urllib2.HTTPError:HTTPエラー503:有効なWebサイトでサービスを利用できません

AmazonのProduct Advertising APIを使用して、特定の本の価格を含むURLを生成しています。私が生成したURLの1つは次のとおりです。

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

リンクをクリックするか、アドレスバーにリンクを貼り付けると、Webページが正常に読み込まれます。ただし、次のコードを実行するとエラーが発生します。

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 Error 503:Service Unavailableです。まず、Webページが正常にロードされるので、なぜこのエラーが発生するのか理解できません。

また、私が気づいた別の奇妙な動作は、次のコードが記載されたエラーを時々発生し、時には提供しないということです:

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")

この動作がどのように発生するかについて、私は完全に迷っています。これに対する修正または回避策はありますか?私の目標は、URLのHTMLコンテンツを読み取ることです。

[〜#〜] edit [〜#〜]

スタックオーバーフローがコードを変更して、上記のコードでリストしたAmazonリンクをrads.stackoverflowに変更する理由がわかりません。とにかく、rads.stackoverflowリンクを無視し、引用符の間に上記のリンクを使用します。

15
user2548635

Amazonはデータへの自動アクセスを許可していないため、適切なブラウザーからのリクエストではないため、リクエストを拒否しているためです。 503応答のコンテンツを見ると、次のように表示されます。

Amazonデータへの自動アクセスについては、api-services-support @ Amazon.comにお問い合わせください。 APIへの移行については、 https://developer.amazonservices.com/ref=rm_5_sv のMarketplace API、または https:// affiliate-のProduct Advertising APIを参照してください。 program.Amazon.com/gp/advertising/api/detail/main.html/ref=rm_5_ac 広告のユースケース用。

これは、User-Agent Pythonのurllibは、明らかにブラウザではありません。あなたはいつでもUser-Agent、しかしそれは本当に良い(または道徳的な)実践ではありません。

補足として、別の回答で述べたように、requestsライブラリーはPythonでのHTTPアクセスに非常に適しています。

9
Ben

Amazonはurllib2のデフォルトのUser-Agentを拒否しています。回避策の1つは、requestsモジュールを使用することです

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

19
Spade