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

Python Pytrends:请求失败:Google返回了一个代码为429的响应,python,google-trends,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

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

我怎样才能解决这个问题?非常感谢

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

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

运行:

pip安装--升级--用户git+https://github.com/GeneralMills/pytrends

以获取最新版本

希望这对你也有用

编辑:

如果无法从源代码进行升级,您可能会遇到以下问题:

pip安装pytrends——升级


另外,如果在Windows上,请确保您以管理员身份运行git。

通过pip安装运行升级命令后,您应该重新启动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;我用自定义补丁解决了这个问题

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

解决方案 我用以下方法解决:

  • 首先,你必须在使用谷歌账户登录的同时,从网络浏览器中使用谷歌趋势
  • 为了跟踪实际生成的HTTP:(我正在使用Chromium)进入“更多工具”->“开发人员工具”->“网络”选项卡
  • 访问谷歌趋势页面,搜索趋势;它将在“网络”选项卡的左侧栏上触发大量HTTP请求
  • 确定GET请求(在我的例子中是/trends/explore?q=topic&geo=US)并右键单击它,然后选择Copy->Copy as cURL
  • 然后转到并粘贴左侧的cURL脚本,复制页面右侧生成的python脚本中的“headers”字典
  • 然后转到您的代码并对TrendReq类进行子类化,以便您可以传递刚刚复制的自定义标头:
  • 从pytrends.request导入TrendReq作为UTrendReq
    GET_方法='GET'
    导入请求
    标题={
    ...
    }
    类趋势请求(UTrendReq):
    定义获取数据(self,url,method=get\u method,trim\u chars=0,**kwargs):
    return super()。_get_数据(url,method=get_方法,trim_chars=trim_chars,headers=headers,**kwargs)
    
  • 从代码中删除任何“importtrendreq”,因为现在它将使用您刚刚创建的
  • 重试
  • 如果以后出现错误消息:重复该过程。您需要使用新值更新标题字典,可能需要解决验证码机制

  • 若谷歌怀疑你们滥发垃圾信息、抓取信息或其他滥用信息,他们会很快封锁你们的ipsystem@zimdero谢谢,如果我还想用它怎么办?“代理”命令不起作用。我正在积极尝试解决同样的问题。我在为一篇学术论文做研究,它昨天起作用了,今天我还没有得到一个成功的回复。期待找到一个好的解决方案…@WWH98932你在做什么?我正在做同样的精确搜索。我想我们必须从web界面下载csv文件,然后将其引入JupyterLab并放入数据框中。不管怎么说,这就是我倾向于的方法。@lopezdp同样,我是手动操作的,真的很烦人。我明天会去别的地方看看它是否能改变我的IP地址…嗯,是的。这对我有用。听起来好像您没有安装git,或者您的PATH变量没有设置为接受git命令。您应该安装git+python3,至少这是我的环境。我直接从他们的源代码升级。pip3.6安装--升级--用户git+强制从4.4升级到4.5谢谢@qpaycm哈哈!斗争是真实的!我记得那个问题当时对我来说也很麻烦。。。以下是我使用该库的项目,以防它可以帮助您了解:多亏您在几个小时内完成了我的研究。今天,在经历429之后,第二次运行必须代理。现在,我认为使用代理传送带将有更高的机会获得最大重试次数超过错误。我想我应该从>exceptions.py?@qpaycm处理它,这取决于你在做什么。在纠正上述问题后,我也有同样的经历。我要做的是在循环的每次迭代中处理请求的数量。在我的具体案例中,我查询了60天的周期,我只是将其切换到90个周期,以最小化迭代周期的总数,使其保持在429限制之下。我怀疑您可能有类似的情况,您可以调整请求量的大小,以便稍微减少总请求迭代次数。。。反正我就是这么做的。