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