APP下载

基于Python的新闻聚合系统网络爬虫研究

2018-12-20左卫刚

长春师范大学学报 2018年12期
关键词:爬虫应用程序框架

左卫刚

(山西管理职业学院,山西临汾 041051)

1 研究背景

新闻在社会发展中起着至关重要的作用,大多数人每天阅读新闻,以确保能掌握最新的信息和趋势。人们在吸收和理解信息之后,会把其作为意识形态决策的参考。随着科学技术的进步,新闻在全球范围内传播速度加快。使用互联网,知识、观念、娱乐和新闻等信息,都可以很容易地被传播。然而,网络中的冗余新闻信息过多,用户阅读不同信息时需要在不同站点之间频繁切换,这无形中增加了获取新闻的难度,也增加了时间开销。

因此需要构建一个新闻聚合系统,从多个来源收集新闻,并以特定的格式进行汇总。新闻聚合系统中的新闻数据需要通过网络爬虫来获取,其中包括网络爬虫、CMS、API、网络爬虫调度器和socket服务器的实现等。

2 工具及解决方案

2.1 网络爬虫

网络爬虫是一个特定的机器人,一种按照一定规则自动抓取网络信息的程序或脚本。目前主要有以下几个比较实用的工具可以用来抓取网站并提取其内容。

2.1.1 Scrapy

Scrapy是采用Python开发的一个简单易用的网站内容抓取框架,用于抓取web站点并从页面中提取结构化的数据。Scrapy用途广泛,可用于数据挖掘、监测等。

2.1.2 BeautifulSoup

BeautifulSoup是用Python编程语言编写的HTML解析器,可以用来从网页中提取内容,BeautifulSoup不能单独用作网络爬虫。

2.1.3 Link Grabber

Link Grabber是一个用Python编程语言编写的库,可以用来从网页中提取统一资源定位器(URL),具有附加的功能,可以在锚标记内提取文本。

2.2 网络爬虫的比较

衡量网络爬虫的性能应从以下两个指标来考量:爬行能力(HTML解析器是否可以在安装时自行抓取web页面)和处理能力(HTML解析器是否可以解析格式复杂的HTML页面),如表1所示。

表1 网络爬虫的比较

2.3 Web应用程序框架的比较

Web应用程序框架应从以下两个方面进行比较:速度(在接收客户端请求时,框架返回响应的时间等)和性能(内置的功能,如库、框架模板等),如表2所示。

表2 Web应用程序框架的比较

2.4 解决方案

图1 系统概况

基于上文比较,将使用Laravel框架作为其web应用框架,将BeautifulSoup作为其网络爬虫框架。选择使用Laravel框架,是因为与CodeIgniter相比,Laravel框架使用了更现代的体系结构和PHP7特性,Laravel也有一个与新闻聚合系统的发展相关的功能,即ORM。使用Laravel创建API也非常简单,因为Laravel具有更高级的路由和单元测试功能。

对网络爬虫来说,可选择使用BeautifulSoup作为网络爬虫,因为与Link Grabber相比,BeautifulSoup不是一个复杂的框架。此外,截止到2017年5月,Link Grabber的开发已经停滞了几个月。而BeautifulSoup性能较高,可用于解析格式复杂的HTML页面。此外,BeautifulSoup还可以利用附加的库来快速和灵活地解析HTML页面。图1展示了新闻聚合系统的概况,本文只涵盖了方框内(2.后端)部分。

3 解决方案设计

3.1 解决方案架构

图2 后端构架

系统后端构架如图2所示,每个实体都有自己的功能来支持后端系统的操作,每个模块具体功能如下:

(1)Laravel框架是一个PHP框架,它可以用来托管应用程序的CMS,为移动客户端提供API,laravel框架主要将应用程序数据存储在MySQL数据库中,还能够将通知数据通过Redis服务器发送到Socket服务器,从而向用户发送通知。

(2)Laravel REST API是Laravel框架的一个组件,REST API被用作移动客户端与框架之间的接口。

(3)Python新闻爬虫用于从各种来源检索web页面数据,提取要分析的内容并将其存储到MySQL数据库中。分析新闻文章时,爬虫通过向AI发送一个HTTP请求来发送数据,由分析的结果决定提取的消息将被存储到数据库中还是被丢弃。

(4)MySQL数据库是用来存储和检索数据的数据库系统,之所以使用MySQL,是因为该框架支持本地MySQL数据库的ORM系统,Python新闻爬虫还可以直接与MySQL系统通信,而不需要使用Laravel框架作为中间件。

(5)Redis服务器是内存中的数据结构系统。在本研究中,Redis被用作Laravel框架和套接字服务器之间的消息代理。Redis还被REST API用作缓存驱动程序,以减少对MySQL数据库的查询。

(6)Socket服务是Node.JS的一个实例,用于为其客户端提供WebSocket服务,Socket用于从Laravel框架向连接的客户端广播数据,其使用Socket.IO来进行WebSocket实现。

