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