Urllib error httperror http error 429 too many requests

I am using the following code to resolve redirects to return a links final url def resolve_redirects(url): return urllib2.urlopen(url).geturl() Unfortunately I sometimes get HTTPError: HTTP E...

I am using the following code to resolve redirects to return a links final url

def resolve_redirects(url):
    return urllib2.urlopen(url).geturl()

Unfortunately I sometimes get HTTPError: HTTP Error 429: Too Many Requests. What is a good way to combat this? Is the following good or is there a better way.

def resolve_redirects(url):
    try:
        return urllib2.urlopen(url).geturl()
    except HTTPError:
        time.sleep(5)
        return urllib2.urlopen(url).geturl()

Also, what would happen if there is an exception in the except block?

sideshowbarker's user avatar

asked Jul 29, 2015 at 17:22

Bijan's user avatar

1

It would be better to make sure the HTTP code is actually 429 before re-trying.

That can be done like this:

def resolve_redirects(url):
    try:
        return urllib2.urlopen(url).geturl()
    except HTTPError, e:
        if e.code == 429:
             time.sleep(5);
             return resolve_redirects(url)
        raise

This will also allow arbitrary numbers of retries (which may or may not be desired).

https://docs.python.org/2/howto/urllib2.html#httperror

answered Jul 29, 2015 at 18:14

Jesse W at Z - Given up on SE's user avatar

2

This is a fine way to handle the exception, though you should check to make sure you are always sleeping for the appropriate amount of time between requests for the given website (for example twitter limits the amount of requests per minute and has this amount clearly shown in their api documentation). So just make sure you’re always sleeping long enough.

To recover from an exception within an exception, you can simply embed another try/catch block:

def resolve_redirects(url):
    try:
        return urllib2.urlopen(url).geturl()
    except HTTPError:
        time.sleep(5)
        try:
            return urllib2.urlopen(url).geturl()
        except HTTPError:
            return "Failed twice :S"

Edit: as @jesse-w-at-z points out, you should be returning an URL in the second error case, the code I posted is just a reference example of how to write a nested try/catch.

answered Jul 29, 2015 at 17:29

Gnarlywhale's user avatar

GnarlywhaleGnarlywhale

3,9402 gold badges14 silver badges18 bronze badges

2

Adding User-Agent to request header solved my issue:

from urllib import request
from urllib.request import urlopen

url = 'https://www.example.com/abc.json'
req = request.Request(url)
req.add_header('User-Agent', 'abc-bot')
response = request.urlopen(req)

answered Sep 14, 2021 at 0:32

Joe's user avatar

JoeJoe

1762 silver badges11 bronze badges

Я пытаюсь использовать 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")

01 апр. 2014, в 14:44

Поделиться

Источник

3 ответа

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

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

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

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

MRA
29 апр. 2014, в 14:15

Поделиться

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

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

tadm123
03 нояб. 2016, в 04:17

Поделиться

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

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

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

Gaurav Agarwal
01 апр. 2014, в 14:27

Поделиться