3.2 开发方法

项目采用敏捷开发方法,敏捷方法非常适合这个项目,因为该方法鼓励将早期的软件交付给客户。在这种情况下,允许研究人员为主要客户端提供应用程序的早期测试,主要客户端是移动应用程序和AI新闻分析器。我们还利用了测试驱动开发(TDD),允许开发人员编写包含模块功能需求的测试,测试完成后,将创建一个函数或模块来传递需求,这确保了代码重构或合并不产生错误,因为代码将在部署之前进行测试,TDD用于本项目的API开发。

3.3 API设计

在API用例中有两个角色:普通用户和认证用户,两者之间唯一的区别是认证用户拥有一个更为有效的API令牌,有一些API端点只针对认证用户开放。用户通过提供数据进行系统注册,注册成功后登录系统,系统会根据用户所属的系统身份为其发放相应的访问令牌。所有用户登录系统后均可通过设置新闻类别等参数来获取相应的新闻列表,以及对应的具体内容和相关的评论回复信息,认证用户可对获取的新闻进行评论和回复。除此之外,认证用户还可获取个人数据,如新闻阅读历史、新闻喜好列表、新闻首选项和通知设置,并能够更新新闻偏好和通知设置等。

3.4 爬虫设计

爬虫设计需要设置日志文件,假如在Linux环境下没有合适的日志文件,当计划任务开始后,命令行界面可能会被爬虫程序的输出淹没。用户可以通过设置来启动爬虫,例如,如果用户想从新闻站点sina.com获取数据,可以设置sina作为程序参数启动爬虫。为了简化调度任务,还可以设置爬虫扫描所有可用站点,只要每个站点的配置文件是有效可用的。

爬虫设计需设置四个标记:第一个标记是限制标记,如果用户希望限制提取页面的数量,则可以设置限制标记;第二个标记是调试标记,如果用户希望程序在错误发生时立即退出,则可以设置调试标记,这有助于用户为站点构建配置文件;第三个标记是详细标记,如果用户希望看到当前爬行操作进度,则可以设置详细标记;第四个标记是输出标记,用户可以选择抓取结果的输出目标,例如,用户可以选择输出到JSON文件中还是在数据库中再对数据进行进一步的处理。

为了增强爬虫的性能,用户可以通过添加配置文件或输出程序来解决。用户向爬行器添加额外的配置文件,以允许爬虫遍历不同的网站,并对页面数据进行跟踪。为便于对获取到的不同类型的信息进行更为有效的利用,用户还可创建一个提供程序类,将结果输出为除JSON以外的其他数据格式。

4 系统测试

4.1 测试服务器需求

本项目的服务器需求如表3所示。

表3 服务器需求

4.2 测试系统规范

由于经济性原因,将后端应用程序运行在Raspberry Pi2上,规范说明如表4所示。

表4 Raspberry Pi2规范

4.3 API测试

在此使用PHPUnit进行API测试,测试用例是根据移动应用程序的要求编写的,测试结果表明,所有的API端点都通过了测试用例。整个测试花费了2.36分钟,其中包括36个测试用例(包括错误测试)。为了加快测试速度,测试使用存储在内存中的SQLite数据库。每个测试都可能包括HTTP代码判定、JSON结构判定或JSON输出判定。JSON结构判定和JSON输出判定之间的区别在于前者只判定JSON的整体结构(不包括值),而后者则判定准确的值。

4.4 爬虫测试

爬虫通过SSH客户机测试系统。接口采用命令行接口(CLI),在CLI中执行的每个命令也可以由系统执行,爬虫的主要目的是定期从新闻网站获取新闻。Crontab是类Unix操作系统中的任务调度程序,在此用于启动预定的爬行会话。为了测试爬虫的实际功能,使用以下命令直接将命令输入到CLI。

python3 crawler.py ——limit 10 ——verbose detik

以上命令包含2个可选参数和1个必选参数,处理结果可根据目标网站的内容而有所不同。命令中将链接总数的上限设置为10(此上限限定的数量不包括在限定时间范围内已经被爬行过的链接)。如果爬行链接总数超过10,链接提取器模块将会停止爬行。

5 结语

本文研究的爬虫不仅仅局限于提取新闻站点的新闻,通过用户设置自定义配置文件,还可以提取其它多种类型的网站数据,并按照用户需求使用多种输出方法来保存所提取的数据。然而,爬虫在性能上还有提升的空间,基于爬虫本身是开源的,开发者可在本文基础上对爬虫做进一步的更新和完善。

猜你喜欢

爬虫应用程序框架
利用网络爬虫技术验证房地产灰犀牛之说
框架
基于Python的网络爬虫和反爬虫技术研究
广义框架的不相交性
删除Win10中自带的应用程序
谷歌禁止加密货币应用程序
大数据环境下基于python的网络爬虫技术
关于原点对称的不规则Gabor框架的构造
一种基于OpenStack的云应用开发框架
基于Heritrix的主题爬虫在互联网舆情系统中应用