大数据环境下的网络爬虫设计*
2018-05-14郭丽蓉
郭丽蓉
(山西警察学院 网络安全保卫系,山西 太原 030021)
0 引言
随着网络的普遍应用以及移动终端的发展,人们越来越离不开网络,据CNNIC统计,截至2017年12月,中国网民规模达到7.72亿,其中手机网民比例高达97.5%[1],网络给人们的工作、生活、学习等方式带来了极大的便利,比如网络办公、出行网约、吃饭外卖、上课MOOC等,大家乐在其中,在使用网络的过程中用户在网络中也会产生一系列的数据,比如,用户每天的生活轨迹在手机全天候的打开GPS的情况下,手机上的某地图通常会自动根据用户的轨迹分析比如用户大概经过多长时间到达公司等,同时,网络也会随时随地提供大量的数据供用户使用,用户一般会使用自己习惯使用的搜索引擎搜索自己需要的内容,但又往往需要从搜索结果中进行仔细鉴别,因此,如何从海量数据中精确搜索到需要的信息,可专门设计针对某一主题的搜索工具——网络爬虫。大数据时代的来临,使得网络爬虫在网络应用中的地位越来越重要。
网络爬虫,又称网络蜘蛛,是一种能够按照预定的规则自动获取网页内容的程序脚本。根据实现的技术和结构可以分为通用型、聚焦型、增量式、深层网络爬虫等类型。通过爬虫能够为大数据分析提供更高质量的数据源[2]。
1 Python语言介绍
Python是一种面向对象的解释型计算机程序设计语言,其源代码开放,语法简洁清晰,可读性强,移植性强,目前在机器学习及人工智能等领域应用比较多的一门语言。据统计,目前Python语言已经处于最受欢迎的编程语言前三位。国际上排名前100名的高校开设Python程序设计课程的比例达80%,国内众多高校也在构建基于Python语言的教学体系[3]。
此外,Python语言对异常的处理可以让用户正确地捕获到程序代码所发生的错误,其内置的数据结构满足对不同数据的处理,丰富的第三方库为快速创建网络程序提供了基础,其程序代码可以嵌入到许多计算机语言中还允许加入其它,比如用C或C++编写的模块等特性[4]。
2 爬虫设计案例
本文通过对我院校园网招聘信息进行汇总,如果每次都下载网页或者通过复制粘贴等方式去实现,费时费力,而开发一个简单的爬虫来实现招聘信息的自动下载,提高了工作效率,具体实施过程如下:
1) 制定爬虫功能:实现校园网招聘信息的自动下载。
2) 爬虫实现过程分析:决定开发爬虫的工具以及如何实现。
基于Python的诸多优点,使用Python设计爬虫,根据爬虫的功能,需要确定网页初始URL,在招聘信息不止一页的情况下,分析URL特点得到URL列表,分析每个URL地址中的链接并获取其内容,将其以.txt的文件形式保存到本地硬盘。
3) 爬虫具体实现,必要的地方已加注释说明
Python的特点之一即是拥有丰富而强大的基本库及第三方库的支持,根据该爬虫的功能需要对网页进行获取以及解析,并对相关内容以文件的形式进行保存,需要的库有ruquests、lxml以及os库,故将其导入(代码如下)。
import requests
from lxml import etree
import os
根据该爬虫功能是将校园网的招聘信息自动下载,首要的是对网页URL进行分析,通过对比分析发现,招聘信息共28页,特征前面均为http://222.31.20.3/department/zjzx/html/list_1685_ 后面加上页数即是真正的URL,但是最后一页的URL却不是http://222.31.20.3/department/zjzx/html/list_1685_28.html,而是http://222.31.20.3/department/zjzx/html/list_1685.html ,所以需要用条件来进行对网页URL的判断,通过循环来实现对每一个页面的获取(代码如下)。
for i in range(28,-1,-1):
if i!=0:
link="http://222.31.20.3/department/zjzx/html/list_1685_"+str(i)+".html"
else:
link="http://222.31.20.3/department/zjzx/html/list_1685.html"
#模拟浏览器头部信息。
headers={"User-Agent":"Mozilla/5.0 (Windows NT 6.1)
#调用requests库的get方法获取网页内容。
r=requests.get(link,headers=headers)
#调用lxml库的etree中的HTML对内容进行解析,使用xpath方法获取相应标签的内容,此处关键是识别标签,通过F12检查器找到标签进行识别或者直接右键copy xpath均可。
root=etree.HTML(r.content)
job_list=root.xpath("//div[@class='newslist']/ul/li/h2/a")
for job in job_list:
#识别每条招聘信息的链接及标题
href=job.xpath("@href")[0]
title=job.xpath("@title")[0]
print(title,href)
#构建每一条招聘信息的URL
url="http://222.31.20.3/"+href
#解析每条招聘信息URL
response=requests.get(url,headers=headers)
root1=etree.HTML(response.content)
#分别获取每条招聘信息的发布日期、标题以及具体招聘要求。
date=root1.xpath("//div[@class='mess']/span/text()")[0]
title=root1.xpath("//div[@class='name']/text()")[0]
cont=root1.xpath("//*[@id='MyContent']/p/text()")
#使用遍历列表的方法将每条招聘信息保存到对应的文件,为了更好的识别每条招聘信息,文件名以日期+标题命名,便于统计。
for c in cont:
if os.path.exists("d:/zsjy/"):
pass
else:
os.mkdir('d:/zsjy/')
f=open("d:/zsjy/"+date+title+".txt","a",encoding="utf-8")
f.write(c)
f.close()
以上代码在编辑中需严格遵循Python的缩进规则,方可正确运行。
4) 结果比较(因数据量大,截取部分数据)
图1为原始网页信息、图2爬虫运行过程中输出网页信息、图3为保存结果、图4为打开某个招聘文件,通过比较,该爬虫运行正常。
图1 原始网页信息界面
3 结束语
本文只是实现了一个简单的爬虫,如果遇到爬虫爬取的数据量大,功能性要求更高,速度要求更快的情况下,可以使用Python的框架实现,比如使用Scrapy,其提供了basic、crawl、csvfeed、xmlfeed等实现相应爬虫的模板,为开发者节省更多的时间和代码,在时间性能上,可以使用多线程、多进程等来提高爬虫速度,使用代理来反反爬虫等,来尽可能提高爬虫的性能。但是在实际开发使用爬虫的过程中,一定要注意约束自己的网络爬虫行为,将请求的速度限定在一个合理的范围之内,以免因频繁的对服务器访问导致服务器产生巨大的压力进而封锁IP以及不必要的法律纠纷。
图2 爬虫运行过程中解释器输出的网页信息
图3 保存结果
图4 打开某个招聘文件的内容
[1] 第41次《中国互联网络发展状况统计报告》[Z].中国互联网信息中心,2018.03.
[2] 韦玮. 精通Python网络爬虫[M].北京:机械工业出版社,2017.
[3] 赵广辉.面向新工科的Python程序设计交叉融合案例教学[J].计算机教育,2017(8):27-31.
[4] 刘春茂,裴雨龙. Python程序设计案例课堂[M].北京:清华大学出版社,2017.