Подтвердить что ты не робот

Как избежать ошибки HTTP 429 (слишком много запросов) python

Я пытаюсь использовать Python для входа на сайт и сбора информации с нескольких веб-страниц, и я получаю следующую ошибку:

Traceback (most recent call last):
  File "extract_test.py", line 43, in <module>
    response=br.open(v)
  File "/usr/local/lib/python2.7/dist-packages/mechanize/_mechanize.py", line 203, in open
    return self._mech_open(url, data, timeout=timeout)
  File "/usr/local/lib/python2.7/dist-packages/mechanize/_mechanize.py", line 255, in _mech_open
    raise response
mechanize._response.httperror_seek_wrapper: HTTP Error 429: Unknown Response Code

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

Здесь мой код:

import mechanize
import cookielib
import re
first=("example.com/page1")
second=("example.com/page2")
third=("example.com/page3")
fourth=("example.com/page4")
## I have seven URL I want to open

urls_list=[first,second,third,fourth]

br = mechanize.Browser()
# Cookie Jar
cj = cookielib.LWPCookieJar()
br.set_cookiejar(cj)

# Browser options 
br.set_handle_equiv(True)
br.set_handle_redirect(True)
br.set_handle_referer(True)
br.set_handle_robots(False)

# Log in credentials
br.open("example.com")
br.select_form(nr=0)
br["username"] = "username"
br["password"] = "password"
br.submit()

for url in urls_list:
        br.open(url)
        print re.findall("Some String")
4b9b3361

Ответ 1

Получение статуса 429 не является ошибкой, другой сервер "любезно" просит вас прекратить запросы на рассылку спама. Очевидно, что ваша ставка запросов слишком высока, и сервер не согласен с этим.

Вы не должны пытаться "уклониться" от этого или даже пытаться обойти настройки безопасности сервера, пытаясь обмануть свой IP-адрес, вы должны просто уважать ответ сервера, не отправляя слишком много запросов.

Если все настроено правильно, вы также получите заголовок "Retry-after" вместе с ответом 429. Этот заголовок указывает количество секунд, которое вы должны дождаться, прежде чем совершать другой вызов. Правильный способ справиться с этой "проблемой" состоит в том, чтобы прочитать этот заголовок и спящий ваш процесс на протяжении многих секунд.

Дополнительную информацию о статусе 429 вы можете найти здесь: http://tools.ietf.org/html/rfc6585#page-3

Ответ 2

Написание этой части кода исправило мою проблему:

requests.get(link, headers = {'User-agent': 'your bot 0.1'})

Ответ 3

Другим обходным решением было бы обмануть ваш IP-адрес с помощью какой-либо сети Public VPN или Tor. Это предполагает ограничение скорости на сервере на уровне IP.

Существует короткое сообщение в блоге, демонстрирующее способ использования tor вместе с urllib2:

http://blog.flip-edesign.com/?p=119