`
xtuhcy
  • 浏览: 144539 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

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

阅读更多

简述

爬虫在抓取一个页面后一般有两个任务,一个是解析页面内容,一个是将需要继续抓取的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();
1
0
分享到:
评论

相关推荐

    c# 线程安全队列的用法原理及使用示例

    什么是线程安全? 答:线程安全是多线程编程时的计算机程序代码中的一个概念。在拥有共享数据的多条线程...先看下线程安全队列的用法: ConcurrentQueue<int> ts = new System.Collections.Concurrent.ConcurrentQueue

    易语言简单的多线程消息队列

    易语言简单的多线程消息队列。@Patek。

    线程消息队列

    线程消息队列是并发编程中一种常见的同步和通信机制,尤其在多线程环境和异步处理中扮演着重要角色。它通过提供一个数据结构,即消息队列,来协调多个生产者线程和一个或多个消费者线程之间的交互。这种设计模式允许...

    多线程 队列利用

    5. **生产者-消费者模型**:这是多线程和队列结合的经典应用,生产者负责填充队列,消费者负责消耗队列中的任务,队列充当两者之间的缓冲区。 6. **线程池与队列**:线程池中,任务会被放入一个工作队列,线程从...

    多线程任务队列

    总之,多线程任务队列是并发编程中的重要工具,通过合理的同步和调度策略,可以有效利用多核处理器资源,提高软件的并发处理能力和响应速度。在C++中实现这样的队列,需要掌握线程同步、线程池和合适的数据结构等...

    支持多线程和泛型的阻塞队列

    阻塞队列是一种在多线程编程中广泛使用的并发数据结构,它在计算机科学和编程领域,特别是Java和C++等面向对象语言中扮演着重要角色。标题中的“支持多线程和泛型的阻塞队列”意味着我们讨论的是一个能够同时处理多...

    Java爬虫框架(20210809123939).pdf

    文档描述中未提供额外信息,但结合标题和部分内容,我们可以推测文档主要涉及的是Java编程语言中实现网页爬虫的相关框架和工具。 文档内容可以被分解为以下几个关键部分: 1. 爬虫框架组件:这部分详细描述了爬虫...

    c#高效的线程安全队列ConcurrentQueueT的实现

    众所周知,在普通的非线程安全队列有两种实现方式: 1.使用数组实现的循环队列。 2.使用链表实现的队列。 先看看两种方式的优劣:  .Net Farmework中的普通队列Queue的实现使用了第一种方式,缺点是当队列空间不足会...

    多线程与循环队列

    在计算机科学中,多线程和循环队列是两个重要的概念,它们在高效并发编程中发挥着关键作用。本文将详细探讨多线程环境下的循环队列应用。 首先,我们来理解多线程。多线程是一种编程模型,允许一个程序同时执行多个...

    多线程任务队列模型-易语言

    在易语言中,我们可以使用其内置的线程和同步对象支持来构建多线程任务队列模型。例如,可以使用“创建线程”命令创建新的线程,利用“线程同步”命令来实现线程间的同步,以及使用“队列”数据类型来管理任务队列。...

    java开源爬虫框架

    Java开源爬虫框架,如标题所示,主要涉及的是...结合Maven和IDEA,开发者可以快速搭建并调试爬虫项目,利用多线程和分布式技术提升爬取性能。深入理解这些知识点,将有助于你在实际项目中构建稳定、可靠的爬虫系统。

    C#队列Queue多线程用法实例

    队列在多线程环境下常常用于任务调度、消息传递等场景,因为它们能有效地管理和同步数据访问。本实例将详细讲解如何在多线程中使用C#的Queue类。 首先,我们创建一个队列实例,通过`new Queue()`来指定存储的数据...

    C++多线程,消息队列用法

    C++多线程,消息队列用法,为了凑够20个字,拼了。

    多线程操作日志队列

    这种模式利用了多线程技术,通过队列作为数据结构来协调生产者(日志生成者)和消费者(日志处理器)之间的交互,确保数据的安全性和一致性。 1. **多线程**:多线程是现代计算机系统中并发执行任务的基本方式。在...

    workquere工作队列 多线程

    9. **线程间通信**:`Monitor.Pulse`和`Monitor.Wait`可以用于线程间的同步和通信,使得一个线程可以在等待队列中有新任务时被唤醒。 10. **设计模式**:生产者消费者模式在这里非常适用,生产者(通常是用户界面或...

    java多线程加队列上传文件_后台处理

    通过以上分析可以看出,Java多线程加队列上传文件的实现不仅涉及基础的网络编程和文件操作知识,还需要掌握高级的多线程管理和并发控制技术。这种技术方案适用于需要高效处理大量文件上传请求的场景,比如云存储服务...

    MFC的多线程队列程序源代码

    本示例中的"多线程队列程序源代码"是一个很好的实践案例,用于理解多线程和队列的原理及其在实际编程中的应用。 首先,我们要明白多线程的概念。在单线程程序中,任务是顺序执行的,而在多线程程序中,可以同时执行...

    python线程、队列等应用示例

    在Python编程语言中,多线程和队列是实现多任务和并发操作的两个核心概念。多线程指的是能够同时运行多个线程,从而提高程序的执行效率,特别适合执行I/O密集型任务。队列(Queue)是多线程编程中用于线程间安全通信...

    基于Java的多线程爬虫框架

    在IT领域,尤其是在网络数据采集和分析中,Java多线程爬虫框架是不可或缺的工具。这类框架允许开发者高效地抓取和处理大量网页信息,为数据分析、搜索引擎优化(SEO)、市场研究等应用提供支持。下面我们将深入探讨...

Global site tag (gtag.js) - Google Analytics