本源文秘网为您提供优质参考范文! 思想汇报 党建材料 疫情防控 自查报告 谈话记录 扫黑除恶
当前位置:首页 > 范文大全 > 主题教育 >

基于主题网络爬虫的程序设计资源库建设研究

时间:2022-12-22 11:40:03 来源:网友投稿

学习时更加自由、更加便捷。其发展趋势主要呈以下两个特点:1.资源选择便捷化。教师利用本学科的资源库充实课程内容时,将可以更加快捷地对资源库进行筛选。节约教师查找内容的时间,提高获取合适资源的准确度,使教师有更多的时间去创新,反向充实资源库,形成良性循环。2.系统服务个性化。针对教师的教学内容、课程对学生等级、学习阶段等的不同要求,根据对教师信息的汇总和系统识别,为教师提供满足自身需求的准确服务,提高系统资源的可用性。

一、目的和意义

本研究利用主题网络爬虫不需要访问数据库,自动抓取页面信息的特性,对程序设计资源库的建设进行探索和实践[1]。通过对目标网站的分析和爬取,实现资源聚合,完成资源库在内容上从无到有的突破。通过对当下流行的一些技术进行实际的开发和应用,为以后构建功能更加完善的资源库系统提供非常有用的实践经验。同时,本文虽然是针对程序设计课程资源库建设开展研究,但研究方法考虑通用性,只需通过主题库和爬取规则更新,就可以适用于其他课程的资源建设中。

二、系统总体架构

本系统被设计为三个模块。分别为:爬虫模块,API模块和数据可视化模块,系统架构如图1所示。

本系统通过爬取特定的URL,下载其标识的资源页面,从互联网中获取所需的信息。并在爬虫模块中借用Redis进行信息文本的清洗、组合、判重等操作。最后将合格的资源存入MongoDB数据库中,API则根据数据可视化的要求,通过对MongoDB数据库中的已存信息进行查询等操作,实现对应API功能[2]。数据可视化模块则同过调用API获取数据,在浏览器中对数据进行加工和展示,使师生用户可以无障碍使用本系统。

三、爬虫模块设计

爬虫模块在Scrapy和Scrapy-redis组件的基础上,进行功能拓展和实现。又分为多个子模块,包括:控制子模块,url重复过滤模块,页面解析模块,文本相似过滤模块,存储模块[3]。整个模块结构如图2所示。

(一)控制子模块

本模块是在Scrapy-Redis组件中所实现的调度器、爬虫等类的基础上,通过定义重载一些方法实现对爬虫的个性化控制[4]。其控制流程如图3所示。

爬虫启动后,会首先运行spider类中的start_requests方法,在该方法中,我们进行主从模式的判断,如果是主模式,则要进一步判断是否已有Cookies,如果没有,则需要同过Selenium模拟浏览器登录目标网站获取Cookies,并将Cookies存储于Redis中,共享给从模式启动的爬虫使用。Cookies生成之后,主模式下会生成待爬取的初始请求队列,然后进入页面的爬取解析循环。对于从模式启动的爬虫,则直接进入页面的爬取解析循环,如果没有待爬取的请求,则等待。经过页面解析之后,将提取后的结构化数据通过存储子模块进行存储。其中,对于新产生的URL和新提取的数据都要经过重复过滤,合格的URL和数据才能进入下一步流程当中[5]。

(二)URL重复过滤模块

该模块主要实现了Bloom Filter算法,并把它与实际爬虫应用结合起来。将Scrapy-redis原有的利用Redis集合特性的去重模块进行替换。算法和调用接口的具体实现主要在DBloomFilter类中完成,该类类图如图4所示。

其中,SEEDS属性是Bloom Filter算法所需要的哈希函数的随机种子。m是位数组的位数,k是哈希函数的个数,conn是Redis连接的实例,key是Redis中存储位数组的键名,由于Redis中最大只支持512M的位数组,为了在海量数据下依然能保证较高的正确率,将超过512M大小的位数组进行分块处理,mem属性是512M分块的个数,blocknum是每个分块的编号[6]。

init方法初始化Bloom Filter所需的各种参数m,k,conn 等。

