Pytrends:请求失败:Google 返回代码为 429 的响应

Pytrends: The request failed: Google returned a response with code 429

我正在使用 Pytrends 提取 Google 趋势数据,例如:

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

它 returns 一个错误:

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'})

我该如何解决这个问题?非常感谢!

这花了一些时间,但结果是库只需要更新。您可以查看我在此处发布的一些方法,这两种方法都导致状态 429 响应:

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

最终,我能够通过 运行 我的 bash 提示符下的以下命令让它再次工作:

运行:

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

求最新版本。

希望对你也有用。

编辑:

如果您无法从源代码升级,您可能有一些运气:

pip install pytrends --upgrade

此外,如果 Windows,请确保您是 运行 git 管理员。

通过 pip install 运行 升级命令后,您应该重新启动 python 内核并重新加载 pytrend 库。

即使在使用 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()

希望对您有所帮助!

TLDR;我用自定义补丁解决了这个问题

说明

问题来自 Google 机器人识别系统。与其他类似系统一样,它会停止为来自可疑客户端的过于频繁的请求提供服务。用于识别可信赖客户端的一些功能是存在由网页上存在的 javascript 代码生成的特定 header。不幸的是,python 请求库不提供针对那些机器人识别系统的这种级别的伪装,因为 javascript 代码甚至没有被执行。 所以我的补丁背后的想法是利用我的浏览器生成的 headers 与 google 趋势交互。那些header是在我用我的Google账号登录的时候浏览器生成的,换句话说,那些header是和我的google账号关联的,所以对于他们,我值得信赖

解决方案

我是这样解决的:

  1. 首先,当您使用 Google 帐户登录时,您必须在网络浏览器中使用 google 趋势;
  2. 为了跟踪实际生成的 HTTP GET:(我使用的是 Chromium)进入“更多工具”->“开发人员工具”->“网络”选项卡。
  3. 访问Google Trend页面并搜索趋势;它将在“网络”选项卡的左侧栏中触发大量 HTTP 请求;
  4. 确定 GET 请求(在我的例子中是 /trends/explore?q=topic&geo=US)和 right-click 以及 select 复制 -> 复制为 cURL;
  5. 然后转到 this page 并在左侧粘贴 cURL 脚本,然后复制右侧生成的 python 脚本中的“headers”字典页面的;
  6. 然后转到您的代码并子class TrendReq class,这样您就可以传递刚刚复制的自定义 header:
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. 从您的代码中删除任何“导入 TrendReq”,因为现在它将使用您刚创建的代码;
  2. 重试;
  3. 如果以后错误消息再次出现:重复该过程。您需要用新值更新 header 字典,这可能会触发验证码机制。