无需包装器或使用 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的主要内容,如果未能解决你的问题,请参考以下文章