getHashs则是对传进来的参数使用k个不同的哈希函数,获得k个哈希值,即该URL在位数组中的位置。

isExist方法是提供给爬虫判断URL是否已经爬取了的方法,接受需要去重的数据作为参数,调用getHashs方法获得URL的k个哈希值,并判断位数组中是否已经存在。存在返回True,不存在返回False。

add方法是提供给其他模块向位数组中加入该URL记录的方法。

(三)页面解析模块

页面解析模块主要是对Spider类的拓展和实现。类图如图5所示。

页面解析模块主要是两个解析方法,listParse方法主要解析爬取来的列表页面。根据列表页中的资源id再进行构造对应资源的URL。problemParse则是对具体资源页面的解析,通过Scrapy提供Item解决方案,提取组合成结构化的数据,暂时组织在Item类的实例中。

(四)文本相似过滤模块

该模块是基于Scapy提供的Item pipelies组件机制实现的。通过编写pipeline组件,并规定它的执行顺序,实现对页面解析模块获得的结构化数据进行详细过滤[7]。页面解析模块最终生成包含数据的Item实例,并把它转交这Item pipeline中,pipeline组件有序地对Item进行处理。

DDupefilterPipeline是实现的组件类。当Item通过时,它调用Simhash类提供的方法,对Item中的特定字段进行相似度判别。对于拥有和已经入库的数据较高相似度的Item将被丢弃。只有相似度合格的Item才能进入下一个pipeline组件中。

SimHash类是实现SimHash算法的工具类。它的类图如图6所示。

该类的两个属性会在初始化时赋值,hashBitNum是生成的哈希值的长度。maxKeywordWeight是关键词权重值的最大值[8]。

simHash方法通过调用jieba分词的分词方法,对文本content进行分词,并从中提取带有权重值的关键词列表,把得到的列表交给hashFeature方法。在hashFeature方法中,实现了SimHash算法里所讲的流程,最终得到了该文本的SimHash值。

is_equal方法是用来判断两个文本的相似度的,通过调用hmDistance方法,得到两个SimHash值的汉明距离,来判断相似度是否超过给定的上限。如果超过则返回True,否则返回False。

hashFunc和tokenizerFunc方法则是算法需要的哈希函数方法和分词方法[9]。

在具体去重中,DDupefilterPipeline类的process_item方法会先调用simHash方法,获取Item中给定字段的SimHash值。判断这个值是否已经在Redis数据库中,如果不存在则调用is_equal方法,与Redis数据库中的每一个SimHash进行对比,相似度高于上限的直接丢弃,相似度合格的则把该SimHash值存入Redis中,并将该Iten传入下一个pipeline组件中。

(五)存储子模块

和文本相似过滤模块相似,存储子模块通过pipeline组件,对经过去重的Item进行存储操作。DMongodbPipeline类通过调用pymongo提供的API接口,完成对MongoDB的连接等操作。完成对有效数据的插入。

由于MongoDB是非关系型数据库,和传统的关系型数据库相比,它是以BSON文档作为基本的数据模型,没有表的概念。在MongoDB中,一个数据库可以包含多个集合,一个集合包含了同类文档,文档中又可以嵌套文档、数组和文档数组[10]。

在本系统中MongoDB数据库主要有两个集合:problems和knowledgePoints。

四、API模块

API模块使用Koa2.js框架進行开发,为数据可视化模块提供获取数据的API接口。它的主要功能就是接收客户端应用发来的http请求,从中提取有效安全的参数,在数据库中完成数据的查询,并将数据返回给客户端应用。

Koa2.js框架是基于NodeJS平台的下一代Web开发框架,是由 Express 原班人马打造的,致力于成为一个更小、更富有表现力、更健壮的 Web 框架。 使用JavaScript编写应用时,会面临重复烦琐的“回调地狱”问题。在Koa2中通过组合不同的 generator,可以避免这一问题,并极大地提升错误处理的效率。Koa2为了保证自身的简洁性,自身内核除了关键内容以外,把路由、解析等功能都被用中间件的形式来实现,它仅仅提供了一个轻量优雅的函数库,使开发者在编写 Web 应用更加得心应手。

