简述
爬虫在抓取一个页面后一般有两个任务,一个是解析页面内容,一个是将需要继续抓取的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();
相关推荐
什么是线程安全? 答:线程安全是多线程编程时的计算机程序代码中的一个概念。在拥有共享数据的多条线程...先看下线程安全队列的用法: ConcurrentQueue<int> ts = new System.Collections.Concurrent.ConcurrentQueue
易语言简单的多线程消息队列。@Patek。
由于具体测试代码未给出,这部分无法提供详细的实现,但以上给出了一个实现线程安全队列和进行测试的基本框架。 通过这样的实现和测试,我们可以确保在多线程环境中,C++的线程安全队列能够正确地工作,避免了数据...
线程消息队列是并发编程中一种常见的同步和通信机制,尤其在多线程环境和异步处理中扮演着重要角色。它通过提供一个数据结构,即消息队列,来协调多个生产者线程和一个或多个消费者线程之间的交互。这种设计模式允许...
总之,多线程任务队列是并发编程中的重要工具,通过合理的同步和调度策略,可以有效利用多核处理器资源,提高软件的并发处理能力和响应速度。在C++中实现这样的队列,需要掌握线程同步、线程池和合适的数据结构等...
众所周知,在普通的非线程安全队列有两种实现方式: 1.使用数组实现的循环队列。 2.使用链表实现的队列。 先看看两种方式的优劣: .Net Farmework中的普通队列Queue的实现使用了第一种方式,缺点是当队列空间不足会...
阻塞队列是一种在多线程编程中广泛使用的并发数据结构,它在计算机科学和编程领域,特别是Java和C++等面向对象语言中扮演着重要角色。标题中的“支持多线程和泛型的阻塞队列”意味着我们讨论的是一个能够同时处理多...
文档描述中未提供额外信息,但结合标题和部分内容,我们可以推测文档主要涉及的是Java编程语言中实现网页爬虫的相关框架和工具。 文档内容可以被分解为以下几个关键部分: 1. 爬虫框架组件:这部分详细描述了爬虫...
在计算机科学中,多线程和循环队列是两个重要的概念,它们在高效并发编程中发挥着关键作用。本文将详细探讨多线程环境下的循环队列应用。 首先,我们来理解多线程。多线程是一种编程模型,允许一个程序同时执行多个...
队列在多线程环境下常常用于任务调度、消息传递等场景,因为它们能有效地管理和同步数据访问。本实例将详细讲解如何在多线程中使用C#的Queue类。 首先,我们创建一个队列实例,通过`new Queue()`来指定存储的数据...
在易语言中,我们可以使用其内置的线程和同步对象支持来构建多线程任务队列模型。例如,可以使用“创建线程”命令创建新的线程,利用“线程同步”命令来实现线程间的同步,以及使用“队列”数据类型来管理任务队列。...
Java开源爬虫框架,如标题所示,主要涉及的是...结合Maven和IDEA,开发者可以快速搭建并调试爬虫项目,利用多线程和分布式技术提升爬取性能。深入理解这些知识点,将有助于你在实际项目中构建稳定、可靠的爬虫系统。
《秒杀多线程第十六篇 多线程十大经典案例之一 双线程读写队列数据》 http://blog.csdn.net/morewindows/article/details/8646902 配套程序 在《秒杀多线程系列》的前十五篇中介绍多线程的相关概念,多线程同步互斥...
C++多线程,消息队列用法,为了凑够20个字,拼了。
【C++ 语言】线程安全队列 ( 条件变量 | 线程调度 ) : https://hanshuliang.blog.csdn.net/article/details/102851323 下载完项目后 , 使用 Visual Studio 打开 , 注意需要配置 POSIX 线程库 ( 参考以下博客配置...
在多线程编程中,生产者消费者模型是一种常见的设计模式,用于解决线程间的通信和同步问题。在C#中,我们可以利用各种机制实现这样的队列。本篇将详细讲解如何在C#中构建一个生产消费者队列,以及它如何帮助优化线程...
一个gecco爬虫框架,简单易用,使用jquery风格的选择器抽取元素 支持爬取规则的动态配置和加载 支持页面中的异步ajax请求 支持页面中的javascript变量抽取 利用Redis实现分布式...十、Gecco爬虫框架的线程和队列模型
9. **线程间通信**:`Monitor.Pulse`和`Monitor.Wait`可以用于线程间的同步和通信,使得一个线程可以在等待队列中有新任务时被唤醒。 10. **设计模式**:生产者消费者模式在这里非常适用,生产者(通常是用户界面或...