无需包装器或使用 API 访问 Google 趋势数据:Python

Posted

技术标签:

【中文标题】无需包装器或使用 API 访问 Google 趋势数据:Python【英文标题】:Access Google Trends Data without a wrapper, or with the API: Python 【发布时间】:2019-10-13 21:40:24 【问题描述】:

我正在尝试编写一个 Python 程序来从 Google 趋势 (GT) 中收集数据——具体来说,我想自动打开 URL 并访问折线图中显示的特定值:

我会很高兴下载 CSV 文件,或者通过网络抓取值(根据我对 Inspect Element 的阅读,清理数据只需要简单的一两次拆分)。我有很多想要进行的搜索(很多不同的关键字)

我正在创建许多 URL 来从 Google 趋势中收集数据。我使用了来自测试搜索的实际 URL。 URL 示例:https://trends.google.com/trends/explore?q=sports%20cars&geo=US 在浏览器上实际搜索此 URL 会显示相关的 GT 页面。当我尝试通过程序访问它时,问题就来了。

我看到的大多数回复都建议使用 Pip 的公共模块(例如 PyTrends 和“非官方 Google 趋势 API”)——我的项目经理坚持我不使用不是由网站直接创建的模块(即:API 是可接受,但只有官方的 Google API)。只有 BeautifulSoup 被批准为插件(不要问为什么)。

以下是我尝试过的代码示例。我知道这是基本的,但在 first 我收到的请求中:

HTTPError: HTTP Error 429: unknown": 请求太多。

对其他问题的一些回复提到了 Google Trends API - 这是真的吗?我在官方 API 上找不到任何文档。

这是另一篇文章,其中概述了我尝试过但对我不起作用的解决方案:

https://codereview.stackexchange.com/questions/208277/web-scraping-google-trends-in-python

url = 'https://trends.google.com/trends/explore?q=sports%20cars&geo=US'

html = urlopen(url).read()

soup = bs(html, 'html.parser')

divs = soup.find_all('div')

return divs

【问题讨论】:

链接到示例的内容有什么问题? @QHarr 这里是指向错误的链接。 imgur.com/RMWyW6V 似乎 rss 是针对前 100 个趋势而不是特定趋势 【参考方案1】:

它使用您可以在网络选项卡中找到的 API

import requests
import json

r = requests.get('https://trends.google.com/trends/api/widgetdata/multiline?hl=en-GB&tz=-60&req=%7B%22time%22:%222018-05-29+2019-05-29%22,%22resolution%22:%22WEEK%22,%22locale%22:%22en-GB%22,%22comparisonItem%22:%5B%7B%22geo%22:%7B%22country%22:%22US%22%7D,%22complexKeywordsRestriction%22:%7B%22keyword%22:%5B%7B%22type%22:%22BROAD%22,%22value%22:%22sports+cars%22%7D%5D%7D%7D%5D,%22requestOptions%22:%7B%22property%22:%22%22,%22backend%22:%22IZG%22,%22category%22:0%7D%7D&token=APP6_UEAAAAAXO-yaYekqJ7Tf2nuoLBAigMSW7axoLTL&tz=-60')
data = json.loads(r.text.lstrip(")]\',\n"))

for item in data['default']['timelineData']:
    print(item['formattedAxisTime'], item['value'])

我们可以取消引用 url 以更好地了解正在发生的事情:

import urllib.parse

url = 'https://trends.google.com/trends/api/widgetdata/multiline?hl=en-GB&tz=-60&req=%7B%22time%22:%222018-05-29+2019-05-29%22,%22resolution%22:%22WEEK%22,%22locale%22:%22en-GB%22,%22comparisonItem%22:%5B%7B%22geo%22:%7B%22country%22:%22US%22%7D,%22complexKeywordsRestriction%22:%7B%22keyword%22:%5B%7B%22type%22:%22BROAD%22,%22value%22:%22sports+cars%22%7D%5D%7D%7D%5D,%22requestOptions%22:%7B%22property%22:%22%22,%22backend%22:%22IZG%22,%22category%22:0%7D%7D&token=APP6_UEAAAAAXO-yaYekqJ7Tf2nuoLBAigMSW7axoLTL&tz=-60'
print(urllib.parse.unquote(url))

这会产生:

'https://trends.google.com/trends/api/widgetdata/multiline?hl=en-GB&tz=-60&req="time":"2018-05-29+2019-05-29","resolution":"WEEK","locale":"en-GB","comparisonItem":["geo":"country":"US","complexKeywordsRestriction":"keyword":["type":"BROAD","value":"sports+cars"]],"requestOptions":"property":"","backend":"IZG","category":0&token=APP6_UEAAAAAXO-yaYekqJ7Tf2nuoLBAigMSW7axoLTL&tz=-60'

您需要探索其中的可转移元素。

例如,我查看了搜索词 banana,结果如下:

未引用:

'https://trends.google.com/trends/api/explore?hl=en-GB&tz=-60&req="comparisonItem":["keyword":"banana","geo":"US","time":"today+12-m"],"category":0,"property":""&tz=-60'

引用:

'https://trends.google.com/trends/api/explore?hl=en-GB&tz=-60&req=%7B%22comparisonItem%22:%5B%7B%22keyword%22:%22banana%22,%22geo%22:%22US%22,%22time%22:%22today+12-m%22%7D%5D,%22category%22:0,%22property%22:%22%22%7D&tz=-60'

【讨论】:

谢谢,这行得通。我唯一的问题是,一开始你说“它正在使用你可以在网络选项卡中找到的 API”。我在哪里可以找到这个网络标签,以便更好地了解流程? 在浏览器中按 F12 会打开开发工具。其中一个标签是网络标签。

以上是关于无需包装器或使用 API 访问 Google 趋势数据:Python的主要内容,如果未能解决你的问题,请参考以下文章

无需 Oauth 令牌即可访问 Google 电子表格 API

代理、包装器或外观类之间有啥区别

如何使用 Google API 进行离线访问

Point云库API的语言支持

Google API Oauth php 永久访问

Qt、多重继承、包装器或事件过滤器