Python爬虫-抓取搜狗指数

说明

代码在这 GitHub-sogouIndex
学这篇文章的内容你需要:

requests模块
然后你还需要会dict、list,一点基础也可以,我不敢保证人人能看懂


正文

运行结果

本想输出表格形式,可能脑子不够用,懒得想了就放弃了,这样也可以(自我感觉)(:

来分析分析网页,链接在这http://index.sogou.com,打开网址,是这样的

其实之前是准备搞百度的,谁知这家伙搜索还要登录,然后登录又要费时间,索性就放弃百度了,搜狗不需要登录,这很爽

先随便搜一个关键字吧,比如python

我之前看有人爬百度指数的时候他说百度的结果用了什么很麻烦的设计,但是搜狗指数数据在源码就找得到

但是如果你就这样直接用requests请求后再用正则匹配源码里的数据那你就和我一样成傻子的,我当时也是看到源码,心想:我擦,这么简单,用正则就可以了撒,然后等我代码写完了:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
import requests
import re
import sys

from bs4 import BeautifulSoup

NAME = sys.argv[1]


class SogouIndex:

def __init__(self):
self.url = "http://index.sogou.com/index/searchHeat"
self.params = {
"kwdNameStr": NAME,
"timePeriodType": "MONTH",
"dataType": "SEARCH_ALL",
"queryType": "INPUT",
}
self.headers = {
'User-Agent': 'User-Agent:Mozilla/5.0 (X11; Linux armv7l) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.84 Safari/537.36',
}
self.kwdId = []
self.pv = []
self.date = []

def crawler(self):
...

调试也完了后在网页点了一个“PC趋势”后我瞄了一眼,看到了开发工具有一条请求,点进一看,返回的JSON格式数据,然后我又点了一下“整体趋势”

一样有请求,顺手点了一下,看了看返回结果:

心里一亿只草泥马狂奔。。。。我差点没哭出来,我特么辛辛苦苦写的正则

然后咱们说说步骤把:

1、分析链接参数http://index.sogou.com/getRenderData?kwdNamesStr=python&timePeriodType=MONTH&dataType=SEARCH_ALL&queryType=INPUT,“?”后面的都是参数

kwdNamesStr:关键字
timePeriodType:查询的时间段,分为:周、月、年(WEEK、MONTH、YEAR)记住请求的时候是大写的
dataType:搜索的平台,分为:PC、WAP(移动),SEARCH_ALL表示整体,SEARCH_PC表示PC…
queryType:我也不知道这啥玩意,反正带着请求就好了,没什么印象
2、开始请求

1
2
3
4
5
6
7
params = {
"kwdNameStr": "python",
"timePeriodType": "MONTH",
"dataType": "SEARCH_ALL",
"queryType": "INPUT",
}
resp = requests.get(url, parmas=params)

转成JSON格式更好分析

1
result = resp.json()

pvList:就是我们在http://index.sogou.com/index/searchHeat?kwdNamesStr=python&timePeriodType=MONTH&dataType=SEARCH_ALL&queryType=INPUT里看到的那个趋势图里的数据
infoList:就是这里的数据

topPvDataList:对本文没点用,本身也就没啥用。。。
我们要取的数据就是infoList里的,pvList是详细的,取很简单
infoList里的分析:

ratioWapChain 移动环比
ratioWapMonth 移动同比
avgWapPv 移动搜索指数
ratioChain 整体环比
ratioMonth 整体同比
kwdName 关键字名
avgPv 整体搜索指数/平均值

现来看看infoList的代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
if result: # 确保result里有数据
pvList = result['data']['pvList'][0] # 取出pvList
infoList = result['data']['infoList'][0] # 取出infoList

for pv in pvList:
index.append(pv['pv']) # 取出指数添加到列表index
date.append(pv['date']) # 取出日期添加到列表date

ratioWapChain = infoList['ratioWapChain'] # 移动环比
ratioWapMonth = infoList['ratioWapMonth'] # 移动同比
avgWapPv = infoList['avgWapPv'] # 移动搜索指数
ratioChain = infoList['ratioChain'] # 整体环比
ratioMonth = infoList['ratioMonth'] # 整体同比
kwdName = infoList['kwdName'] # 关键字名
avgPv = infoList['avgPv'] # 整体搜索指数/平均值

ok,完工了,然后你们自己完善,或者看看我的源码也可以,虽然不是什么很牛b的程序,哈哈哈