文档章节

Gecco爬虫框架的线程和队列模型

xtuhcy
 xtuhcy
发布于 2016/06/08 10:22
字数 853
阅读 293
收藏 0
点赞 0
评论 2

##简述 爬虫在抓取一个页面后一般有两个任务,一个是解析页面内容,一个是将需要继续抓取的url放入队列继续抓取。因此,当爬取的网页很多的情况下,待抓取url的管理也是爬虫框架需要解决的问题。本文主要说的是gecco爬虫框架的队列和线程模型。

##线程和队列模型 线程和队列模型

  • gecco的队列模型是两级队列模型。分为初始请求队列和派生请求队列。初始请求队列在循环模式下是一个阻塞式的FIFO队列,在非循环模式下是一个非阻塞式的FIFO队列。派生队列是一个非阻塞的剔重的FIFO队列;
  • 线程首先去初始请求队列按照FIFO原则获取一个请求,如果线程数量大于初始请求队列的数量,多余的线程就会待定新的初始请求入队,因此建议线程数量不要大于初始请求队列的数量;
  • 对于循环模式loop(true),线程在抓取完成后,会将初始请求重新放入队列;
  • 多线程只对初始请求队列有效,每个线程会有自己的派生请求队列,因此派生请求队列是在单线程下运行的,爬虫将派生请求放入队列继续抓取,直到没有派生请求;
  • 线程在抓取完成派生请求后,会继续向初始请求队列获取初始请求

##为什么要用这种模型

  • Gecco的线程模型很像浏览器,每一个线程对应一个浏览器的Tab。每个浏览器的Tab一次只能看一个页面,因此就有了初始请求队列多线程,派生请求队列单线程的模型。
  • 使用这种队列和线程模型开发人员很好理解,结构简单易懂,效率也能保证。想用多线程提高效率就想办法放入初始请求队列。

##如何动态的获取初始请求队列 如果想通过多线程提高爬虫的效率就需要想办法将请求放入初始请求队列。我们可以先通过一个爬虫引擎将待抓取的请求保存起来。另外一个爬虫引擎以第一个爬虫引擎获取的请求作为初始请求开启多线程运行。简单说就是初始请求也是可以抓取出来的,并不一定非要写死。下面是jd采用多线程抓取的一段代码,全部代码已经上传github。

	//先获取分类列表,放入AllSortPipeline.sortRequests
	HttpGetRequest start = new HttpGetRequest("http://www.jd.com/allSort.aspx");
	start.setCharset("GBK");
	GeccoEngine.create()
	.classpath("com.geccocrawler.gecco.demo.jd")
	.start(start)
	.run();
	
	
	//分类列表下的商品列表采用3线程抓取
	GeccoEngine.create()
	.classpath("com.geccocrawler.gecco.demo.jd")
	//从上面的GeccoEngine获取初始请求
	.start(AllSortPipeline.sortRequests)
	.thread(5)
	.interval(2000)
	.start();

© 著作权归作者所有

共有 人打赏支持
xtuhcy

xtuhcy

粉丝 103
博文 16
码字总数 18277
作品 1
北京
后端工程师
加载中

评论(2)

xtuhcy
xtuhcy
想用多线程提高效率就想办法放入初始请求队列。初始队列不一定是静态的,爬虫也可以用来爬取初始队列。
xuchao
xuchao
如果队列有好几亿,这些也存在派生队列里?你的思路是什么?
vscrawler 0.2.1发布,适合用作抓取的爬虫框架

VSCrawler是一个适合用作抓取的爬虫框架,在更多场景倾向于功能扩展性而牺牲使用简便性。这让VSCrawler非常强大,让他可以灵活的应对目标网站的反爬虫策略。 vscrawler有挺多特点 1. 多用户登...

virjar
2017/12/16
686
8
易用的轻量化的网络爬虫--GECCO

Gecco是什么 Gecco是一款用java语言开发的轻量化的易用的网络爬虫。Gecco整合了jsoup、httpclient、fastjson、spring、htmlunit、redission等优秀框架,让您只需要配置一些jquery风格的选择器...

xtuhcy
2016/02/19
12.2K
21
Gecco 1.2.3 发布,易用的轻量化爬虫

Gecco 1.2.3 发布了,DynamicGecco 实现了爬虫规则的热部署,是首个支持动态加载的java爬虫框架。 DynamicGecco 的目的是在不定义 SpiderBean 的情况下实现爬取规则的运行时配置。其实现原理...

xtuhcy
2016/08/19
1K
1
Gecco 1.1.3 发布,易用的轻量化爬虫

Gecco 1.1.3 发布了,该版本改进内容包括: 处理jsonp的时候,分号问题修复 2.支持自定义下载重试次数定义,GeccoEngine.retry(count) 3.HttpClientDownloader支持response的Set Cookie自动存...

xtuhcy
2016/05/31
2.3K
9
Gecco 1.2.5 发布,易用的轻量化爬虫

Gecco 1.2.5 发布了,DynamicGecco 实现了爬虫规则的热部署,是首个支持动态加载的java爬虫框架。 更新内容: @Gecco注解支持多个matchUrl,一个spiderbean可以同时匹配多种形式的url jd地址...

