web-dev-qa-db-fra.com

Python urllib2.HTTPError: erreur HTTP 503: service non disponible sur un site Web valide

J'utilise l'API de publicité sur les produits d'Amazon pour générer des URL contenant les prix d'un livre donné. Une URL que j'ai générée est la suivante:

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

Lorsque je clique sur le lien ou que je colle le lien dans la barre d'adresse, la page Web se charge correctement. Cependant, lorsque j'exécute le code suivant, j'obtiens une erreur:

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)

L'erreur est urllib2.HTTPError: Erreur HTTP 503: service non disponible . Tout d'abord, je ne comprends pas pourquoi j'obtiens même cette erreur car la page Web se charge avec succès.

En outre, un autre comportement étrange que j'ai remarqué est que le code suivant donne parfois et ne donne pas parfois l'erreur indiquée:

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

Je suis totalement perdu sur la façon dont ce comportement se produit. Y a-t-il un correctif ou une solution à ce problème? Mon objectif est de lire le contenu html de l'url.

[~ # ~] modifier [~ # ~]

Je ne sais pas pourquoi le débordement de pile change mon code pour changer le lien Amazon que j'ai listé ci-dessus dans mon code en rads.stackoverflow. Quoi qu'il en soit, ignorez le lien rads.stackoverflow et utilisez mon lien ci-dessus entre les guillemets.

15
user2548635

C'est parce qu'Amazon n'autorise pas l'accès automatisé à leurs données, ils rejettent donc votre demande car elle ne provient pas d'un navigateur approprié. Si vous regardez le contenu de la réponse 503, il dit:

Pour discuter de l'accès automatisé aux données Amazon, veuillez contacter [email protected]. Pour plus d'informations sur la migration vers nos API, reportez-vous à nos API Marketplace à https://developer.amazonservices.com/ref=rm_5_sv , ou à notre API de publicité produit à https: // affiliate- program.Amazon.com/gp/advertising/api/detail/main.html/ref=rm_5_ac pour les cas d'utilisation publicitaire.

C'est parce que le User-Agent pour Python urllib n'est donc évidemment pas un navigateur. Vous pouvez toujours simuler le User-Agent, mais ce n'est pas vraiment une bonne pratique (ou morale).

En remarque, comme mentionné dans une autre réponse, la bibliothèque requests est vraiment bonne pour l'accès HTTP en Python.

9
Ben

Amazon rejette l'agent utilisateur par défaut pour urllib2. Une solution consiste à utiliser le module des demandes

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

Si vous insistez pour utiliser urllib2, voici comment un en-tête peut être falsifié pour le faire:

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

Ne vous inquiétez pas si stackoverflow modifie l'URL. Ils expliquent qu'ils font cela ici .

19
Spade