一种基于RabbitMQ的论坛舆情爬取方案及实现

2018-10-17 01:47◆冯
网络安全技术与应用 2018年10期
关键词:爬虫队列舆情

◆冯 扬

一种基于RabbitMQ的论坛舆情爬取方案及实现

◆冯 扬

(武汉虹旭信息技术有限责任公司 湖北 430000)

随着互联技术的普及和应用,网民在互联网上进行意见表达的需求日益增多,而各大网络论坛也早已成为资讯传播与意见讨论的公共平台。对于各种社会事件的发酵与舆情传播,网络论坛早已是不可或缺的媒体工具之一。本系统基于对网络论坛舆情监控的需求,基于RabbitMQ队列管理服务,实现了一种高并发,高鲁棒性的系统后台爬虫方案,有针对性的对舆情信息进行爬取搜集,为后续分析系统提供可靠的第一手数据。

RabbitMQ;网络舆情;分布式爬虫;多线程;爬虫策略;消息确认;心跳检测;队列管理

0 引言

近年来网络舆论传播的趋势已经逐渐赶超传统媒体的地位,随着互联网安全法的颁布,对于公共网络安全的管理需求日益增加。通过网络爬虫对各大论坛舆情进行爬取与数据搜集,是当前一个主流的解决方案。

传统爬虫一般通过给定的url进行深度爬取、广度爬取[1]。但是随着各大网站安全意识的增强和技术栈的更新,越来越多的网站采用了反爬虫策略,限制了传统爬虫的爬取能力。对于那些采取了反爬虫手段的论坛网站,传统爬虫往往处理能力较差,使得爬取数据的精度有限。本系统根据针对性的爬取需求以及对系统稳定性的要求,采用RabbitMQ队列管理服务,对指定任务实现分布式高并发爬取,合理利用了RabbitMQ多队列、高时效性、高稳定性的特征对不同爬取进度的任务进行有效管理,对于有反爬虫策略的网站,采用Selenium模拟登录,Javascript逆向手段等进行规避,有效的实现了精准爬取,并且保障了系统的稳定性。

1 RabbitMQ的介绍

RabbitMQ是一款开源的消息队列服务系统,基于AMQP(Adevanced Message Queuing Protocol)开放标准开发而成,最早是为了解决通信系统中消息队列的传递而诞生。RabbitMQ采用Erlang语言开发,Erlang语言由爱立信设计,在电信行业领域使用广泛。OTP(Open Telecom Platform)属于Erlang语言的一个分支,其中基于Erlang开发的中间件/库/工具,为Erlang的应用开发提供了极大的便利。RabbitMQ的运行需要基于OTP库。AMQP协议中的基本概念:

(1)Broker:用于接受和分发消息的服务端,RabbitMQ Server就是一个Message Broker。

(2)Virtual host: 在AMQP基本组件的基础上划分出来的虚拟分组。可以为多用户连接提供逻辑上分离的服务,为每个用户在各自的vhost中建立单独的交换/队列服务。

(3)Publisher:消息的生成和发送端。

(4)Consumer:消息的接受与处理端。

(5)Connection: publisher/consumer和broker之间的TCP连接。一般情况下,断链操作只会出现在client端,除非网络故障或者broker服务出现问题,否则broke端不会出现断链的现象。

(6)Channel: channel是一个逻辑连接的概念,每个channel之间是完全隔离的,对于多线程程序,通常是一个线程对应一个单独的channel进行通讯。channel减轻了操作系统创建TCP连接的开销。

(7)Exchange: 相当于通讯设备中交换的作用,根据分发规则,匹配查询表中的routing key(路由键),分发消息到消息队列中。常用的类型有:direct (点对点)、topic (分发) 和fanout (广播)。

(8)Queue: 消息最终被送到这里等待consumer取走。一个message可以被同时拷贝到多个queue中。

(9)Binding: exchange和queue之间的虚拟连接,binding中可以包含routing key,exchange可以根据routing key对消息进行投递。

