Pytrends: запрос не выполнен: Google вернул ответ с кодом 429

Я использую Pytrends для извлечения данных о тенденциях Google, например:

from pytrends.request import TrendReq
pytrend = TrendReq()
pytrend.build_payload(kw_list=['bitcoin'], cat=0, timeframe=from_date+' '+today_date)

И это возвращает ошибку:

ResponseError: The request failed: Google returned a response with code 429.

Я сделал это вчера, и по некоторым причинам это не работает сейчас! Исходный код с github тоже не удался:

pytrends = TrendReq(hl='en-US', tz=360, proxies = {'https': 'https://34.203.233.13:80'})

Как я могу это исправить? Большое спасибо!

6 ответов

Решение

Это заняло некоторое время, но оказалось, что библиотека просто нуждается в обновлении. Вы можете проверить некоторые из подходов, которые я опубликовал здесь, оба из которых привели к ответам Status 429:

https://github.com/GeneralMills/pytrends/issues/243

В конечном счете, я смог снова заставить его работать, выполнив следующую команду из моего приглашения bash:

Бежать:

pip install --upgrade --user git+https://github.com/GeneralMills/pytrends

Для последней версии.

Надеюсь, что это работает для вас тоже.

РЕДАКТИРОВАТЬ:

Если вы не можете обновить исходный код, вам может повезти с:

pip install pytrends --upgrade

Кроме того, убедитесь, что вы используете git от имени администратора в Windows.

TL; DR; Решил проблему кастомным патчем

Объяснение

Проблема исходит от системы распознавания ботов Google. Как и другие подобные системы, он перестает обслуживать слишком частые запросы от подозрительных клиентов. Некоторые из функций, используемых для распознавания надежных клиентов, - это наличие определенных заголовков, генерируемых кодом javascript, присутствующим на веб-страницах. К сожалению, библиотека запросов python не обеспечивает такого уровня маскировки против этих систем распознавания ботов, поскольку код javascript даже не выполняется. Идея моего патча состоит в том, чтобы использовать заголовки, сгенерированные моим браузером, при взаимодействии с трендами Google. Эти заголовки генерируются браузером, пока я вхожу в свою учетную запись Google, другими словами, эти заголовки связаны с моей учетной записью Google, поэтому я заслуживаю доверия.

Решение

Решил так:

  1. Прежде всего, вы должны использовать тенденции Google из своего веб-браузера, пока вы вошли в свою учетную запись Google;
  2. Для отслеживания фактического выполнения HTTP GET: (Я использую Chromium) Перейдите в «Дополнительные инструменты» -> «Инструменты разработчика» -> вкладка «Сеть».
  3. Посетите страницу Google Trend и выполните поиск тенденции; он вызовет множество HTTP-запросов на левой боковой панели вкладки «Сеть»;
  4. Определите запрос GET (в моем случае это был / Trends/explore? Q =topic&geo=US), щелкните его правой кнопкой мыши и выберите Копировать -> Копировать как cURL;
  5. Затем перейдите на эту страницу и вставьте скрипт cURL в левую часть и скопируйте словарь «заголовков», который вы можете найти внутри скрипта python, сгенерированного в правой части страницы;
  6. Затем перейдите к своему коду и создайте подкласс класса TrendReq, чтобы вы могли передать только что скопированный настраиваемый заголовок:
      from pytrends.request import TrendReq as UTrendReq
GET_METHOD='get'

import requests

headers = {
...
}


class TrendReq(UTrendReq):
    def _get_data(self, url, method=GET_METHOD, trim_chars=0, **kwargs):
        return super()._get_data(url, method=GET_METHOD, trim_chars=trim_chars, headers=headers, **kwargs)

  1. Удалите любой «import TrendReq» из вашего кода, так как теперь он будет использовать только что созданный вами.
  2. Повторить еще раз

У меня была такая же проблема даже после обновления модуля с помощью pip install --upgrade --user git+https://github.com/GeneralMills/pytrends и перезапустите python.

Но проблема была решена с помощью следующего метода:

Вместо того

pytrends = TrendReq(hl='en-US', tz=360, timeout=(10,25), proxies=['https://34.203.233.13:80',], retries=2, backoff_factor=0.1, requests_args={'verify':False})

Просто запустил:

pytrend = TrendReq()

Надеюсь, это может быть полезно!

После запуска команды обновления через pip install, вы должны перезапустить ядро ​​python и перезагрузить библиотеку pytrend.

У меня была та же проблема, и я сделал что-то очень похожее на Антонио Эрколе Де Лука. Однако для меня проблема была в файлах cookie , а не в заголовках.

Я создал подкласс, как это сделал Антонио, но на этот раз изменив метод cookie:

      cookies = {
    "SEARCH_SAMESITE": "####",
    "SID": "####",
    .
    .
    .
}

class CookieTrendReq(TrendReq):
    def GetGoogleCookie(self):
        return dict(filter(lambda i: i[0] == 'NID', cookies.items()))

И я использовал тот же метод для получения файлов cookie, что и он для получения заголовков:

  1. посетите сайт Trends.google.com
  2. откройте инструменты разработчика и перейдите на вкладку сеть
  3. выполните поиск, а затем щелкните правой кнопкой мыши верхний запрос GET (должен выглядеть так: explore?q=...)
  4. скопируйте запрос как bash-cURL
  5. вставьте это в curlconverter.com и получите печенье!

Теперь мы снова столкнулись с той же проблемой. Следующий код поможет решить проблему 429.

Для интереса приведенный ниже код будет работать с несколькими повторами при смене браузера.

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