热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

手写分布式爬虫框架

目录分布式爬虫框架Demo起因弊端目标用最简单的代码实现一个爬虫建立爬虫模型(接口)使用集群,异构需要改动的点分布式后语分布式爬虫框架De

目录

  • 分布式爬虫框架 Demo
    • 起因
    • 弊端
    • 目标
    • 用最简单的代码实现一个爬虫
    • 建立爬虫模型(接口)
        • 使用
    • 集群,异构
        • 需要改动的点
    • 分布式
    • 后语


分布式爬虫框架 Demo

记录用Java开发一个简单的分布式爬虫框架,从最开始的十几行代码到开发一个支持集群、分布式的爬虫框架。

代码地址:单机版本 分布式版本

起因

在训练智能问答机器人的模型时,缺少模型数据,决定使用爬虫进行。
当前每天的生活如下:

  • 写一个爬虫抓数据
  • 训练模型
  • 查看训练结果

弊端


  • 单线程爬虫太慢了,没法充分利用计算资源,亟需性能提升。
  • 目标网站经常变更,势必经常添加、修改爬取网站。需要一个框架(其实已有很多很好地框架,这里仅为了学习)。
  • 手动触发爬虫和训练太蠢了,希望自动触发,夜里完成

由于“懒”,第一步第二步占用了90%的时间,决定将其自动化。

目标


  • 每天凌晨2点定时增量抓取数据并保存
  • 每天凌晨3点训练模型
  • 每天白天到实验室增加爬虫数据源,看结果,调整模型



用最简单的代码实现一个爬虫

用十几行代码爬取全站新闻 代码地址



建立爬虫模型(接口)

用面向对象的思想将爬取数据抽象为

  • 任务(主要包含目标网站 url)
  • 爬虫(执行任务(发起HTTP请求),返回目标 url 的数据)
  • 结果处理(将爬虫返回的数据处理,主要包含解析、保存)

模型完善
上面的基本模型有了,但是还不够完善,补充一些东西。

  • 为了充分利用计算资源,爬虫和结果都使用多线程执行,线程还要复用,这里为他们分为两个不同的线程池(IO和计算)。
  • 为了消除任务创建和爬虫的耦合,在任务和爬虫间增加一个队列(因为在处理页面结果时,可能再发出新的爬虫HTTP请求,或者说创建爬虫任务)。

