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

时间:2018-05-28 17:44:29

标签: python google-trends

我使用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'})

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

4 个答案:

答案 0 :(得分:5)

这个花了一段时间,但事实证明图书​​馆只需要更新。您可以查看我在此处发布的一些方法,这两种方法都会导致状态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。

答案 1 :(得分: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()

希望这会有所帮助!

答案 2 :(得分:2)

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

说明

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

解决方案

我是通过以下方式解决的:

  1. 首先,您必须在使用 Google 帐户登录的同时通过网络浏览器使用 Google 趋势;
  2. 为了跟踪实际的 HTTP GET:(我正在使用 Chromium)进入“更多工具”->“开发人员工具”->“网络”选项卡。
  3. 访问 Google 趋势页面并搜索趋势;它会在“网络”选项卡的左侧边栏触发大量 HTTP 请求;
  4. 识别 GET 请求(在我的例子中是 /trends/explore?q=topic&geo=US)并右键单击它并选择复制 -> 复制为 cURL;
  5. 然后转到 this page 并将 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. 如果以后再次出现错误消息:重复该过程。您需要使用新值更新标题字典,并且可能需要解决验证码机制。

答案 3 :(得分:1)

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