Ошибка 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 также имеет предел.

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

Из 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, поскольку это позаботится об этом для вас.