xtuhcy
2016/11/03
2.1K
5
gecco 1.0.9 发布,易用的轻量化爬虫

gecco 1.0.9 发布了。 1.0.9版本主要做了如下修改: 1、@Image注解增加图片自动下载到本地的方法@Image(download="d:/gecco/jd/img") 2、GeccoEngine改为线程方式,通过start()支持非阻塞方式...

xtuhcy
2016/04/13
1K
5
gecco 1.0.7 发布,轻量化网络爬虫

gecco 1.0.7 发布了。gecco是一种轻量化网络爬虫,同时也是一款拥有很好扩展性的框架。 主要特征: 1、简单易用,使用jquery的css selector风格抽取元素 2、支持页面中的异步ajax请求 3、支持...

xtuhcy
2016/03/21
3.2K
15
Memcache-LRU爬虫线程-源码分析

介绍 memcache 中实现了内存管理模型用来存储数据,而在此基础上又实现了一套LRU爬虫模型来维护这些已使用的内存,因为如果一直使用这些内存而不去维护会占用大量的系统资源,所以提供这么一...

简单方式
2017/02/04
0
0
Gecco 1.1.1 发布,易用的轻量化爬虫

Gecco 1.1.1 发布了。该版本主要做了如下修改: 1.@Gecco不填写matchUrl时,支持匹配所有格式url的通用抓取 2.默认使用UniqueSpiderScheduler队列管理避免重复HttpRequest的抓取 3.修改table...

xtuhcy
2016/05/09
1K
2
Gecco 1.2.2 发布,首个支持动态加载的java爬虫框架

Gecco 1.2.2 发布了,DynamicGecco实现了爬虫规则的热部署,是首个支持动态加载的java爬虫框架。 DynamicGecco的目的是在不定义SpiderBean的情况下实现爬取规则的运行时配置。其实现原理是采...

xtuhcy
2016/07/18
1K
4

没有更多内容

加载失败,请刷新页面

加载更多

下一页

sklearn学习笔记之简单线性回归

简单线性回归 线性回归是数据挖掘中的基础算法之一,从某种意义上来说,在学习函数的时候已经开始接触线性回归了,只不过那时候并没有涉及到误差项。线性回归的思想其实就是解一组方程,得到...

wangxuwei
3分钟前
0
0
feign之动态interceptor(二)

背景 上文提到了按照不同的feignClient可以根据多个不同的key来进行多个不同的bean的配置 那么我们如何完成多个interceptor的配置呢? 分析 我们刚提到多个配置的玄机就在FeignClientProper...

Mr_Qi
5分钟前
1
0
Linux Kernel 4.16 系列停止维护,用户应升级至 4.17

知名 Linux 内核维护人员兼开发人员 Greg Kroah-Hartman 近日在发布 4.16.18 版本的同时,宣布这是 4.16 系列的最后一个维护版本,强烈建议用户立即升级至 4.17 系列。 Linux 4.16 于 2018 年...

问题终结者
29分钟前
0
0
Apache配置时.htaccess失效不起作用的原因分析

.htaccess 失效的原因 1. 重写规则有问题,检查自己的重写规则 2.Apache配置问题,配置中没有配置启用 rewrite a2enmod rewrite 3.网站配置文件没有启用配置需要配置 000-default.conf <Dire...

TU-DESGIN
49分钟前
1
0
两个求最大公约数C/C++算法实现

#include<stdio.h> #include<time.h> #include <iostream>using namespace std;//求最大公约数 LCD(Largest Common Division)//短除法 //m=8251, n=6105; int LCD_ShortDiv(int m, ......

失落的艺术
55分钟前
1
0
QueryPerformanceCounter

windows的Sleep函数,睡眠线程指定毫秒数,可以用来做毫秒延时。 对于微秒延时,没有一个现成的函数,但是可以通过 QueryPerformanceFrequency QueryPerformanceCounter 来间接实现。原理就是...

开飞色
今天
1
0
log4j2使用AsyncRoot不显示行号问题处理

<AsyncRoot level="info" includeLocation="true"> <AppenderRef ref="File"/></AsyncRoot><!--1.异步logger,还需要在pom.xml中添加disruptor的依赖。2.includeLocation结合异......

小翔
今天
3
0
安卓手机上 K 歌,声音延迟怎么解决?

这篇文章可以为你提供一个解决录音和播放同步问题的思路,而且解决了声音从手机传输到耳机上有延时的问题。 初识音频 在开始之前,我先简单介绍一下音频相关的基础知识,方便下文理解。 我们...

编辑部的故事
今天
2
0
使用token实现在有效期内APP自动登录功能

使用token实现在有效期内APP自动登录功能 http://sevennight.cc/2016/07/19/auto_login_impl.html

风云海滩
今天
2
0
Spring Boot集成RabbitMQ发送接收JSON

默认情况下RabbitMQ发送的消息是转换为字节码,这里介绍一下如何发送JSON数据。 ObjectMapper 最简单发送JSON数据的方式是把对象使用ObjectMapper等JSON工具类把对象转换为JSON格式,然后发送...

小致dad
今天
3
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部