Python urllib2.HTTPError: ошибка HTTP 503: служба недоступна на действующем веб-сайте

Я использую API рекламы Amazon для создания URL-адресов, содержащих цены для данной книги. Один url, который я создал, следующий:

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

Когда я нажимаю на ссылку или вставляю ссылку в адресной строке, веб-страница загружается штрафом. Однако, когда я выполняю следующий код, я получаю сообщение об ошибке:

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

Ошибка urllib2.HTTPError: ошибка HTTP 503: служба недоступна. Прежде всего, я не понимаю, почему я даже получаю эту ошибку, так как веб-страница успешно загружается.

Кроме того, еще одно странное поведение, которое я заметил, заключается в том, что следующий код иногда делает и иногда не дает заявленной ошибки:

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

Я полностью потерял, как это происходит. Есть ли какие-либо проблемы с этим? Моя цель - прочитать html-содержимое URL-адреса.

ИЗМЕНИТЬ

Я не знаю, почему переполнение стека меняет мой код, чтобы изменить ссылку amazon, указанную выше в моем коде, в rads.stackoverflow. В любом случае, игнорируйте ссылку rads.stackoverflow и используйте мою ссылку выше между кавычками.

Ответ 1

Это потому, что Amazon не разрешает автоматический доступ к своим данным, поэтому они отклоняют ваш запрос, потому что он не появился из соответствующего браузера. Если вы посмотрите на содержимое ответа 503, в нем говорится:

Чтобы обсудить автоматический доступ к данным Amazon, пожалуйста, свяжитесь с нами [email protected]     Для получения информации о переходе на наши API-интерфейсы обратитесь к нашим API Marketplace по адресу 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 действительно хороша для HTTP-доступа в Python.

Ответ 2

Amazon отклоняет пользовательский агент по умолчанию для urllib2. Одним из способов является использование модуля запросов

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

Не волнуйтесь о том, что файл stackoverflow редактирует URL. Они объясняют, что они делают это здесь.