基于Scrapy的招生信息专题搜索引擎研究
2022-01-20方锦文童桦茜
方锦文,童桦茜
(1.桂林电子科技大学信息科技学院,广西桂林,541004;2.广西城市建设学校,广西桂林,541003)
0 引言
搜索引擎是一种专门在网络上提供查询服务的系统,它把分布在网络上的信息资源进行收集、处理,然后经过整理后方便人们查询。目前像百度和Google这样的大型搜索引擎能为用户提供海量的信息查询服务,其查询范围遍布各行各业,基本可以满足各个领域的信息横向搜索。也正是因为这类通用搜索引擎所覆盖领域广阔,所以很难在搜索的同时兼顾到搜索的精准度。其价值在于对大量的分散信息做信息导航,对于信息量相对集中、分类类别更详细的某一特定领域的信息检索就会表现出其纵向搜索的局限性。
垂直搜索引擎的出现正是为了解决通用搜索引擎在特定领域下的搜索精度不高、主题偏移、搜索深度不够等问题。垂直搜索引擎专注于某一类信息、专业领域、特定主题下的信息检索,其追求的是专业性和检索服务深度。对于大学招生信息主题的搜索引擎,则专注于提供各个学校招生信息、学校信息、招生专业等信息的检索服务。
1 系统工作原理
系统主要由信息采集、信息预处理、信息检索三部分组成。在信息采集部分,主要通过网络爬虫抓取因特网上的网页数据的方式,用构建招生信息主题词库的过滤器过滤掉与招生信息不相关的网页链接,然后把与招生信息相关的网页信息存放到网页库中。在信息预处理部分通过索引器对对采集到的网页库建立索引方便系统查询。信息检索部分主要负责与用户的直接对接,如图1所示。
图1 主题搜索引擎总体框架
用户通过Web服务器界面接入系统,输入要查询的内容,检索器与索引库对接,在索引库中搜索信息,用排序器对搜索结果进行排序处理后返回给用户。
2 专题网络爬虫构建
■2.1 Scrapy爬虫框架
Scrapy是基于 Python 实现的爬虫框架,其架构清晰,模块耦合度低[1]。可以应用在包括数据挖掘,信息处理或存储历史数据等一系列的程序中,简单来说,Scrapy是一个可以爬取网站的数据,提取数据的框架。
Scrapy 框架组件及其中间件的功能如下[2]:
(1)Scrapy Engine(引擎):串联框架各个模块,触发事务处理流程,控制数据流在系统中所有组件中流动。
(2)Scheduler(调度器):负责管理待抓取 URL 队列。接受请求后返回下一个要爬取的链接。
(3)Downloader(下载器):向网站服务器发送访问页面请求,获取页面数据并提供给引擎。
(4)Spiders(爬虫):爬取指定网站的数据内容,管理爬取规则和网页解析规则等。
(5)Item Pipeline(项目管道):处理被spider提取出来的item,包括数据清洗、验证及持久化(例如存取到数据库中)等。
(6)Middlewares(中间件):包括下载器中间件(Downloader middlewares)和Spider中间件(Spider middlewares),处理引擎与下载器、爬虫之间的请求及响应,其提供了一个简便的机制,通过插入自定义代码来扩展Scrapy功能。
Scrapy框架安装完成后,便可创建自己的爬虫项目,Scrapy爬虫项目结构如图2所示。
图2 项目文件结构
各文件功能如下[3]:
(1)scrapy.cfg: 项目运行的参数设定。
(2)middlewares.py:爬虫程序中间件。
(3)items.py: 项目中的item文件,管理待抓取的一些信息。
(4)pipelines.py: 项目中的pipelines文件,对爬取的数据进行清洗。
(5)settings.py: 项目的设置文件。
(6)spiders: 放置spider代码的目录。
■2.2 专题爬虫策略
为使抓取的网页与高校信息主题相关度更高,本文采用知名度较高的高校招生网作为初始目标网站爬取数据。通过观察目标网页,在高校信息详情页部分,可以找到高校名字、类型、联系电话、地址、简介、招生计划等信息,均包含在属性值为class的li标签中。可以先获取一级页面的列表页信息,在根据列表页中的详情页URL来获取详情页的数据。
先在项目的全局性配置文件setting.py中,配置好项目的名称、下载延迟、Scrapy执行的最大并发请求数等信息[4]。然后在数据模块items.py文件中设置好要爬取的高校信息字段,然后通过scripy对目标网页的高校信息页面进行一级页面的连接爬取和二级页面的详细内容。在scripy文件中,通过start_urls = []设置初始目标网站,通过allowed_domains = []设置允许爬取的范围,在def parse()通过Xpath获取到爬取的一级页面的列表
- 标签获得
- 标签标签中各个属性的数据。如:高校名字、类型、联系电话、地址、简介、招生计划等属性。并且根据属性所属类别存入数据模块items.py中构造的高校信息数据实体中,这就会产生一个高校信息实体,然后通过pipelines.py进行爬取高校数据的存储。
在数据处理模块pipelines.py中定义对爬虫爬取下来的数据进行过滤处理。对爬取到的信息中含有非法字符的数据进行清洗和过滤,在实际操作过程中,遇到了一些乱码的文字,设置过滤条件即可过滤全部数据噪声。过滤后的数据,就可以存放到数据库中了,本文将爬取的数据利用pymysql存储到MySQL数据库中。如图3所示。
图3 数据库表中的爬取数据
3 基于Rocchio模型的相关反馈
■3.1 相关反馈基本概念
用户实际进行查询操作时,对自己信息需求的描述方式,可能会与本来想要表达的意思有一定的出入,这样系统在按用户输入的描述进行检索的过程中,检索结果中也许会出现很多用户并不关心的信息,而用户本来比较感兴趣的一部分信息却被忽视掉。为了让这些没有被描述过的信息在检索结果中的重要性提升,就需要一个反馈的机制。
一个理想的检索结果应该是用户感兴趣的内容最多,而用户不感兴趣的内容最少。但是这样的理想情况是不可能一次实现的,要想得到让用户满意的检索结果,必须通过若干次的反馈过程。
■3.2 Rocchio反馈算法
Rocchio算法提供了一种将相关反馈信息融入到向量空间模型的方法,是实现相关反馈的一个经典算法[5]。它的基本思想是将用户需求表示为一个向量,根据用户的反馈情况来动态调整向量中每一维的关键词的权重来使得向量更接近用户想要的理想查询。
D是文档集合,包括所有相关和不相关的文档。我们想要的,是找到一个最优的查询向量q,使得q与相关文档的相似度最大并且与不相关的文档的相似度最小,如下:
Rocchio经过推导计算可以得到一种常见修正形式如下:
公式(2)中引入了可变参数α、β、γ,来调控修改结果和原始向量之间的平衡,让公式更具有普遍适用性。在实际使用中,正反馈往往比负反馈更重要,因此在很多系统中会把参数设置成β>γ,甚至很多系统都只允许进行正的反馈,即γ=0。一种在性能上比较稳定的方法是只对检索结果中排名最高的不相关文档进行负反馈,如下:
Rocchio算法要求用户对检索结果进行相关性评价,我们可以询问用户检索结果是否相关,让系统进行自动修正,但是更多情况下,用户并不会耐心阅读检索出来的所有文档,也不一定会对文档进行直接的相关性评价。不过我们可以通过分析用户阅读文档时的一些操作,间接得到用户对文档的评价,如:
(1)若用户反复阅读某一个文档,即文档的被点击次数较多,则用户对这个文档感兴趣。
(2)若用户下载某个文档,说明用户对这个文档感兴趣。
(3)若用户长时间阅读某个文档,则认为用户对这个文档感兴趣。
(4)对于用户没有点击访问的文档,则认为用户对这个文档不感兴趣。
(5)对于用户点击进入后很快离开的页面,则认为用户对这个文档不感兴趣。
本文将高校名字、地址、类型、招生批次等数据作为Rocchio算法中的向量,然后根据用户的时间使用情况动态调整。用户相关性向量模型不必根据用户每次的阅读行为进行调整,我们可以搜集一段时间内的反馈信息后再进行调整。这样可以减轻系统压力,也可以避免用户行为的偶然性的反馈影响。
4 结束语
本文基于Scrapy框架设计了一个高校招生信息主题的垂直搜索引擎。利用 Scrapy 爬虫框架以及Pythn语言扩展库实现了网页数据的爬取,针对用户输入查询词不明确的情况,本文还对基于Rocchio算法的反馈模型进行了研究,为用户提供更精确的搜索体验。系统同时也有一些有待改进的地方,比如数据分类存储优化,Rocchio算法参数的优化等,这些都是需要进一步进行研究的内容。