收稿日期:2019-03-19
基金项目:江西省经济犯罪侦查与防控技术协同创新中心开放基金项目(JXJZXTCX-030)
作者简介:陈欢(1992-),男,上海工程技术大学电子电气工程学院硕士研究生,研究方向为文本分析、推荐系统;黄勃(1985-),男,上
海工程技术大学电子电气工程学院讲师、江西省经济犯罪侦查与防控技术协同创新中心特聘研究员,研究方向为需求工程、软件工程、形式化方法、人工智能。本文通讯作者:黄勃。
0引言
新闻作为社会事件的记录,是反映日常生活的常见文
体之一,具有十分重要的意义。在互联网时代,网络新闻具有传播速度快、内容多面化、来源多渠道等特点,但在给公众快速提供新闻信息的同时,也因信息量过大导致信息过载,使公众反而无法全面了解新闻事件真相。如何从海量新闻数据中获取高质量新闻信息,帮助新闻用户快速获得自己感兴趣的网络新闻是本文要解决的问题。
网络爬虫又称网络蜘蛛、网络机器人,指按照一定规
则自动从网络上抓取信息的一段程序或者脚本。使用爬
虫技术能够获取海量网络数据并进行结构化存储[1-2]。文献[3]使用主题爬虫的方法对新闻网进行抓取,与本文使用方法不同的是主题爬虫通过网页和主题相关度计算判断网页价值;文献[4]根据网络爬虫原理和爬虫算法,对数据存储等基本信息进行全面、细致的介绍,但未讨论爬虫过程中可能遇到的问题;文献[5]使用Hadoop 增量式更新分布式并行科技进行视频爬虫,考虑链接指向视频内容的情况,在层内使用合并去重的增量式方法,但该方法不适用于本文新闻门户网站;文献[6]使用Scrapy+MySql+Djan ⁃go 进行网络爬虫、存储和查询,在查询方法上与Slor 检索
基于Python 的网络新闻爬虫与检索
陈
欢1,黄
勃
1,2
,刘文竹1,高永彬1,姜晓燕
1
(1.上海工程技术大学电子电气工程学院,上海201620;
2.江西省经济犯罪侦查与防控技术协同创新中心,江西南昌330000)
摘
要:网络上存在众多新闻门户网站,新闻信息繁多,造成严重的新闻信息过载。针对该类问题,设计一个基
于Python 的网络新闻信息搜集与检索系统。该系统通过使用Scrapy 网络爬虫框架进行网络新闻信息搜集,同时对新闻链接、标题进行去重,最后使用Slor 检索服务对爬虫获得的新闻数据进行全文检索。与传统方法相比,该系统设计的去重方法在保证链接不重复的情况下,对标题进行去重,并引入Solr 检索服务,可以帮助读者更快速地到想要阅读的新闻。
关键词:爬虫;信息检索;Scrapy ;Solr ;数据去重DOI :10.11907/rjdk.191232中图分类号:TP393
文献标识码:A
文章编号:1672-7800(2019)005-0168-04
Python-based Web News Crawler and Retrieval
CHEN Huan 1,HUANG Bo 1,2
,LIU Wen-zhu 1,GAO Yong-bin 1,JIANG Xiao-yan 1
(1.School of Electrical and Electronic Engineering ,Shanghai University of Engineering and Technology ,Shanghai 201620,China ;2.Jiangxi Collaborative Innovation Center for Economic Crime Detection and Prevention and Control ,Nanchang 330000,China )Abstract :There are many news portals on the Internet ,and there are many news information which causes serious news information overload.Aiming at this kind of problem ,this paper designs a Python-based network news information collection and retrieval system.The system uses the Scrapy web crawler framework to collect online news information ,and at the same time de-weights the news links and titles ,and finally uses the Slor search service.The full-text search was carried out on the news data obtained by the crawler.Com ⁃pared with the traditional method ,the de-duplication method of the system deduplicates the title without link repeat ,and introduces
the Solr search service ,which can help readers quickly locate the news that they want to read.Key Words :web crawler ;information retrieval ;Scrapy ;Solr ;data deduplication
第5期
方法有较大差距;文献[7]利用WebDriver和Selenium对微博、新闻网站的健康信息进行爬虫,并比较了不同线程下爬虫程序抓取速度,使用该技术可以在一定程度上规避反爬,但会导致爬虫效率低下。
网络新闻媒体的快速发展逐渐取代了传统新闻传播媒介,并且降低了新闻制作和传播成本,由此导致某一事件爆发时,网络上容易产生各种主观性较强的报道,使新闻丧失真实性[8-9]。针对以上问题,本文使用Scrapy爬虫框架收集网络新闻信息,并使用集合去重、查询去重等去重策略,保证每条新闻信息唯一性,同时使用Solr检索服务排序算法,实现新闻内容全文检索。
1网络新闻信息采集
信息采集是收集、检索网络新闻的基础,由于新闻门户网站繁多,系统为了保证数据来源选取几个主流新闻网站进行爬虫研究。爬虫程序的作用包括新闻标题、内容、时间及来源等信息获取。新闻网页相对于其它复杂的网站构成较为简单,本文通过使用正则表达式与Beautiful⁃
Soup库可基本获取目标信息。
1.1基于Scrapy的网络新闻采集
Scrapy是一个健壮的网络框架,支持从各种数据源中抓取数据。Scrapy是一种基于事件的框架,能够将数据清洗、格式化,并进行装饰后存储到数据库中。Scrapy框架包含Scrapy Engine(Scrapy引擎)、Scheduler(调度器)、Down⁃loader(下载器)、Spiders(爬虫)、Item Pipeline(管道),Down⁃loader Middlewares(下载器中间件)等组件[10]。
爬虫过程中需要对URL链接及页面进行分析,以便提高爬虫程序工作效率,例如腾讯新闻每篇文章的链接构成如下‘https://new.qq/cmsn/20190227/201902270099-55.html’,‘https://new.qq/’表示腾讯新闻主页面,‘cmsn’表示文章归属板块,‘20190227’表示文章发布日期,‘2019022700995’表示文章ID。文章内容包含在<p></ p>标签内,文章主题包含在<h1></h1>标签内。使用Beau⁃tifulSoup库可以很容易地获得文章内容、标题等信息。腾讯新闻的详细时间信息、来源信息包含在<script></script>标签内,使用BeautifulSoup库无法解析到目标信息,但是可以通过正则表达式进行匹配。例如匹配新闻时间信息的正则表达式为time=re.findall(b"""pubtime":(.*?),""",source)。
使用Scrapy限制域名的方法使爬取下来的新闻信息更加有针对性,例如腾讯新闻中视频模块不是目标内容,如果也对其进行爬取会导致爬虫资源浪费,降低爬虫程序工作效率。同时设计过滤方法,将依据提取规则提取的特殊字符串进行替换,保证爬取的新闻文本信息不包含其它特殊字符串,特殊字符串在写入JSON文件时会引起错误,导致新闻不能被完整地写入。
1.2增量式网络爬虫
网络新闻更新速度快、内容丰富,为了及时、准确地更新链接库链接与数据库新闻内容,需要设计一种简单有效的去重算法[11]。常见去重算法有Hash去重、BloomFilter去重、利用集合内元素的唯一性去重。Hash去重的基本原理是利用不同的Hash函数如MD5、SHA等,生成Hash索引,通过遍历Hash索引,去除重复数据,即通过把一个比较大的数据集映射到一个比较小的数据集中,以此加快查询速度。随着数据量的增大,利用Hash去重会浪费大量内存[12],因此在Hash去重的基础上引入BloomFileter算法,通过K 个Hash函数将新加入的元素映射成一个位阵列中的K个点,当有一个新元素加入时,通过K个点的值判断其是否存在[13-14]。
爬虫爬取的新闻信息中有许多重复的内容,对爬虫过程去重不能保证数据库某一条信息唯一性。如图1所示,由于该条新闻来自腾讯转载自人民网,导致一条新闻对照多个链接。传统去重方法只是对URL进行去重,无法处理新闻存在一个标题对照多个URL的情况。因此进行Scra⁃
py爬虫去重之后,在存入数据库的过程中执行Sql查询操作决定是否将本条信息插入到数据库中。Sql查询语句为:
)
图1<script>标签中的文章信息
2使用Solr检索服务的新闻数据检索
Solr是Apache基金会开源搜索引擎库Lucene下的子项目,Lucene是一种基于Java语言的开源信息检索库,Solr 在Lucene的基础上进一步扩展,包含丰富的查询语言,功能也更加完善,擅长处理以文本为中心、读为主导、面向文档且具有灵活模式的数据,其在数据检索速度方面远远快于MySQL查询语言,并且可以实现模糊匹配[15-16]。
2.1Solr排序算法
传统数据库查询对用户输入进行精确匹配,如果不到任何精确匹配结果,则没有返回内容。在文本类查询中,简单利用字符串匹配,会使查询效率低下,在本文实验
陈欢,黄勃,刘文竹,等:基于Python的网络新闻爬虫与检索·
·169
软件导刊2019年
中随着新闻文本数量的增加,查询速度会越来越慢,导致检索体验越来越差[17]。据了解,用户在进行信息检索时,仅有10%的用户在网页搜索中有意愿继续翻阅第一页之后的搜索结果,仅有1%的用户会翻看至第3页的结果[16,18-19]。在检索返回结果乱序的情况下,用户很容易丧失重要信息。Solr提供了检索排序算法,主要以TFIDF(Term Fre⁃quency-Inverse Document Frequenc)算法为基础,TFIDF通过计算查询词与文档中包含特征词和逆文档频率,考虑查询词对该文档的重要程度[20]。Solr检索服务提供的排序公式如下:
Score(q d)=å
t in q
(tf(t in d)*idf(t)Boost()*
norm(t d))*coord(q d)*queryNorm(q)(1)其中t=词项;d=文档;q=查询;f=字段。公式中各因子详细表达及含义如表1所示。
表1Solr中排序方法公式中组成因子及其含义
编号1 2 3 4 5
6
公式
tf(t in d)=num TermOccurrences ln Document12
idf(t)=1+log(numDocs/(docFreq+1))
coord(q d)=
numTerm ln DocumentFromQuery
num Terms ln Query
queryNorm(q)=1/(sumOfSquaredWeights12)
Boost()2*å
t in q
(idf(t)*t.getBoost())2
norm(t d)=d.getBoost()*lengthNorm(f)*f.getBoost()
公式含义
tf词频表示查询词项在某一文档中出现的次数,出现的次数越多代表相关度越高
idf是查询词罕见程度的度量,idf值越大表明查询词越罕见,与查询词越相关,词
频次和反文档频次在相关度计算中起到了相互平衡的作用
协调因子的作用是衡量每个文档匹配的查询词数量,如果有4个查询词,4个词全
部到,则协调因子为4/4;若匹配到其中3个词项,则协调因子是3/4
归一化因子对文本的相关性评分进行归一化处理,使最终文本相关性得分稳定在
一个区间内,不影响文本相关性排名
查询请求q中词项t的idf平方和,主要用以计算查询归一化因子queryNorm(q)
主要在创建索引时进行计算,其表示为Solr索引创建时每个字段的一个附加字节
图2存储在Solr中的数据
2.2Solr基本配置数据导入
在Solr中创建一个属于新闻检索的solrcore,配置该solrcore的l、l文件,将数据库内容导入Solr,Solr自动对导入的文本进行分词、建立索引等处理,即可实现存储数据检索。从表1中协调因子的计算公式可看出Solr提供多条件查询,能同时提交多个检索词。
Solr Schema文件设置如下,其中配置了新闻ID,还包括新闻链接、标题、时间、内容等信息,但配置内容和变量名称需与dataconfig中配置的参数对应。
<fieldname=“id”type=“string”indexed=“true”stored=“true”required=“true”multiValued=“false”/>
<field name=“news_url”type=“string”indexed=“true”stored=“true”/>
<field name=“news_title”type=“text_general”indexed=“true”stored=“true”multiValued=“true”/>
<field name=“news_date”type=“string”indexed=“true”stored=“true”/>
<field name=“news_content”type=“text_general”indexed=“true”stored=“true”multiValued=“true”/>
Solr中dataconfig文件配置如下,dataconfig文件用于与数据库的连接,将数据库内容导入到Solr中,其中数据库中的“news_id”与Solr中的“id”对应,否则会引起数据导入失败。数据完全导入Solr后的结果如图2所示。
<dataSource name=“source1”type=“JdbcDataSource”driver=“sql.jdbc.Driver”url=“jdbc:mysql://localhost:3306/ta⁃ble_news”user=“root”password=“******”/>
<document>
<entity name=“news_tb3”query=“select*from news_tb3”da⁃taSource=“source1”>
<field column=“news_id”name=“id”/>
<field column=“news_url”name=“news_url”/>
<field column=“news_content”name=“news_content”/>
<field column=“news_title”name=“news_title”/>
<field column=“news_date”name=“news_date”/>
</entity>
··170
第5期3系统界面设计
系统界面采用PyQt5编写,PyQt5具有跨平台、代码简
洁、开发高效等优点[19]。PyQt 使用Qt Designer 对界面进行排版,可节省大量开发时间[21-22]。系统界面显示新闻时间、标题、链接等信息,每一页显示检索前30条新闻信息,可通过点击“下一页”向Solr 发出请求获得其它相关新闻信息。系统响应过程为:用户向客户端发出检索请求,检索词以链接形式提供给Solr ,Solr 将检索结果以JSON 格式返回,客户端对数据进行处理后显示给用户。Solr 提供类似Web Service 的API 接口,因此在一个局域网内均可通过链
接或者客户端的形式实现新闻检索。
图3系统界面设计
4系统总体结构
系统使用模块化的设计方法,具有易扩展、易维护等
优点,主要包括数据收集模块,即网络爬虫、数据预处理模块、数据存储模块和数据显示模块。爬虫程序定时在网络上采集新闻信息,这些数据经数据预处理模块处理后,被插入数据库并定时更新到Solr 服务中,当用户向服务器发出查询请求时,服务器会根据查询关键词,将查询结果返
回给客户端。
图4系统实现方法过程
5结语
本文通过使用Scrapy 爬虫框架进行网络新闻信息搜
集,系统设计过程中,首先考虑系统需求,根据需求设计相
应模块;其次需考虑数据本身,根据数据特质设计相应方法。本文使用Slor 服务对新闻信息进行索引并检索排序,在帮助新闻阅读用户快速发现自己感兴趣的新闻的同时,还可保证新闻质量。
参考文献:
[1]张树涛,谭海波,陈良锋,等.一种高效的分布式爬虫系统负载均衡
策略[J/OL ].计算机工程:1-7.[2019-03-10].https :///
10.19678/j.issn.1000-3428.0053439.
[2]安靖.面向网络舆情的检索系统设计研究[J ].软件导刊,2013,12
(7):40-41.
[3]吕振辽,翟莹莹,魏彦婧.面向新闻网的智能抓取技术[J ].控制工
程,2013,20(4):707-710.
[4]魏冬梅,何忠秀,唐建梅.基于Python 的Web 信息获取方法研究
[J ].软件导刊,2018,17(1):41-43.
[5]刘芳云,张志勇,李玉祥.基于Hadoop 的分布式并行增量爬虫技术
研究[J ].计算机测量与控制,2018,26(10):269-275+308.
[6]马联帅.基于Scrapy 的分布式网络新闻抓取系统设计与实现[D ].
西安:西安电子科技大学,2015.
python网络爬虫书籍推荐[7]程增辉,夏林旭,刘茂福.基于Python 的健康数据爬虫设计与实现
[J ].软件导刊,2019,18(2):60-63.
[8]刘灿,任剑宇,李伟,等.面向个性化推荐的教育新闻爬取及展示系
统[J ].软件工程,2018,21(2):38-40+34.
[9]姚白羽.个性化新闻抓取与聚合系统的研究及实现[D ].北京:中
国科学院大学,2014.
[10]范传辉.Python 爬虫开发与项目实战[M ].西安:机械工业出版
社,2017.
[11]徐文杰,陈庆奎.增量更新并行Web 爬虫系统[J ].计算机应用,2009,29(4):1117-1119.
[12]陆浩,卢军,修榕康.密码字典数据去重算法研究[J ].软件导刊,2017,16(2):57-59.[13]杨颂.面向电子商务网站的增量爬虫设计与实现[D ].长沙:湖南
大学,2010.
[14]成功,李小正,赵全军.一种网络爬虫系统中URL 去重方法的研
究[J ].中国新技术新产品,2014(12):23-23.
[15]贾贺,艾中良,贾高峰,等.基于Solr 的司法大数据检索模型研究
与实现[J ].计算机工程与应用,2017,53(20):249-253.
[16]GRAINGER T.Solr 实战[M ].范炜,译.北京:电子工业出版社,2017.
[17]郝强,高占春.基于SolrCloud 的网络百科检索服务的实现[J ].软
件,2015,36(12):103-107.
[18]霍庆,刘培植.使用Solr 为大数据库搭建搜索引擎[J ].软件.2011,32(6):11-14.[19]苏潭英,郭宪勇,金鑫.一种基于Lucene 的中文全文检索系统
[J ].计算机工程,2007(23):94-96.
[20]段国仑,谢钧,郭蕾蕾,等.Web 文档分类中TFIDF 特征选择算法
的改进[J ].计算机技术与发展,2019(5):1-4.
[21]张文超,胡玉兰.基于PyQt 的全文搜索引擎平台开发[J ].软件导
刊,2018,17(9):132-135.
[22]SUMMERFIELD M.Rapid GUI programming with Python and Qt :
the definitive guide to PyQt programming [M ].New Jersey :Prentice Hall Press ,2008.
(责任编辑:江
艳)
陈欢,黄勃,刘文竹,等:基于Python 的网络新闻爬虫与检索·
·171
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论