Доступ к данным Google Trends без оболочки или с помощью API: Python - PullRequest
2 голосов
/ 28 мая 2019

Я пытаюсь написать программу на Python для сбора данных из Google Trends (GT) - в частности, я хочу автоматически открывать URL-адреса и получать доступ к определенным значениям, отображаемым в линейных графиках:

enter image description here

Я был бы рад загрузить CSV-файлы или просмотреть значения в Интернете (исходя из моего чтения Inspect Element, очистка данных потребует только простого разделения или двух).У меня много поисков, которые я хочу провести (много разных ключевых слов)

Я создаю много URL-адресов для сбора данных из Google Trends.Я использовал реальный URL из тестового поиска.Пример URL: https://trends.google.com/trends/explore?q=sports%20cars&geo=US При физическом поиске этого URL в браузере отображается соответствующая страница GT.Проблема возникает, когда я пытаюсь получить к ней доступ через программу.

Большинство ответов, которые я видел, предлагают использовать общедоступные модули из Pip (например, PyTrends и «Неофициальный API Google Trends») - мой менеджер проекта настоял, чтобы я делалне используйте модули, которые не созданы непосредственно сайтом (т. е. API приемлемы, но только официальный API Google).Только BeautifulSoup был санкционирован как плагин (не спрашивайте почему).

Ниже приведен пример кода, который я пробовал.Я знаю, что это простой, но по самому первому запросу я получил:

HTTPError: HTTP Error 429: unknown ": слишком много запросов.

В некоторых ответах на другие вопросы упоминается API Google Trends - это реально? Я не смог найти никакой документации по официальному 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

1 Ответ

0 голосов
/ 29 мая 2019

Он использует 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'

Вам необходимо выяснить, насколько переносимые элементы из этого.

Например, я посмотрел на поисковый запрос банан , и это было результатом:

без кавычек:

'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'
...