Ошибка urllib2 HTTP 429

Поэтому у меня есть список суб-reddits, и я использую urllib для их открытия. Когда я проходил через них, в конце концов urllib терпит неудачу:

urllib2.HTTPError: HTTP Error 429: Unknown 

Проведя некоторые исследования, я обнаружил, что reddit ограничивает количество запросов на свои серверы по IP:

Делайте не более одного запроса каждые две секунды. Есть несколько допущений для всплесков запросов, но они сохраняют разумность. В общем, держите его не более 30 запросов в минуту.

Поэтому я решил, что буду использовать time.sleep() чтобы ограничить мои запросы на одну страницу каждые 10 секунд. Это заканчивается тем же успехом.

Вышеприведенная цитата взята с страницы reddit API . Я не использую reddit API. На данный момент я думаю о двух вещах. Либо этот предел применяется только к API reddit, либо urllib также имеет предел.

Кто-нибудь знает, какая из этих двух вещей? Или как я мог бы решить эту проблему?

2 Solutions collect form web for “Ошибка urllib2 HTTP 429”

Из https://github.com/reddit/reddit/wiki/API :

Многие пользовательские агенты по умолчанию (например, «Python / urllib» или «Java») сильно ограничены, чтобы поощрять уникальные и дескриптивные строки пользовательского агента.

Это относится и к обычным запросам. При подаче запроса вам нужно указать свой собственный заголовок пользовательского агента.

 #TODO: change user agent string hdr = { 'User-Agent' : 'super happy flair bot by /u/spladug' } req = urllib2.Request(url, headers=hdr) html = urllib2.urlopen(req).read() 

Однако это создаст новое соединение для каждого запроса. Я предлагаю использовать другую библиотеку, которая может повторно использовать соединения, httplib или Request , например. Это снизит нагрузку на сервер и ускорит запросы:

 import httplib import time lst = """ science scifi """ hdr= { 'User-Agent' : 'super happy flair bot by /u/spladug' } conn = httplib.HTTPConnection('www.reddit.com') for name in lst.split(): conn.request('GET', '/r/'+name, headers=hdr) print conn.getresponse().read() time.sleep(2) conn.close() 

reddit выполняет ограничение скорости по запросу (не соединение, предложенное Anonymous Coward) для обоих IP-адресов и пользовательских агентов. Проблема, с которой вы сталкиваетесь, заключается в том, что каждый, кто пытается получить доступ к reddit с помощью urllib2, будет ограничен лимитом по скорости как один пользователь.

Решение состоит в том, чтобы установить пользовательский агент, на который вы можете найти ответ в этом вопросе .

Кроме того, откажитесь от написания собственного кода для сканирования reddit и вместо этого используйте PRAW . Он поддерживает почти все функции API reddit, и вам не нужно беспокоиться о том, чтобы следовать каким-либо правилам API, поскольку это позаботится об этом для вас.

  • Почему эта ошибка от urllib?
  • robobrowser не будет изменять файлы cookie
  • Почему urllib2.urlopen не может открывать такие страницы, как «http: // localhost / new-post # comment-29»?
  • Список всех файлов в онлайн-каталоге с Python?
  • Ошибка «из памяти» с механизацией
  • Загрузка веб-страницы и всех ее файлов ресурсов в Python
  • Получите сокет для возвращаемого значения urllib2.urlopen для HTTP
  • Постоянный «Временный сбой при разрешении имени» после запуска в течение нескольких часов
  •  
    Interesting Posts for Van-Lav

    Регулярные выражения, но для записи в матче

    Доступ к данным по адресу памяти с помощью ctypes

    Использование Babel: как защитить комментарии переводчика (и старые переводы) в GNU gettext PO-файлах?

    Регистрация пользователей Django Rest Framework с дополнительными полями

    Установка bpython для Python 3

    Возможно обмен данными в памяти между двумя отдельными процессами?

    Как мы можем конвертировать 01-01-2011 19:00 в будние дни, такие как Mon, Tue .. в python?

    где я должен определять функции, которые я использую в __init__

    Python Реализация алгоритма Витерби

    Есть ли простой способ получить все распространенные расширения модулей?

    В чем разница между Upstart и Supervisord?

    Что такое пифонический способ распаковки кортежей?

    Большая цветовая палитра в matplotlib для дендрограммы SciPy (Python)

    python с использованием последовательности фибоначчи

    Оператор Star (*) применяется к спискам и целям

    Python - лучший язык программирования в мире.