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

我该如何解决这个问题?多谢!

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

解释

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

溶液

我通过以下方式解决:

  1. 首先,当您使用Google帐户登录时,您必须从网络浏览器使用Google趋势;
  2. 为了跟踪实际的HTTP GET:(我正在使用Chromium(进入"更多工具"->"开发人员工具"->"网络"选项卡。
  3. 访问Google趋势页面并搜索趋势; 它会在"网络"选项卡的左侧边栏触发大量HTTP请求;
  4. 识别 GET 请求(在我的例子中是/trends/explore?q=topic&geo=US(并右键单击它并选择复制 -> 复制为 cURL;
  5. 然后转到此页面并将cURL脚本粘贴到左侧,并复制您可以在页面右侧生成的python脚本中找到的"headers"字典;
  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. 从您的代码中删除任何"导入 TrendReq",因为现在它将使用您刚刚创建的内容;
  2. 重试;
  3. 如果将来出现错误消息:重复该过程。您需要使用新值更新标头字典,这可能会触发验证码机制。

这个花了一段时间,但事实证明库只需要更新。您可以查看我在此处发布的一些方法,这两种方法都导致了状态 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 --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 中并获取饼干!

最新更新