Gecco爬虫框架的线程和队列模型
来源:互联网 发布:服务器端软件 编辑:程序博客网 时间:2024/05/19 17:50
简述
爬虫在抓取一个页面后一般有两个任务,一个是解析页面内容,一个是将需要继续抓取的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();
0 0
- Gecco爬虫框架的线程和队列模型
- Gecco开源爬虫框架入门
- gecco 1.0.9 发布,易用的轻量化爬虫
- gecco爬虫多个HtmlBean 匹配同一个matchUrl的问题
- 用Gecco爬虫采集数据
- crawler爬虫demo, 基于gecco
- gecco 1.1.0稳定版发布,易用的轻量化爬虫
- android数据获取 java爬虫 Gecco
- 使用Gecco写Java简单爬虫
- 采用线程池和消息队列的“伪异步”I/O模型
- TOMCAT 的 线程 和队列
- 队列和线程的关系
- Gecco框架典型案例—闲逛APP
- 用生产者消费者模型实现的线程安全环形队列
- 可以用作栈和队列的模型
- 教您使用java爬虫gecco抓取JD全部商品信息
- java爬虫gecco监控来了,不再裸奔
- 使用轻量级JAVA 爬虫Gecco工具抓取新闻DEMO
- Android 基础总结:( 二十一)AIDL详解(下)
- 带您认识不一样的Cognos
- C++面试题:String类的实现
- First Blog
- json串解析问题
- Gecco爬虫框架的线程和队列模型
- 几种常见数据库连接池的使用比较
- static和const关键字的使用
- struts2 hibernate搭建过程
- [Latex] tikz包使用时出现的一个问题及解决
- Android 基础总结:( 二十二)JSON详解(上)
- npm使用介绍
- VC开发的ActiveX加入安全机制,避免IE中提示“在此页上的ActiveX控件,,不安全,你想允许这种交互吗?”
- 【leetcode】231. Power of Two