批量爬取Google Trends的日频数据,实现EXCEL实时存储

项目背景

Google Trends (谷歌趋势)除了在营销方面有很大的用途,还可以帮助用户衡量品牌知名度、为商务旅行做准备、判定新市场、跟踪科技趋势并协助你更好地与受众沟通。除此之外,GT在学界也广受追捧,当然除了其本身所具有涵盖全球检索共性的特征之外,也可能是国内的某度同款产品的使用限制,不得已而为之。

尽管,在CSND论坛有很多关于Google Trend的帖子,但是大部分都以原理讲述尾注,很少有博文系统将词频的批量爬取,到后期的存储整理,系统性的整理。基于此,本文以前辈们的工作为基础,构建一个流程化的批量词频爬取,存储系统。
  

一、工具准备

当然了,要使用Google Trend 进行关键词词频检索,首先要准备一个梯子。至于怎么去搭建这样一个梯子,博主在此不做过多的解释。毕竟,前不久,有新闻说爬墙头被请喝茶,ennn。所以在此假设,各位已经准备了这一步

批量爬取Google Trends的日频数据,实现EXCEL实时存储_第1张图片
Hmmm, 打开后的界面就是上面这个样子!
  

二、查看URL,以及主要的参数

首先,我们在搜索栏中随机输入一个Keyword,捕捉url中的相关参数设计和结构。博主在Google Trends中输入NBA,然后,就跳转到下面的页面。

批量爬取Google Trends的日频数据,实现EXCEL实时存储_第2张图片
然后,我们使用Chrome浏览器的右键–检查的选项,点开之后,找到Network的选项,此时,可能什么都没有出现。不用担心,然后我们使用F5刷新一下页面,就会出现该网页的对应网络元素,如下图。(老司机们可能已经熟悉了这些无聊的操作,莫喷,只为了规范需要老司机可直接跳到第三步。
批量爬取Google Trends的日频数据,实现EXCEL实时存储_第3张图片
再然后,逐个检查并识别有效地URL,那该怎么找呢??Hmm,当然是查看对应URLResponse这里通过Preview也可以,不过是换了个形式来看返回的结果)。经过博主十分辛苦的查找(实际上也参照了相关的资料),终于:被机智的我发现了),见下图。
批量爬取Google Trends的日频数据,实现EXCEL实时存储_第4张图片
注意,尽管我们找到了,可能的URL,但同时发现了一个很困惑的问题。就是图中的绿色方框圈出的部分。我们发现,此时返回的结果是周频的数据,而我们的目的是搜索日频的数据。

带着这个问题,我们继续查看该Response对应的URL结构,如下图
批量爬取Google Trends的日频数据,实现EXCEL实时存储_第5张图片
URL中的主要参数信息
批量爬取Google Trends的日频数据,实现EXCEL实时存储_第6张图片
我们发现,URL中的参数主要包括四个部分:ht, tz, req,和token

其中,经过变换网页可以发现ht, tz这两个参数是不变的, req是根据我们的需求生成的参数,最后,还有一个重要的token参数。

Token是在服务端产生的。如果前端使用用户名和密码向服务端发送请求认证,服务端认证成功,那么在服务端会返回Token给前端。前端可以在每次请求的时候带上Token证明自己的合法地位。如果Token在服务端持久化,那他就是一个永久的身份令牌。

根据token参数的定义,我们得知,token参数是由服务端随机生成的。博主的理解是,这个token参数跟req的参数是匹配的,并且有服务端的主机提供。因此,博主猜测,应该还有一条URL专门负责token参数的获取。

于是,我继续寻找,看看是否其他的返回值中包括参参数APP6_UEAAAAAXs4kzR2BydudrdpjaVcAEjwEeKIbf5in

果然,找到了另一条URL,其返回结果中包括token参数
批量爬取Google Trends的日频数据,实现EXCEL实时存储_第7张图片
至此, URL结构中的主要参数已经寻找完成 。req字典结构中有需要资助设置的地方,这个其实很简单,可以自行探索。

回归正题,我们还有一个问题没有解决,就是返回的数据是周频的问题。实际上,博主经过调试发现,当搜索区间设置为一年的时候,URL返回的数据是周频的;当搜索区间设置为半年以及以下的时候,URL返回的数据是日频的。,所以,我们在设置的时候可以以半年为单位,把时间进行分割。
  

三、定义参数,构建URL

1. 导入我们所需要的模块

主要用的模块如下,模块功能不做具体介绍,跟着走就完事了

import requests
import json
from  openpyxl import load_workbook
import  time

2. 构建token参数提取函数