整个流程看起来很像洋葱,但并不是一层一层地执行,而是以中间件调用next方法的地方为界,当请求Request传来时,先一次执行每个中间件next之前的部分,当下一层中间件执行完后,再执行本层next后的部分[11]。

通过在koa-router中间件中定义API路由,并指定匹配到该路由时的应该执行的回调函数。在回调函数中进行数据库查询,并对该请求进行响应,返回数据。所有的回调函数按功能被组织在特定的Controller类中。

ProblemController类主要完成了目前阶段所有API的回调函数的定义和实现。其类图如图7所示。

getProblemByType方法中实现了按条件对数据库进行检索,并利用MongoDB的skip、limit、sort等方法以及_id的特性,实现了分页查询,比单独使用skip和limit方法实现分页有了更好的性能,尤其是数据量庞大时。getKnowledgePoints则是返回了当前知识点的子知识点。

五、系统测试

关于爬取速度方面,经测试,在单机条件下运行,爬虫持续运行无报错,稳定持续爬取数据。90分钟入库数据3140条,平均35条/min。

在爬取完整性方面,针对某网站最终需要爬取5835个页面,共爬取5835个页面,实现全部爬取无遗漏。最终数据库有4886条数据,有949条数据被判定相似或重复。

针对相似度过滤方面,经测试爬虫系统的log信息提示丢弃掉了约5%和已入库文本相似度极高的文本,经过系统比对规则确认,这部分确实属于重复资源,系统予以舍弃,不做重复入库。当数据库中存入了多条相似,但要求实现不同函数的问题,证明文本相似过滤模块运行性能在预期内,没有出现不能容忍的高误判率。

六、总结

本文采用了稳定性及拓展性良好的Scrapy/Scrapy-redis框架,实现对数据的清洗,去重以及入库等操作。运用Downloader Middleware机制对发出的爬取请求进行定制,同时对服务器的响应进行识别,对不同的响应状态码进行不同的处理。为了实现分布式爬取而采取的Redis数据库操作的原子性和基于内存的特性发挥了极大的性能优势。经测试,资源库系统各方面表现稳定,拥有良好的可拓展性,满足设计需求。

值得进一步探索改进之处主要表现在,目标网站的反爬机制对爬虫系统有一定限制。目标网站为限制同一IP在短时间内的请求数,为了保证爬取的准确度,爬虫不得不进行自我休眠,限制了爬取速度。可以通过增加机器、选用优秀稳定的代理池去解决。

[ 参 考 文 献 ]

[1] 陈永彬. 基于聚焦爬虫技术的教学资源搜集与自动整理方法研究[D]. 东北师范大学,2011.

[2] 陈昭稳. 基于网络爬虫软件建设主题网络信息资源库的研究——以高铁网络信息资源库建设为例[J]. 安徽电子信息职业技术学院学报,2014(6):12-14.

[3] 郭小丹. 几种开源网络爬虫功能比较[J]. 黑龙江科技信息,2015(25):154.

[4] 刘建明. 垂直搜索引擎中的主题爬虫技术研究[D].广东工业大学,2013.

[5] 金斯特. 基于Web 挖掘的主题搜索引擎网页抓取策略的研究[D]. 浙江工业大学,2014.

[6] Yuhao Fan. Design and Implementation of Distributed Craw-ler System Based on Scrapy[J]. IOP Conference Series:Ea-rth and Environmental Science,2018,108(4).

[7] Luo L, Guo D, Ma R T B, et al. Optimizing Bloom Filter: Challenges, Solutions, and Comparisons[J]. arXiv:1804.04777v2[CS.DS] 7 Jan 2019:10-32.

[8] Manku G S,Jain A,Sarma A D. Detecting near-duplicates for web crawling[C] International Conference on World W-ide Web. ACM,2007:141-150.

[9] Jain A, Manku G S. Near-duplicate document detection for web crawling: US,US8140505[P]. 2012.

[10] Haber,Itamar. MongoDB and Redis pair volume with velocity[J]. InfoWorld.com,2015.

[11] 程桂花,沈煒,何松林,等. Node.js中Express框架路由机制的研究[J]. 工业控制计算机,2016(8):101-102.

[责任编辑:黄紧德]

推荐访问:爬虫 资源库 程序设计 主题 建设