摘要
搜索指数,是以各大搜索网站海量网民行为数据作为基础的数据分析统计结果,是衡量词条搜索热度的重要指标,对数据分析具有重要的参考价值。本文详细介绍了一个基于Python的网络关键字热度获取工具的研究与实现过程,用以获取现有指数平台的指数数据。文中以搜狗指数、微信媒体指数为例,详细叙述了如何寻找URL入口、获取并解析数据、以及如何清洗数据的技术与方法。测试结果表明,该爬虫工具可以准确地获取目标关键字在自定义时间段内的指数热度情况,具有实用价值。
【关键词】Python 爬虫 指数 数据获取
搜索指数,是指以网民的搜索行为为基础,对其搜索内容以及搜索次数进行统计分析,得出的该目标关键字被搜索的频次。搜索指数不仅可以反映出某关键字在特定网站的搜索规模,还可以反应出该时间段内热度涨跌态势,准确及时反映突发事件网络舆情的变化情况。搜索指数的出现,对市场分析与决策具有重要且深远的意义。
网络爬虫(Web Crawler)技术是一种快速获取搜索指数相关信息的全新手段。本文在概述网络爬虫关键技术的基础上,以“搜狗搜索”为研究对象,详细介绍了一款基于网络爬虫技术的搜索指数获取工具的研究与实现。
1 关键技术
1.1 Python爬虫
Python是一款开源的,可以运行在任何主流操作系统中的解释性高级编程语言。Python简洁的语法可以高效的节约开发者的开发时间以及开发成本。网络爬虫是用来获取网络数据的重要工具。关于网络爬虫技术的研究不计其数。爬虫程序使用Python的一个重要因素,就是Python为爬虫开发提供了丰富的标准库以及强大的第三方库。爬虫程序完全模拟浏览器访问网站的流程,首先使用requests库请求网站,得到网站所有的HTML数据,Requests的Get,Post等四种请求方式,包括了所有的HTTP/HTPPS的请求方式,比其他语言(C、C++、Java)方便快捷。然后辨别返回的结果,如果返回的是HTML格式的数据,则可以使用lxml库去解析网页,通过节点提取等一些常规方法,提取出真正需要的数据。如果返回的是json格式的数据,则可以通过json解析获取数据。这两步包含了数据抓取的核心的部分,基本可以得到想要的数据。
1.2 通用爬虫工作流程
网络爬虫的基本工作流程如下:
(1)选取合适的起始URL,放入URL队列;
(2)从待爬取URL队列中取出URL,由网页下载模块下载URL对应的网页HTML,传递给数据解析模块之后将URL放进己爬取URL队列;
(3)数据解析模块解析收到的HTML,查找标签,提取出标签内所需数据,传递至数据清洗模块,经提取后将URL传递至URL调度模块;
(4)调度模块收到解析模块传递过来的URL后,将其和己抓取的URL队列对比,进行去重处理,筛选出未爬取的URL放入待爬取URL队列;
(5)网络爬虫系统在2~4步循环,直到待爬取队列中的URL全部爬取完毕,或者用户终止进程;
(6)数据清洗模块发现并纠正数据文件中可识别的错误,最终将数据存入数据库。
2 研究对象、数据来源及目标
2.1 研究对象
指数平台是新型的平民化的数据展示平台,他旨在普及大数据在民众日常生活中的使用。搜狗指数是以搜狗搜索平台上海量网民行为数据为基础的数据分享平台,为用户提供数据支持。本文以搜狗指数为研究对象,详细描述网络爬虫技术的应用方法。
数据来源:此次研究为搜狗指数,实现定向爬取,目标地址为http://sogou.index.com(搜狗指数官网)。
2.2 爬取目标
本文以爬取搜狗指数网站“我不是药神”词条为案例,详述通过网络爬虫技术获取“我不是药神”的搜狗指数的过程与方法,以及在爬取数据过程中會出现的问题和解决策略。
3 实现过程与技术难点
3.1 数据搜索入口URL
目标地址为http://index.sogou.com(搜狗指数)与其他网站相比具有特殊性,即数据请求接口为独立网址,需通过抓包的方式获取精确的数据接口并传入需求数据:接口为http://index.sogou.com/getDateData,需传入的数据为:关键字(keyword),起始日期(start_date),结束日期(end_date),代码如下:
import datetime
oft=“http://index.sogou.com/getDateData”
#把数据的字符串类型的时间转换成时间格式
params={
"kwdNamesStr":keyword,
"start])ate":start_date,
"endDate":end_date,
"dataType":"SEARCH_ALL",
"queryType":"INPUT",
}
五个字段从上到下的含义分别为:
"kwdNamesStr":搜索的关键字,"startDate":请求数据的起始日期,"endDate"::请求数据的起始日期,"dataType":请求的数据类型,"queryType"查询的方式。
3.2 获取网页数据
使用requests的get方法。requests的get方法将传入数据写进字典格式的数据结构并传给requests方法的params字段。该网站的请求必须有浏览器信息,所以需要给请求添加请求头,模仿浏览器对网站进行访问。请求成功之后,返回的数据为json字符串,目标数据包含在其中,实现代码如下:
import requests
HEADERS={
"Accept":"*/*",
"Accept-Encoding":"gzip,deflate",
"Accept-Language":"zh-CN,zh;q-0.9",
"Connection":"keep-alive",
"Host":"index.sogou.com",
"User-Agent":"Mozilla/5.0(Windows NT6.1;Win64;x64)AppleWebKit/537.36(KHTML,like Gecko)Chrome/62.0.3202.75 Safari/537.36",
}
#防止程序假死,添加请求超时
web_data=requests.get(URL,headers=HEADERS,params=params,timeout=30)
return web_data
3.3 解析数据
通过解析得到的是]son字符串,所以需要把将其转换成lson匹配的数据类型,然后使用Python的字典数据获取方法,得到目标数据。搜狗指数包含在data字段的pvList中,取两次key-value值即可获得目标数据,代码如下:
import json
detail_data=json.loads(web_data.content)
date_datas=detail data["data"]["pvList"]
if not data_datas:
return
3.4 數妮清洗与整理
前几步工作获取的数据格式不规范,接下来对数据进行重新整理,日期改写成:‘2018-01-01’格式,指数数值改写为int类型。将最终的数据保存到一个列表数据结构中返回给用户,代码如下:
result=[]
for date_data in date_datas:
for each_data in date_data:
year=str(each_data["date"])[0:4]
month=str(each_data["date"])[4:6]
day=str(each_data["date"])[6:8]
dates=year+"-"+month+"-"+day
result_each_data=dates,int(each_data["pv"])
result.append(result_each_data)
return result
最后,将获取的数据存储于非关系型数据库MongoDB中。
3.5 数据验证
查询电影“我不是药神”上映前后两天与上映当天数据,日期为2018.7.3-2018.7.7的具体数据,得到的结果为:
[("2018-07-03",70808),("2018-07-04",132629),("2018-07-05",283926),("2018-07-06",472971),("2018-07-07",587893),],与网站完全相同,表明程序通过测试。
3.6 技术难点
搜狗指数网站在阻止爬虫工具爬取数据方面十分严格,如何绕过防护是工具开发的技术难点。开发者需要全面伪装爬虫程序,将解析格式、主机地址等详细信息写入请求头,保证网站获取的访问请求是一个正常的用户访问,以保证数据的正确性和完整性。
4 结语
本文构建了基于Python的抓取搜狗指数的爬虫工具,抓取电影“我不是药神”上映前后两天与当天网民搜索行为数据。爬取数据与搜狗指数网站公布数据完全相同,表明通过该爬虫可以高效快捷的得到所有数据,高效的为数据研究提供真实数据。
参考文献
[1]陈涛,林杰.基于搜索引擎关注度的网络舆情时空演化比较分析-以谷歌趋势和百度指数比较为例[J].情报杂志,2013,32(03):7-10,16.
[2]于娟,刘强.主题网络爬虫研究综述[J].计算机工程与科学,2015,37(02):231-237.
[3]陈政伊,袁云静,贺月锦等.基于Python的微博爬虫系统研究[J].大众科技,2017,19(08):8-11.
[4]PINKERTON B.Finding what people want:experiences with the WebCrawler[EB/OL].[2010-10-10].http://www.webir.org/resoruces/phd/pinkerton_2000.pdf.
[5]AHMADI-ABKENARI F,SELAMAT A.An architecture for a focusedtrend parallel Web crawler withthe application of clickstreamanalysis[J].Information Sciences,2012,184(01):266-281.
[6]周立柱,林玲.聚焦爬虫技术研究综述[J].计算机应用,2005,25(09):1965-1969.
[7]李斌译.RICHARD L.用Python写网络爬虫[M].北京:人民邮电出版社,2016.