JLiteSpider
A lite distributed Java spider framework.
这是一个轻量级的分布式java爬虫框架
特点
这是一个强大,但又轻量级的分布式爬虫框架。jlitespider天生具有分布式的特点,各个worker之间需要通过一个或者多个消息队列来连接。消息队列我的选择是rabbitmq。worker和消息之间可以是一对一,一对多,多对一或多对多的关系,这些都可以自由而又简单地配置。消息队列中存储的消息分为四种:url,页面源码,解析后的结果以及自定义的消息。同样的,worker的工作也分为四部分:下载页面,解析页面,数据持久化和自定义的操作。
用户只需要在配置文件中,规定好worker和消息队列之间的关系。接着在代码中,定义好worker的四部分工作。即可完成爬虫的编写。
总体的使用流程如下:
- 启动rabbitmq。
- 在配置文件中定义worker和消息队列之间的关系。
- 在代码中编写worker的工作。
- 最后,启动爬虫。
安装
使用maven:
<dependency> <groupId>com.github.luohaha</groupId> <artifactId>jlitespider</artifactId> <version>0.4.3</version> </dependency>
java学习交流群:925895158
设计思想
虽然JLiteSpider将抓取流程抽象成了几个部分,但这并不意味着你就必须遵从这种抽象,你应该根据自己的应用场景,来作出最符合效率最大化的使用决策。比如,如果你抓取的网页源码较大,如果把网页源码也存入消息队列,会导致消息队列负担过大。所以这个时候比较好的做法是将下载和解析的流程合并,直接向消息队列输出解析后的结果。
所以,虽然JLiteSpider帮你抽象出了抓取过程中的不同阶段,但这完全是选择性的,用户完全是自由的。我在设计JLiteSpider的时候,尽力保障了自由。后面要介绍到的Worker和消息队列的自由配置,以及添加了freeman
,同样是这种设计思路的体现。
Worker和消息队列之间关系
worker和消息队列之间的关系可以是一对一,多对一,一对多,多对多,都是可以配置的。在配置文件中,写上要监听的消息队列和要发送的消息队列。例如:
{ "workerid" : 2, "mq" : [{ "name" : "one", "host" : "localhost", "port" : 5672, "qos" : 3 , "queue" : "url" }, { "name" : "two", "host" : "localhost", "port" : 5672, "qos" : 3 , "queue" : "hello" }], "sendto" : ["two"], "recvfrom" : ["one", "two"] }
workerid : worker的id号
mq : 各个消息队列所在的位置,和配置信息。name
字段为这个消息队列的唯一标识符,供消息队列的获取使用。host
为消息队列所在的主机ip,port
为消息队列的监听端口号(rabbitmq中默认为5672)。qos
为消息队列每次将消息发给worker时的消息个数。queue
为消息队列的名字。host
+port
+queue
可以理解为是消息队列的唯一地址。
sendto : 要发送到的消息队列,填入的信息为mq
中的name
字段中的标识符。
recvfrom : 要监听的消息队列,消息队列会把消息分发到这个worker中。填入的信息同样为mq
中的name
字段中的标识符。
消息的设计
在消息队列中,消息一共有四种类型。分别是url,page,result和自定义类型。在worker的程序中,可以通过messagequeue的四种方法(sendUrl, sendPage, sendResult, send)来插入消息。worker的downloader会处理url消息,processor会处理page消息,saver会处理result消息,freeman会处理所有的自定义的消息。我们所要做的工作,就是实现好worker中的这四个函数。
Worker接口的设计
JLiteSpider将整个的爬虫抓取流程抽象成四个部分&