图1 AMQP协议框架

2 基于RabbitMQ的爬虫系统

考虑到系统对爬取内容的针对性需求与稳定性需求,设计了一款基于RabbitMQ并发处理任务的爬虫系统,由Publisher构造爬取任务,通过Exchange绑定的routine-Key,下发到指定的爬取任务中,并且根据不同论坛爬取难易度不同,采用不同的爬取策略,针对性的构造爬取方法,提高爬取精度与数据的准确度。

爬取任务结束后,通过RabbitMQ的消息确认机制,告知服务器结束任务,清理内存,并等待下一次任务的下发。

对于不同的论坛,爬取难易度不同,有些可以直接爬取,有些需要登录以后才能看到页面展现的数据,这就需要实现自动化登录的流程。系统根据不同任务的针对性需求,采取不同的爬取策略。主要用到的爬取策略包括:

图2 爬虫系统框架

(1)构造发包方式;

(2)Selenium模拟浏览器登录方式;

(3)Javascript逆向分析方式。

3 系统性能分析

由于采用RabbitMQ进行任务分发与队列管理,能够保证不同任务间互不干扰,独立运行。由于需求决定下发的任务大小有限,消息分发过程中不会造成性能瓶颈。

这里主要考虑消息丢失的问题和客户端断链的问题,这里用到了RabbitMQ的两个特性:消息确认机制[2]和心跳检测机制[3]。

(1)消息确认机制

消息确认机制可以解决任务丢失问题。如果客户端在执行过程中由于异常断开链接,而爬取任务还未执行完,为了避免任务丢失,这里采用RabbitMQ提供的消息确认机制,当客户端消息处理完成时,给Server端发送确认消息,来通知服务端可以删除消息,如果客户端中途因为异常挂掉,只要触发重启链接机制,仍能够从队列中读取到之前的任务消息,从而确保任务安全可靠的传递。

(2)心跳检测机制

心跳检测机制用于检测客户端与RabbitMQ服务器之间TCP链接的情况。心跳timeout值决定了RabbitMQ服务器与Client相互连接的最大时间。当客户端检测到与RabbitMQ服务端的连接不可达时,需要重新发起TCP连接请求。

网络在丢包率很高等其他情况中会出现连接失败的情况。AMQP0-9-1协议提供心跳检测功能来确保应用层及时发现连接中断的的情况,心跳检测还能保护TCP连接不会在一段时间内没有响应而被终止[3]。

由于客户端在执行爬虫任务的时候是线程阻塞模式,如果爬取时间过长,会造成心跳检测失败,这就需要评估任务时间,从而选取一个适当的心跳超时时间。该值是在建立链接的时候协商生成的,在调用API创建TCP链接的时候,可以修改心跳包的值,如果设置为0,则关闭心跳检测机制。

4 总结

本文在传统舆情爬虫的基础上,基于需求提出了一种面向任务爬取的分布式爬虫系统,采用了开源队列管理服务系统RabbitMQ,实现了任务稳定下发,多客户端并行爬取的论坛舆情爬虫系统,为后续海量数据分析提供可靠的依据。

[1]张旭,张振江,刘云.BBS舆情系统爬虫模块的研究[J].铁路计算机应用,2010.

[2]徐震,焦文彬.RabbitMQ小消息确认机制优化[J].计算机系统应用,2018.

[3]RabbitMQ-Detecting Dead TCP Connections with Heartbeats and TCP Keepalives[EB/OL] https://www.rabbitmq. com/heartbeats.html2018.

猜你喜欢
爬虫队列舆情
利用网络爬虫技术验证房地产灰犀牛之说
基于Python的网络爬虫和反爬虫技术研究
队列里的小秘密
基于多队列切换的SDN拥塞控制*
在队列里
大数据背景下校园舆情的爬虫应用研究
丰田加速驶入自动驾驶队列
大数据环境下基于python的网络爬虫技术
消费舆情
舆情