AmazonのProduct Advertising APIを使用して、特定の本の価格を含むURLを生成しています。私が生成したURLの1つは次のとおりです。
リンクをクリックするか、アドレスバーにリンクを貼り付けると、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リンクを無視し、引用符の間に上記のリンクを使用します。
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アクセスに非常に適しています。
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 。