基于ElasticSearch的搜索引擎设计与实现

2022-10-24 版权声明 我要投稿

一、所用技术说明

(一) Scrapy爬虫框架

Scrapy基于Python语言的简单、快速、高层次的web抓取脚本, 用于抓取web网页上的数据并从所下载页面中提取有价值的数据。[1]

Scrapy框架的体系主要由Spider、Item、MiddleWare, PipeLine构成。Spider层:主要是用来让用户编写自己的爬虫逻辑, 实现网页的获取和字段的提取。Item层:主要功能是事先定义想要提取的字段数据。MiddleWare层:主要是网页下载和提取的一些处理, 例如添加UA, 切换代理IP等;PipeLine层:主要是对数据字段进行清洗、数据存储入moogdb数据库或者自定义pipeLine导出CSV文件等系列操作。

Scrapy体系结构的优点:

1. 降低了爬虫系统的各模块之间的依赖程度。例如:如果数据库连接地址发生更改, 那么只需要在setting去更改即可。

2. 由于各层之间相互独立, 需要什么功能只需要在相应的地方添加即可, 不需要考虑其他地方的代码。

3. 各层之间分工比较明确, 大大提高了代码的复用性, 不同的spider可以共用一个PipeLine模块, 以及MiddleWare中间件, 只需要在对应的item添加各自的身份标识即可。

4. Scrapy将系统的架构统一起来, 让开发人员可以将精力集中在网页的爬取逻辑上, 大大提高了爬虫的开发效率。

(二) Elasticsearch搜索框架

ElasticSearch是一个分布式、高扩展、高实时的搜索与数据分析引擎。[2]它能很方便的使大量数据具有搜索、分析和探索的能力。充分利用ElasticSearch的水平伸缩性, 能使数据在生产环境变得更有价值。ElasticSearch的实现原理主要分为以下几个步骤, 首先用户将数据提交到ElasticSearch数据库中, 再通过分词控制器去将对应的语句分词, 将其权重和分词结果一并存入数据, 当用户搜索数据时候, 再根据权重将结果排名, 打分, 再将返回结果呈现给用户。

(三) Django web框架

Django是一个高扩展的web框架。[3]其采用了MVC的框架模式, 因其带有强大的数据库功能, 缓存功能以及MVC的设计模式, 使其web开发端具有巨大的优势。Django可以很方便的启动一个服务器, 并使用户通过网站很方便的访问。实现从网页发送请求到服务器, 服务器查询数据库, 最后返回请求给用户三者的交互。

二、数据信息的获取

(一) 爬虫的工作原理

网络爬虫是一个自动下载网页并且把网页中的有价值内容提取出来的一套程序, 是搜索引擎获取信息的重要通道, 也是许多互联网应用的基础技术, 特别是在大数据存储、数据挖掘、网络取证、信息聚合、舆情监控、网页快照等领域有非常普遍的应用。通常在给定的一个或多个入口网址的情况下, 按照从根网页开始采集并可以按照广度优先或者深度优先的策略进行获取, 在下载与提取网页的过程中, 不断将新的URL放入待爬取的队列中, 直到有满足一定退出条件 (如等待爬行的队列为空或者达到指定的爬行数量) 时就会停止爬行。在“互联网+”时代, 网络爬虫技术将在云计算、大数据分析、电子商务、社交网络、舆情监控等诸多互联网前沿技术领域发挥重要的作用。

(二) 网站反爬虫机制

1. 识别HTTP请求的请求头

HTTP的请求头是浏览器向网络服务器发送HTTP请求时, 传递的一组属性和浏览器配置信息。HTTP定义了很多种请求头类型, 例如用户UA, HOST, Referrer等, 通过伪造请求头, 可以模拟用户获取到数据。

2. 识别cookie

知乎网通过识别用户的cookies来分辨是否为真实用户, 当一个cookies标识在短时间内大量访问, 可以判断为python爬虫程序, 可以通过设计cookies池来轮流切换cookies来获取网站的大量数据。

3. 自定义字体

猫眼电影通过将自己的数据利用自定义字体方式将自己的电影数据隐藏起来, 想要获取其中的数据, 必须在网站加载的时候, 将自定义字体下载下来, 将其进行解密, 然后拿到电影数据信息。

(三) scrapy爬虫模块的设计

1. spider模块:

该模块主要是处理具体的爬虫逻辑, 对网站进行网页的下载, 数据的提取和过滤, 数据的发送等。

2. pipeLine模块

该模块主要处理从spider获取到的数据, item数据先在spider出进行数据装填, 通过yield将数据发送给pipeLine中, 在此模块可以将数据异步存储到MySQL或者MoogDB数据库中, 或者将数据导出到本地文件中。

3. MiddleWare模块

该模块主要分为两部分, 即下载中间件和怕从中间件, 下载中间件主要处理更换ip, 更换UA的操作;爬虫中间件主要处理spider爬虫逻辑相关下载。

4. setting模块

该模块主要设置全局变量, 可以在此设置爬虫请求延迟, 数据库配置, 中间件配置等。

(四) ElasticSearch搜索框架的应用

(1) 定义es存储类型, 并指定es的分析器, 以及分词器, title=Text (analyzer="ik_max_word") 定义了分词器为IK分词器, 并定义存储title字段为Text类型。

(2) 初始化存储实例, 通过init方法来初始化存储实例。

(3) 通过pipeLine将获取道的数据存储道es中, 并对其生存存储建议, 当在前端进行搜索时候对其进行查询, 并展示出来。

三、总结

通过分析了解当前的反爬机制, 并运用Scrapy框架学习简单、功能强大的特点以及ElasticSearch强大的数据解析能力, 设计了基于es的搜索框架。通过实验证实, 该scrapy爬虫能够实现对数据的高效爬取, 并生成搜索建议。在使用时可以很高效的对大量数据进行查找。

摘要:近年来, 随着互联网行业的蓬勃发展, 信息量呈指数增长, 一个好的搜索引擎就显得极为必要, 为了解决当前在大数据时代面临的信息爆炸的问题。本系统用ElasticSearch设计并实现了个人搜索引擎, 开发技术主要使用轻量级框架Django技术、MySQL, 搜索框架采用ElasticSearch实现网页数据的获取, 搜索建议的生成, 数据的存储, 以及数据搜索后的展示。

关键词:搜索引擎,Scrapy,ElasticSearch

参考文献

[1] 迪米特里奥斯, 考奇斯-劳卡斯.精通Python爬虫框架Scrapy[M].北京:人民邮电出版社, 2018.

[2] 拉法乌-库奇, 马雷克-罗戈津斯基.ElasticSearch[M].北京:电子工业出版社, 2015.

[3] Jeff Forcier, Paul Bissex.Django Web开发指南[M].北京:机械工业出版社, 2009.

上一篇:探望权与未成年子女的家庭监护下一篇:初中历史活动课教学的四个环节