def get_token(keyword):
  headers = {
     
    'user-agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.163 Safari/537.36',
    'x-client-data': 'CIu2yQEIo7bJAQjEtskBCKmdygEIy67KAQjQr8oBCLywygEIl7XKAQjttcoBCI66ygEYx7fKAQ==',
    'referer': 'https://trends.google.com/trends/explore?date=today%201-m&q=bitcoin,blockchain,eth',
    'cookie': '__utmc=10102256; __utma=10102256.31392724.1583402727.1586332529.1586398363.11; __utmz=10102256.1586398363.11.11.utmcsr=shimo.im|utmccn=(referral)|utmcmd=referral|utmcct=/docs/qxW86VTXr8DK6HJX; __utmt=1; __utmb=10102256.9.9.1586398779015; ANID=AHWqTUlRutPWkqC3UpC_-5XoYk6zqoDW3RQX5ePFhLykky73kQ0BpL32ATvqV3O0; CONSENT=WP.284bc1; NID=202=xLozp9-VAAGa2d3d9-cqyqmRjW9nu1zmK0j50IM4pdzJ6wpWTO_Z49JN8W0s1OJ8bySeirh7pSMew1WdqRF890iJLX4HQwwvVkRZ7zwsBDxzeHIx8MOWf27jF0mVCxktZX6OmMmSA0txa0zyJ_AJ3i9gmtEdLeopK5BO3X0LWRA; 1P_JAR=2020-4-9-2'
  }

  url = 'https://trends.google.com/trends/api/explore?hl=zh-CN&tz=-480&req={
     {"comparisonItem":[{
     {"keyword":"{}","geo":"","time":"2019-12-31 2020-05-22"}}],"category":0,"property":""}}&tz=-480'.format(keyword)
  # print(url)
  r = requests.get(url, headers=headers,timeout=15)
  # print(r.text[:])
  # print(r.text[5:])
  data = json.loads(r.text[5:])
  # print(data)
  req = data['widgets'][0]['request']
  # print(req)
  token = data['widgets'][0]['token']
  # print(token)
  result = {
     'req':req,'token':token}
  return result

3. 构建Google Trends数据提取函数

def google(keyword,j):
  """谷歌指数"""
  info = get_token(keyword)
  req = info['req']
  token = info['token']
  url = 'https://trends.google.com/trends/api/widgetdata/multiline?hl=zh-CN&tz=-480&req={}&token={}&tz=-480'.format(req, token)
  r = requests.get(url)
  # print(r.text)
  if r.status_code == 200:
    data = json.loads(r.text.encode().decode('unicode_escape')[6:])['default']['timelineData']
    # print(data)
    timestamp=[]
    value=[]
    keyword = keyword
    for data_e in data:
      # timestamp = int(data_e['time']) * 1000
      timestampstr = int(data_e['time'])
      timestampstr = TimeTrans(timestampstr)
      valuenum = data_e['value'][0]
      # print(timestamp, value, keyword)
      timestamp.append(timestampstr)
      value.append(valuenum)

    data_trend = {
     "time":timestamp,keyword:value}
    print(data_trend)
    writeDataToExcleFile(data_trend,j)

这里,补充一下,时间戳解析函数

def TimeTrans(timenum):
    timeStamp = timenum
    timeArray = time.localtime(timeStamp)
    otherStyleTime = time.strftime("%Y/%m/%d", timeArray)
    return otherStyleTime

4.构建函数,将数据写入EXCEL

def writeDataToExcleFile(data_trend,j):
  # wb=Workbook()
  # sheet = wb.active()
  wk = load_workbook('datadata.xlsx')
  wk_name = wk.sheetnames
  wk_sheet = wk[wk_name[0]]

  # ws=wb['Sheet1']
  # sheet.title = 'sheet1'
  key1name = list(data_trend.keys())[0]
  key2name = list(data_trend.keys())[1]

  for i in range(len(data_trend[key1name])):
     if j==1:
         wk_sheet.cell(row=1,column=1,value=key1name)
         wk_sheet.cell(row=i+1, column=1, value=data_trend[key1name][i])
     wk_sheet.cell(row=1,column=j+1,value=key2name)
     wk_sheet.cell(row=i+1,column=j+1,value=data_trend[key2name][i])
  wk.save('datadata.xlsx')

四、LET’S DO IT!

1. 执行"main" 大法

if __name__== "__main__":
   inputdata = ['NBA','Community','Kobe Bean Bryant']
   mian(inputdata)

2. Google Trends爬取过程

批量爬取Google Trends的日频数据,实现EXCEL实时存储_第8张图片

3. 供上效果图

批量爬取Google Trends的日频数据,实现EXCEL实时存储_第9张图片

NOTE: 上面我只做了爬取近半年的词频数据,如果要爬取更长时间跨区的日频数据,需要另外添加时间循环模块。

Okay,今天就到这里。我会将数据挖掘,机器学习等一些有意思的案例放上来,大家一起学习,感谢各位支持!

你可能感兴趣的:(python,大数据,数据分析)