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, поэтому я заслуживаю доверия.
Решение
Решил так:
- Прежде всего, вы должны использовать тенденции Google из своего веб-браузера, пока вы вошли в свою учетную запись Google;
- Для отслеживания фактического выполнения HTTP GET: (Я использую Chromium) Перейдите в «Дополнительные инструменты» -> «Инструменты разработчика» -> вкладка «Сеть».
- Посетите страницу Google Trend и выполните поиск тенденции; он вызовет множество HTTP-запросов на левой боковой панели вкладки «Сеть»;
- Определите запрос GET (в моем случае это был / Trends/explore? Q =topic&geo=US), щелкните его правой кнопкой мыши и выберите Копировать -> Копировать как cURL;
- Затем перейдите на эту страницу и вставьте скрипт cURL в левую часть и скопируйте словарь «заголовков», который вы можете найти внутри скрипта python, сгенерированного в правой части страницы;
- Затем перейдите к своему коду и создайте подкласс класса 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)
- Удалите любой «import TrendReq» из вашего кода, так как теперь он будет использовать только что созданный вами.
- Повторить еще раз
У меня была такая же проблема даже после обновления модуля с помощью 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, что и он для получения заголовков:
- посетите сайт Trends.google.com
- откройте инструменты разработчика и перейдите на вкладку сеть
- выполните поиск, а затем щелкните правой кнопкой мыши верхний запрос GET (должен выглядеть так: explore?q=...)
- скопируйте запрос как bash-cURL
- вставьте это в curlconverter.com и получите печенье!
Теперь мы снова столкнулись с той же проблемой. Следующий код поможет решить проблему 429.
Для интереса приведенный ниже код будет работать с несколькими повторами при смене браузера.