# crawloop **Repository Path**: xzhh123/crawloop ## Basic Information - **Project Name**: crawloop - **Description**: 基于PlayWright实现对js渲染的动态网页进行抓取,包含网页源码、截图、网站入口、网页交互过程等,支持优先级任务调度。 - **Primary Language**: Go - **License**: Apache-2.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2022-04-13 - **Last Updated**: 2022-04-13 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README 用go简单实现了一版playwright爬虫器,发现性能不是python版能比的,后面又用go实现了[网站目录文件爆破](https://github.com/who0sy/WebsiteFuzz)简单版本,跑起来速度简直太爽了。后面有时间会用继续用go重构此项目,python版的不再维护。 ------------------------------------------------------------------------------------------------------------ ------------------------------------------------------------------------------------------------------------- # crawloop 基于PlayWright实现对js渲染的动态网页进行抓取,包含网页源码、截图、网站入口、网页交互过程等,支持优先级任务调度。 crawloop 目前支持以下特性: - 原生浏览器环境,支持chrome、firefox,并支持开启容器内虚拟显示器; - 完整DOM事件收集,自动化触发; - 全面分析收集,包括js文件,页面源码、网站截图、网站图标、标题、编码、cookies、重定向链等等; - 基于Wappalyzer实现python版网站指纹识别,主要包含网站使用技术、技术版本号、置信度等; - 支持Host绑定,可自定义添加Referer; - 支持请求代理,支持爬虫结果通过http或gRPC主动回调; - 任务进度监控:支持实时监控任务进度; - 自定义任务参数:支持在线配置调度任务入参,即时生效; - 调度中心HA(中心式):调度采用中心式设计,“调度中心”自研调度组件并支持集群部署,可保证调度中心HA; - 爬虫执行器HA(分布式):任务分布式执行,任务"爬虫执行器"支持集群部署,可保证爬虫任务执行HA; - 弹性扩容缩容:一旦有新的爬虫执行器机器上线或者下线,下次调度时将会重新分配任务; - 触发策略:提供丰富的任务触发策略,包括:Cron触发、固定间隔触发、固定延时触发、API(事件)触发、人工触发、父子任务触发; - 阻塞处理策略:调度过于密集爬虫执行器来不及处理时的处理策略,策略包括:单机串行(默认)、丢弃后续调度、覆盖之前调度; - 任务超时控制:支持自定义任务超时时间,任务运行超时将会主动中断任务; - 任务失败重试:支持自定义任务失败重试次数,当任务失败时将会按照预设的失败重试次数主动进行重试;其中分片任务支持分片粒度的失败重试;并支持断点续爬; - 路由策略:爬虫执行器集群部署时提供丰富的路由策略,包括:第一个(已实现)、最后一个(已实现)、轮询(已实现)、加权轮询(已实现)、一致性HASH(待实现)等; - 动态分片:分片广播任务以任务数量为维度进行分片(默认为100条url为一个分片),以分片为单位下发不同爬虫执行器,协同进行业务处理;在进行大数据量爬虫任务操作时可显著提升任务处理能力和速度; - 调度线程池:调度系统多线程触发调度运行,确保调度精确执行,不被堵塞; - 全异步:任务调度流程全异步化设计实现,如异步调度、异步运行、异步回调等,有效对密集调度进行流量削峰,理论上支持任意时长任务的运行; - 跨语言:调度中心与爬虫执行器提供语言无关的 RESTful API 服务,第三方任意语言可据此对接调度中心或者实现自定义爬虫执行器; - 任务优先级控制:爬虫执行器实现优先级队列,可对不同优先级任务进行隔离拆分,慢任务或权重较低任务自动降级进入"Slow"队列,避免耗尽爬虫执行器,提高系统灵活性; - 容器化:项目编译在容器内进行,进一步实现功能开箱即用; ### 环境(Docker) - Docker 18.03+ - Postgresl 9.x+ - Rabbitmq 3.8.x+ - Docker Compose 1.24+ ## 架构 Crawloop的架构包括了一个主节点(Master Node)和多个工作节点(Worker Node),以及负责通信和数据储存的gRPC和Postgresql数据库。 ![](架构图.png) 客户端应用向主节点请求数据,主节点通过Celery和Rabbitmq来执行任务派发调度以及负载均衡,工作节点收到任务之后,开始执行爬虫任务,并将任务结果通过gRPC回调给主节点,之后落库存储。 主节点是整个Crawloop架构的核心,属于Crawloop的中控系统。 主节点主要负责以下功能: 1. 周期性任务调度 2. 工作节点管理和通信 3. 对外API服务 主节点负责与客户端进行通信,并通过Celery将爬虫任务基于负载均衡算法异步派发给工作节点。 ### 工作节点 工作节点的主要功能是执行爬虫任务和回调抓取数据与日志,并且通过gRPC跟主节点通信。通过增加工作节点数量,Crawloop可以做到横向扩展,不同的爬虫任务可以分配到不同的节点上执行。