本篇目标
为了计算某个明星的一段时间综合热度,需要爬取该明星的百度指数、腾讯指数、搜狗指数。当然也可以应用在其他词条的热度啦,这里的时间设置是2019.01.01-2019.03.31,可自行设置所需时间。
以搜狗指数为例:name是所要搜索词条,allweixin是爬取结果
输入输出文件 name文件
百度指数
搜狗指数:这里的目标是得到平均值,官网上鼠标悬浮的时候会显示平均值,但这里截图无法显示。
image.png
腾讯指数
环境及导入库说明
- python版本:2.7.9
- 需要安装的库:request
- 其他库说明:其他导入的库都是自带的,csv用于读取存储csv文件(文本格式,但是可用excel打开),
os用于操作文件目录,sys用于处理python的一些设置
# -*- coding: utf-8 -*-
import csv
import os
import requests, json
import sys
reload(sys)
sys.setdefaultencoding('utf8')
百度指数
搜狗指数
-
第一步是找到我们要的数据在哪里。如果查看源代码源代码里没有所要的数据,就说明这个数据是动态加载的,所以要找到我们所在的数据是由哪个请求发出的,以及在返回数据的哪个部分。这里是ajax请求,打开开发者工具(谷歌浏览器快捷键是ctrl+shift+I),ajax请求一般是在Network的XHR请求部分,打开后根据你要的数据在网页上操作,比如这里搜李汶翰的指数可以再点下确定,就会发现多了个请求,这个请求一般就是所要数据所在的请求,这里我们要的值在avgPv这里
image.png - 找到之后,就可以模拟发请求了
其中cookie可以在headers里找,具体参见之前的文章《python-新浪爬虫之模拟登录》
def get_windex(index_list):
'''
获取微信指数
输入示例
index_list = ['李汶翰','赵品霖']
输出,avg代表对应微信指数值
data_list = ['name':'李汶翰','avg': 0]
'''
headers = {
'user-agent': "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36",
'cache-control': "no-cache",
#这里的cookie可以在headers里找到粘贴过来
'cookie':''
}
data_list = []
for name in index_list:
#去除名字空格
name = name.strip()
#这里的时间取20190101到20190331,在startDate是开始时间,endDate是结束时间
url = 'http://zhishu.sogou.com/getDateData?kwdNamesStr=%s&startDate=20190101&endDate=20190331&dataType=SEARCH_ALL&queryType=INPUT'%name
response = requests.get(url, headers = headers)
content = json.loads(response.text)
data = {}
#python2本身内部代码的编码有str和unicode两种编码,然而文件写入到windows系统时候,windows上的是gb2312编码,所以就导致了乱码问题
#所以写入中文字符的时候,先把python里面的中文字符串decode成utf-8,再encode为gbk编码
data['name'] = name.decode('utf-8').encode('gbk')
try:
data['avg'] = content['data']['infoList'][0]['avgPv']
data_list.append(data)
#搜索不到或者出错指数值设为0
except Exception, e:
if hasattr(e, "code"):
print e.code
if hasattr(e, "reason"):
print e.reason
data['avg'] = 0
data_list.append(data)
continue
#新建allweixin.csv,并将结果写入
fieldnames = ['name','avg']
file2 = 'H:/shixi/result/allweixin.csv'
main_file = operate_file(file2,fieldnames)
main_file.creat_csv()
main_file.write_csv(data_list)
#封装了一个读写csv的类
class operate_file():
def __init__(self, file, fieldnames):
self.fieldnames = fieldnames
self.filename = file
def creat_csv(self):
with open(self.filename, 'wb') as csvfile:
fieldnames = self.fieldnames
writer = csv.DictWriter(csvfile, fieldnames=fieldnames)
writer.writeheader()
def write_csv(self, info_list):
with open(self.filename, 'ab') as csvfile:
fieldnames = self.fieldnames
writer = csv.DictWriter(csvfile, fieldnames=fieldnames)
for hotel in info_list:
try:
writer.writerow(hotel)
except Exception,e:
print e
#print hotel
#print self.fieldnames
if __name__ == "__main__":
index_list = []
file = 'H:/shixi/result/name.csv'
for line in csv.DictReader(open(file)):
index_list.append(line['name'].decode('gbk').encode('utf-8'))
get_windex(index_list)
网友评论