基于python的网络爬虫研究①
2020-05-18郭锋锋
郭锋锋
(宿州职业技术学院计算机信息系,安徽 宿州 234000)
1 网络爬虫介绍
网络爬虫,又称蜘蛛机器人,其实质是程序,是抓取网页数据的程序,最终是根据用户需求,在一定规则下,得到用户需要的数据信息。爬虫通常分为通用爬虫和聚焦爬虫,通用爬虫对资源进行全覆盖,没有针对性的数据,返回结果可能包含一些用户不需要的信息,而聚焦爬虫,聚焦某些点,更精确,抓取特定主题的内容,获得相应的信息。聚焦爬虫根据需要抓取的目标描述,用相应的算法分析网页数据,最后对url制定搜索策略,最终一直爬取到自己需要的信息,最终的结果按照要求存储、排序、浏览等。
2 python爬虫框架比较
python作为一种语言,1989年便出现了,一路攀升,近几年热度大增,2019年已经成为仅次于java和c和c++的第四大语言。成为目前最受欢迎的编程语言,目前是作为爬虫领域的第一语言。基于python的爬虫框架很多,目前用的比较多的是scrapy,pyspider,biautifulsoup等等,每种框架在性能和爬行能力上各有不同,下面对几个python爬虫框架进行比较。主要从爬行能力和爬行性能两方面进行比较
表1 几种python爬虫框架比较
3 scrapy爬虫改进
由于scrapy通用开源爬虫框架不能满足我们对特定的内容的抓取,本文主要设计了基于scrapy的开源爬虫框架,用贝叶斯分类器进行主题相关性判定,利用搜索策略在网站中采集网页信息,通过结合dom树的分块聚类算法解析网页内容,通过解析出来的网页内容更新当前网页节点权值,通过主题相关相似性模块对子urls进行链接权值的计算,然后根据结点队列中网页关系计算结点权值,通过计算,使用过滤模块淘汰掉结点权值低于urls的内容。优化scrapy框架下的url去重,下面对系统几个重要模块进行说明。
贝叶斯分类的定义
1)设x={a1,a2,…,am}为一个集合,其中a1-am为x的一个属性。
2)有类别集合C={y1,y2,…,yn}。
3)接下来逐一计算概率P(y1|x),P(y2|x),…,P(yn|x)。
4)求最大概率。则X属于概率最大的类别P(yk|x)=max{P(y1|x),P(y2|x),…,P(yn|x)},则x∈yk。
根据贝叶斯定理,要求P(Y|X),求出P(X|Y) 就可以.这里Y相当于A,X相当于B.把B分解为各个属性,求出每个类别的属性即可,如下
1)找到一个训练样本集。
2)训练样本集是已知分类的待分类项集合。
3)经过统计计算出条件概率估计。即
P(a1|y1),P(a2|y1),…,P(am|y1);P(a1|y2),
P(a2|y2),…,P(am|y2);…;P(a1|yn),
P(a2|yn),…,P(am|yn)
4)如果各个特征属性是条件独立的,则:
因为分母P(x)为常数,所以将分子最大化即可。又因为各特征属性是条件独立的,所以有:
P(x|yi)P(yi)=P(a1|yi)P(a2|yi)…
利用贝叶斯分类器进行主题相关性的判定,属于类别的特征属性的例子越多,权值越大,主题相关性就越大。
重点介绍本系统涉及的几个重要模块,画出几个重要的算法流程图
本爬虫系统主要涉及爬虫模块、下载模块、解析存储模块、过滤和去重模块以及数据库存储模块等模块。每个模块的作用如下:爬虫模块的作用是用本文的搜索策略在网页采集信息,主体相关性分析算法利用贝叶斯分类对链接进行权重计算,下载模块是把爬取的网页结构下载下来,解析存储模块是把解析的内容存储起来把链接送到队列调度,过滤和去重模块负责调度和去重操作,数据库存储模块是把爬取的内容接收存储到数据库中。
通用爬虫原理图如下:
图1 通用爬虫系统
图2 链接处理图
爬虫系统中的url链接去重、过滤是本爬虫系统中重要的内容,对于链接的过滤是对抓到的网页淘汰掉一部分链接,具体原理为,抓取网页后,通过主体相关性算法计算出新的urls的权重,然后把此权重值与预设的临界值进行对比,如果此权重值大于临界值则为相关链接加入到url队列,否则直接淘汰掉此链接。
过滤后对url去重方法可以有hash表,set,布隆过滤器等。利用两个hash表便可以进行去重操作,一个hash表用来记录正访问抓取的filename,另一个hash表用来存放抓取过的host,另外用数据库存储url,通过判定网页里的链接是否指向当前网站,决定继续抓取还是结束。在爬虫中,已经爬取的url链接会被记录,新的url会比对判断是否在已经被记录的集合中,若存放链接的集合记录数量大,所需要的存储空间相应巨大,此时可用布隆过滤器来解决。本文采用基于hash存储的去重方法即可。下图为链接处理流程图。
基于分块聚类的网页解析算法在爬虫系统的实现中网页解析起到重要作用,网页解析算法用到了结合dom树的分块算法,dom树中的结构信息提供给算法文本,标签等提示。基于密度定义的聚类算法可以处理噪声能力,不足之处在于对象类之间差异较大时,效果不好。 以基于dom树分块算法为核心,基于scrapy爬虫框架,设计基于scrapy的爬虫系统,爬虫对获得的url链接进行相关性判断,接下来用分块算法对网页结构进行解析,根据urls链接权重,把不相关的urls去掉,最后留下的交给引擎处理。下图给出scrapy爬虫框架和改进后的爬虫框架图。
图3 scrapy的整体架构
通用爬虫架构描述了scrapy的各个组件和数据流情况图。
Scrapy engine:引擎是核心,相当于计算机的cpu,控制整个数据和信号的传递处理。
Scheduler:调度器作用是把引擎发送过来的请求requests存储在队列中,交给下载器。
Downloader:下载器是爬虫系统与互联网连接的组件,通过核心组件引擎,获取响应结果(responses)交给爬虫组件处理。
Spiders:接收从下载器模块传递过来的信息,分析获得item即自己需要的信息,获取数据和urls,然后将获取内容送给item pipeline。
Item pipeline:处理从爬虫获得的数据和urls,处理网页数据。
Downloader:下载器中间件起到桥梁作用,处理引擎和下载器之间的请求和响应。
对于scrapy架构,它的爬虫和项目管道模块可以自由编写,图4为改进后的结构图,改进后的结构图比之前的框架多了个贝叶斯分类计算主题相关性模块,连接加到爬虫模块中以实现精确的爬取需求。此模块的核心是主题相关性分析。用贝叶斯分类器进行主题相关性分析,网页解析用分块算法,用过滤模块淘汰掉部分urls,获得需要的网页内容,最终回传爬虫模块。
图4 改进后的整体架构
4 系统测试
基于以上算法流程图,设计基于python的scrapy改进爬虫系统,系统测试要求如下:
操作系统:Windows
处理器:要求900MHZ以上
RAM:2G或以上
存储:64G
软件:python3 Mysqlv5.6以上 redis server v3.2及以上
通过对主题词宿州 城市发展 政治 经济 文化 成果 成绩 文化 收入 等对相关网页的网页进行抓取,衡量指标以查准率和耗时来衡量,性能比较结果如下:
表2 爬虫算法抓取300个网页情况
表3 爬虫算法抓取8000个网页情况
5 结 论
介绍了目前较火的python语言,以及爬虫框架系统,可以提取很多类型的网站数据,通过配置好一定的实验环境,设定主题词,对相关网页进行抓取,通过改进scrapy框架下的url过滤、基于hash表的去重算法,通过新算法抓取不同数目的网页链接入手,新提出的爬虫算法查准率更高,时间更短,有良好的性能,能更快的得到和用户要求主题一致的网页。对以后的爬虫研究有借鉴作用。另外,只是提取了源网页的部分链接,更深层次内容的获取将有待进一步研究。