Ещё вопросы

  • 0Включение еще одного объединения в таблицу MYSQL
  • 1Таблица SQL в файл JSON
  • 0почему я не могу ввести директиву в мои тесты
  • 1Алгоритм обратного отслеживания для создания «перемешанного», но не случайного массива
  • 1Аргументы для поиска в лагере «Найди и уничтожь»
  • 1Прогнозирование POS-тега предстоящего слова
  • 0Как обновить компоненты Material Design Lite js при использовании угловых маршрутов?
  • 0JQuery показать / скрыть Div с выпадающим больше уровней
  • 1Переключение между представлениями в Android
  • 1Проблемы с представлением списка после обновления до Java 8
  • 1`/ bin / sh` не найден в tox внутри Jenkins внутри докера
  • 1Объекты, достижимые сильными или слабыми ссылками в Java
  • 0Удалить функцию заполнения
  • 1Копировать сущность внутри ViewModel
  • 1Индексирование вложенного списка списком
  • 0PHP MYSQL запрос, поиск только в строках, где поле истинно
  • 0CSS для тега DIV работает неправильно
  • 0Как пользователю filter () вернуть точку входа из $ .post
  • 0Как установить значение оси X HighCharts
  • 0Неразрешенное включение
  • 0Отправить FlashMessenger
  • 0У меня проблемы с помощником HTML, почему он не работает?
  • 0Laravel Artisan Migrate отказано в соединении
  • 0JQuery добавить к ближайшему элементу, как я показываю
  • 0Изображения водяных знаков PHP на лету
  • 0Подсчет логинов на устройство на пользователя
  • 0Ведите конверсию с помощью мобильного приложения salesforce
  • 1JavaScript — перемещение объекта на новое место
  • 1Реализация и визуализация бинарного дерева в Java
  • 1Лучший способ создавать XML во время выполнения
  • 1Почему свойство TotalCount в общей папке всегда возвращает 0 элементов?
  • 0Mysqldb не устанавливается в колбу Приложение использую pycharm
  • 1Ограничение службы WCF для ответа только на один запрос домена?
  • 1Python генерирует правдоподобные выражения, содержащие числовые значения и компараторы
  • 0Невозможно получить данные из MySQL, используя PHP
  • 1Spring amqp rabbitmq MessageListener не работает
  • 1Как получить результаты xml2js из анализатора в ES6?
  • 0Как я могу получить обратный вызов после завершения перехода JQuery
  • 0как синхронизировать 2 оси Y в Chart Director
  • 0Чтение файлов в C ++
  • 0Prestashop — Добавить модуль на крючок
  • 0заставить объекты сталкиваться друг с другом в Raphael.js
  • 1Листовка всплывающая на каждом маркере с использованием воспроизведения листовки
  • 1Преобразовать строку с разделителями в XML в C # с помощью LINQ
  • 1Используя аналитику Google, возможно ли создать пользовательское измерение с помощью API (программно)
  • 0Значение текстового поля, чтобы разрешить только десятичные и числовые значения, используя ng-шаблон?
  • 0Как показать-скрыть именованное представление в angular-ui-router
  • 0Как получить доступ к данным из других классов частного внутреннего класса?
  • 1Перезагрузите компьютер через WCF с WMI, размещенным на IIS c #

Сообщество Overcoder

#python #curl #python-requests

#python #curl #python-запросы

Вопрос:

Почему, когда я вызываю веб-сайт с помощью curl, он работает, но при вызове с помощью python всегда возвращается 429? Я пытался установить много разных пользовательских агентов, файлов cookie…

вызов curl:

 curl "https://query2.finance.yahoo.com/v10/finance/quoteSummary/GLW?formatted=trueamp;crumb=8ldhetOu7RJamp;lang=en-USamp;region=USamp;modules=summaryDetailamp;corsDomain=finance.yahoo.com"
 

ответ: {"quoteSummary":{"result":[{"summaryDetail":{"maxAge":1,"priceHint":{"raw":2,"fmt":"2","longFmt":"2"},"previousClose":{"raw":37.12,"fmt":"37.12"},"open":{"raw":37.19,"fmt":"37.19"},"dayLow":{"raw":37.12,"fmt":"37.12"},"dayHigh":{"raw":37.95,"fmt":"37.95"},"regularMarketPreviousClose":{"raw":37.12,"fmt":"37.12"},"regularMarketOpen":{"raw":37.19,"fmt":"37.19"},"regularMarketDayLow":{"raw":37.12,"fmt":"37.12"},"regularMarketDayHigh":{"raw":37.95,"fmt":"37.95"},"dividendRate":{"raw":0.88,"fmt":"0.88"},"dividendYield":{"raw":0.0232,"fmt":"2.32%"},"exDividendDate":{"raw":1605139200,"fmt":"2020-11-12"},"payoutRatio":{"raw":3.3077,"fmt":"330.77%"},"fiveYearAvgDividendYield":{"raw":2.43,"fmt":"2.43"},"beta":{"raw":1.173753,"fmt":"1.17"},"trailingPE":{"raw":148.82353,"fmt":"148.82"},"forwardPE":{"raw":20.294119,"fmt":"20.29"},"volume":{"raw":3372416,"fmt":"3.37M","longFmt":"3,372,416"},"regularMarketVolume":{"raw":3372416,"fmt":"3.37M","longFmt":"3,372,416"},"averageVolume":{"raw":4245485,"fmt":"4.25M","longFmt":"4,245,485"},"averageVolume10days":{"raw":3351485,"fmt":"3.35M","longFmt":"3,351,485"},"averageDailyVolume10Day":{"raw":3351485,"fmt":"3.35M","longFmt":"3,351,485"},"bid":{"raw":37.88,"fmt":"37.88"},"ask":{"raw":37.89,"fmt":"37.89"},"bidSize":{"raw":1100,"fmt":"1.1k","longFmt":"1,100"},"askSize":{"raw":800,"fmt":"800","longFmt":"800"},"marketCap":{"raw":28994179072,"fmt":"28.99B","longFmt":"28,994,179,072"},"yield":{},"ytdReturn":{},"totalAssets":{},"expireDate":{},"strikePrice":{},"openInterest":{},"fiftyTwoWeekLow":{"raw":17.44,"fmt":"17.44"},"fiftyTwoWeekHigh":{"raw":37.95,"fmt":"37.95"},"priceToSalesTrailing12Months":{"raw":2.6921244,"fmt":"2.69"},"fiftyDayAverage":{"raw":35.406857,"fmt":"35.41"},"twoHundredDayAverage":{"raw":31.052786,"fmt":"31.05"},"trailingAnnualDividendRate":{"raw":0.86,"fmt":"0.86"},"trailingAnnualDividendYield":{"raw":0.023168104,"fmt":"2.32%"},"navPrice":{},"currency":"USD","fromCurrency":null,"toCurrency":null,"lastMarket":null,"volume24Hr":{},"volumeAllCurrencies":{},"circulatingSupply":{},"algorithm":null,"maxSupply":{},"startDate":{},"tradeable":false}}],"error":null}}

