urllib2 HTTP ошибка 429

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

urllib2.HTTPError: HTTP Error 429: Unknown

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

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

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

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

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

3 ответа

Решение

С https://github.com/reddit/reddit/wiki/API:

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

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

#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 или запрос, например. Это уменьшит нагрузку на сервер и ускорит запросы:

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.request import urlopen из bs4 import BeautifulSoup

html = urlopen (url) bsObj = BeautifulSoup (html) to из urllib.request импорт urlopen из bs4 импорт BeautifulSoup импорт urllib.request

webRequest = urllib.request.Request (url, headers = {"User-Agent":}) html = urlopen (webRequest) bsObj = BeautifulSoup (html) ``

Другие вопросы по тегам