初步方案如图:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-6NSFv1Wb-1591437963199)(https://gitee.com/ChinaLym/learn-spider/raw/single-1.0/spider.png)]

模型解读

  • 由爬虫启动器(SpiderStarter)创建爬虫任务(SpiderTask)加入到任务队列(SpiderTaskQueue)
  • 爬虫管理器(SpiderManager)间歇性的从爬虫任务队列中尝试获取全部任务,并分配给爬虫(Spider)使用新线程去爬取
  • 爬虫(Spider)向任务(SpiderTask)中描述的url发起Http请求并反回结果,交给结果处理器接头人(ResultHanderManager)然后等等爬虫管理器(SpiderManager)再次分配任务。
  • 爬虫结果处理器接头人(ResultHanderManager)收到结果后开启处理线程,交给对应的结果处理器(Handler)去处理
  • 爬虫结果处理器(Handler)来处理返回的数据(匹配想要的内容,保存到希望的文件),若希望爬取深一层的url,也可以在处理过程中创建新的爬虫任务,扔进爬虫队列(SpiderTaskQueue)

触发

  • 项目启动时
  • 每天凌晨2点

调用启动器(SpiderStarter)的start方法即可。

代码实现
单机版本

使用

想新增加一个网站的爬取处理时,只需要新增一个爬虫类型:

  • 新建 xxxSpiderTask 类来保存 url 和任务类型
  • 新建 xxxHandler 类来处理新的爬取来的数据



集群,异构

实验室里有多台电脑,想充分利用这些电脑,就得让自己的爬虫支持集群,由于爬虫本身并不关心是否支持集群,那就从刚才搭好的框架做,框架实现,所有爬虫便全都支持。

需要改动的点

由于我们已经使用面向对象的思想建立好了模型,因此想支持集群只需要多个实例共享 Task 的状态即可。故只需要将 SpiderTaskQueue 切换为消息中间件,并实现Task的序列化即可。

其中消息中间件开源的有如 RabbitMq、KafKa 等,序列化直接用 Json 就好了。

代码参见 Gitee

分布式

集群后其实一个实例既能爬取,又能处理,但爬虫和处理消耗的资源不对等,因此决定将它拆开,分开运行,同时实验室有专门的同学也可以用python写爬虫,也有会Java的同学专门做数据处理,充分发挥各个语言的优势。

.#### 需要改动的点

为了解决这个问题很简单,我们只需要将爬虫执行器和处理器分开即可,只需要添加一个爬虫结果队列,爬虫执行完后,将结果放置在队列中,爬虫结果处理器从这个队列里取就好了。

代码参见 爬虫执行器代码 爬虫处理器代码

这样可以更加合理的利用计算机资源。

  • 当爬虫任务大量增加时,便可以只部署爬虫执行实例,快速爬取。
  • 当爬虫结果多但任务少时,可以减少爬虫执行器的实例,增加结果处理实例加速解析。



后语

本框架仅为思想启发,如何将一个问题更好地解决,未关注性能问题,实现中有很多可以优化的点~。


推荐阅读
  • 本文提供了 RabbitMQ 3.7 的快速上手指南,详细介绍了环境搭建、生产者和消费者的配置与使用。通过官方教程的指引,读者可以轻松完成初步测试和实践,快速掌握 RabbitMQ 的核心功能和基本操作。 ... [详细]
  • 解决基于XML配置的MyBatis在Spring整合中出现“无效绑定语句(未找到):com.music.dao.MusicDao.findAll”问题的方法
    在将Spring与MyBatis进行整合时,作者遇到了“无效绑定语句(未找到):com.music.dao.MusicDao.findAll”的问题。该问题主要出现在使用XML文件配置DAO层的情况下,而注解方式配置则未出现类似问题。作者详细分析了两个配置文件之间的差异,并最终找到了解决方案。本文将详细介绍问题的原因及解决方法,帮助读者避免类似问题的发生。 ... [详细]
  • 掌握PHP框架开发与应用的核心知识点:构建高效PHP框架所需的技术与能力综述
    掌握PHP框架开发与应用的核心知识点对于构建高效PHP框架至关重要。本文综述了开发PHP框架所需的关键技术和能力,包括但不限于对PHP语言的深入理解、设计模式的应用、数据库操作、安全性措施以及性能优化等方面。对于初学者而言,熟悉主流框架如Laravel、Symfony等的实际应用场景,有助于更好地理解和掌握自定义框架开发的精髓。 ... [详细]
  • 进程(Process)是指计算机中程序对特定数据集的一次运行活动,是系统资源分配与调度的核心单元,构成了操作系统架构的基础。在早期以进程为中心的计算机体系结构中,进程被视为程序的执行实例,其状态和控制信息通过任务描述符(task_struct)进行管理和维护。本文将深入探讨进程的概念及其关键数据结构task_struct,解析其在操作系统中的作用和实现机制。 ... [详细]
  • 本文深入探讨了IO复用技术的原理与实现,重点分析了其在解决C10K问题中的关键作用。IO复用技术允许单个进程同时管理多个IO对象,如文件、套接字和管道等,通过系统调用如`select`、`poll`和`epoll`,高效地处理大量并发连接。文章详细介绍了这些技术的工作机制,并结合实际案例,展示了它们在高并发场景下的应用效果。 ... [详细]
  • 深入解析十大经典排序算法:动画演示、原理分析与代码实现
    本文深入探讨了十种经典的排序算法,不仅通过动画直观展示了每种算法的运行过程,还详细解析了其背后的原理与机制,并提供了相应的代码实现,帮助读者全面理解和掌握这些算法的核心要点。 ... [详细]
  • IIS 7及7.5版本中应用程序池的最佳配置策略与实践
    在IIS 7及7.5版本中,优化应用程序池的配置是提升Web站点性能的关键步骤。具体操作包括:首先定位到目标Web站点的应用程序池,然后通过“应用程序池”菜单找到对应的池,右键选择“高级设置”。在一般优化方案中,建议调整以下几个关键参数:1. **基本设置**: - **队列长度**:默认值为1000,可根据实际需求调整队列长度,以提高处理请求的能力。此外,还可以进一步优化其他参数,如处理器使用限制、回收策略等,以确保应用程序池的高效运行。这些优化措施有助于提升系统的稳定性和响应速度。 ... [详细]
  • 我正在使用 Ruby on Rails 构建个人网站。总体而言,RoR 是一个非常出色的工具,它提供了丰富的功能和灵活性,使得创建自定义页面变得既高效又便捷。通过利用其强大的框架和模块化设计,我可以轻松实现复杂的功能,同时保持代码的整洁和可维护性。此外,Rails 的社区支持也非常强大,为开发过程中遇到的问题提供了丰富的资源和解决方案。 ... [详细]
  • Java服务问题快速定位与解决策略全面指南 ... [详细]
  • 基于Node.js的高性能实时消息推送系统通过集成Socket.IO和Express框架,实现了高效的高并发消息转发功能。该系统能够支持大量用户同时在线,并确保消息的实时性和可靠性,适用于需要即时通信的应用场景。 ... [详细]
  • 在CentOS上部署和配置FreeSWITCH
    在CentOS系统上部署和配置FreeSWITCH的过程涉及多个步骤。本文详细介绍了从源代码安装FreeSWITCH的方法,包括必要的依赖项安装、编译和配置过程。此外,还提供了常见的配置选项和故障排除技巧,帮助用户顺利完成部署并确保系统的稳定运行。 ... [详细]
  • 本文深入解析了 Apache 配置文件 `httpd.conf` 和 `.htaccess` 的优化方法,探讨了如何通过合理配置提升服务器性能和安全性。文章详细介绍了这两个文件的关键参数及其作用,并提供了实际应用中的最佳实践,帮助读者更好地理解和运用 Apache 配置。 ... [详细]
  • 本文探讨了如何在C#中实现USB条形码扫描仪的数据读取,并自动过滤掉键盘输入,即使不知道设备的供应商ID(VID)和产品ID(PID)。通过详细的技术指导和代码示例,展示了如何高效地处理条形码数据,确保系统能够准确识别并忽略来自键盘的干扰信号。该方法适用于多种USB条形码扫描仪,无需额外配置设备信息。 ... [详细]
  • Java队列机制深度解析与应用指南
    Java队列机制在并发编程中扮演着重要角色。本文深入解析了Java队列的各种实现类及其应用场景,包括`LinkedList`、`ArrayBlockingQueue`和`PriorityQueue`等,并探讨了它们在高并发环境下的性能表现和适用场景。通过详细分析这些队列的内部机制和使用技巧,帮助开发者更好地理解和应用Java队列,提升系统的设计和架构能力。 ... [详细]
  • 西北工业大学作为陕西省三所985和211高校之一,虽然在农业和林业领域不如某些顶尖院校,但在航空航天领域的实力尤为突出。该校的计算机科学专业在科研和教学方面也具有显著优势,是考研的理想选择。 ... [详细]
author-avatar
wyf叶子_594
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有