с помощью python:

 import requests
headers = {'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.88 Safari/537.36'}
result = requests.get('https://query2.finance.yahoo.com/v10/finance/quoteSummary/GLW?formatted=trueamp;crumb=8ldhetOu7RJamp;lang=en-USamp;region=USamp;modules=summaryDetailamp;corsDomain=finance.yahoo.com', headers=headers)
print result.content
 

ответ:

 Traceback (most recent call last):
  File "a.py", line 35, in <module>
    response = urllib.request.urlopen(req, jsondataasbytes)
  File "C:UsersuserAppDataLocalProgramsPythonPython37liburllibrequest.py", line 222, in urlopen
    return opener.open(url, data, timeout)
  File "C:UsersuserAppDataLocalProgramsPythonPython37liburllibrequest.py", line 531, in open
    response = meth(req, response)
  File "C:UsersuserAppDataLocalProgramsPythonPython37liburllibrequest.py", line 641, in http_response
    'http', request, response, code, msg, hdrs)
  File "C:UsersuserAppDataLocalProgramsPythonPython37liburllibrequest.py", line 569, in error
    return self._call_chain(*args)
  File "C:UsersuserAppDataLocalProgramsPythonPython37liburllibrequest.py", line 503, in _call_chain
    result = func(*args)
  File "C:UsersuserAppDataLocalProgramsPythonPython37liburllibrequest.py", line 649, in http_error_default
    raise HTTPError(req.full_url, code, msg, hdrs, fp)
urllib.error.HTTPError: HTTP Error 429: Too Many Requests
 

Комментарии:

1. Не могли бы вы просто установить ограничение скорости для этого URL? Или вы думаете, что есть другая причина?

2. У меня все работает нормально, используя запросы python, вероятно, вы были заблокированы сайтом из-за упомянутой ошибки.

3. Paisanco: другая причина, потому что и в VPN запрос не работает @AvihayTsayeg это странно, потому что в браузере и curl все еще работают

Ответ №1:

Хорошо, хорошо, решаемая путем передачи параметров get через параметры:

 import requests
payload = {"modules": "summaryDetail"}
response = requests.get("https://query2.finance.yahoo.com/v10/finance/quoteSummary/GLW", params=payload)
print(response.json())
 

Too Many Requests when using pytube

I have a site, where you enter an url and when you click download, it should download a video
but instead I get this error

urllib.error.HTTPError: HTTP Error 429: Too Many Requests

is it possible to fix?

deleted-user-9674872
|
1
post
|



Feb. 7, 2021, 10:13 p.m.

|
permalink

Yes. Make fewer requests to the site. They are rate-limiting you. In general, sites like youtube do not want you to be accessing them with programs, so they have mechanisms in place to prevent that.

Staff

glenn
|
8703
posts
|

PythonAnywhere staff
|



Feb. 8, 2021, 10:42 a.m.

|
permalink

Hiii
I use pytube library and by mistake I make too many requests then I fixed the code and try again but it shows HTTP error 429
How can I fix this problem??

Telecharger
|
2
posts
|



Jan. 20, 2022, 5:56 a.m.

|
permalink

The only possible way to handle rate limits is to wait.

Staff

fjl
|
3651
posts
|

PythonAnywhere staff
|



Jan. 20, 2022, 10:44 a.m.

|
permalink

Понравилась статья? Поделить с друзьями:
  • Urllib error httperror http error 410 gone pytube
  • Usb флешка не читается нет носителя как исправить
  • Urllib error httperror http error 405 method not allowed
  • Usb флешка медленно работает как исправить
  • Usb устройство ввода ошибка драйвера