面向对象的分布式爬虫框架XXL-CRAWLER

《面向对象的分布式爬虫框架XXL-CRAWLER》

Maven Central
GitHub release
License

一、简介

1.1 概述

XXL-CRAWLER 是一个灵活高效、面向对象的分布式爬虫框架。一行代码开发一个分布式爬虫;

1.2 特性

  • 1、面向对象:通过VO对象描述页面信息,提供注解方便的映射页面数据,爬取结果主动封装Java对象返回;
  • 2、多线程;
  • 3、扩散全站:将会以现有URL为起点扩散爬取整站;
  • 4、去重:防止重复爬取;
  • 5、URL白名单:支持设置页面白名单正则,过滤URL;
  • 6、异步:支持同步、异步两种方式运行;
  • 7、自定义请求信息,如:请求参数、Cookie、userAgent等;
  • 8、轻量级:底层实现仅依赖jsoup,简洁高效;
  • 9、超时控制:支持设置爬虫请求的超时时间;
  • 10、主动停顿:爬虫线程处理完页面之后进行主动停顿,避免过于频繁被拦截;
  • 11、单个页面支持抽取多个PageVO;

1.4 下载

文档地址
源码仓库地址
源码仓库地址Release Download
https://github.com/xuxueli/xxl-crawlerDownload
https://gitee.com/xuxueli0323/xxl-crawlerDownload
技术交流

1.5 环境

  • JDK:1.7+

二、快速入门

爬虫示例参考

(爬虫示例代码位于 /test 目录下)
- 1、爬取页面数据并封装VO对象
- 2、爬取页面,下载Html文件
- 3、爬取页面,下载图片文件

第一步:引入Maven依赖

<dependency>
    <groupId>com.xuxueli</groupId>
    <artifactId>xxl-crawler</artifactId>
    <version>1.0.0</version>
</dependency>

第二步:定义 “PageVo/页面数据对象”(可选)

// PageSelect 注解:从页面中抽取出多个VO对象;
@PageSelect(".body")
public static class PageVo {

    @PageFieldSelect(cssQuery = ".blog-heading .title")
    private String title;

    @PageFieldSelect(cssQuery = "#read")
    private int read;

    @PageFieldSelect(cssQuery = ".comment-content")
    private List<String> comment;

    // set get
}

第三步:创建爬虫

XxlCrawler crawler = new XxlCrawler.Builder()
    .setUrls(new HashSet<String>(Arrays.asList("https://my.oschina.net/xuxueli/blog")))
    .setWhiteUrlRegexs(new HashSet<String>(Arrays.asList("https://my\\.oschina\\.net/xuxueli/blog/\\d+")))
    .setThreadCount(3)
    .setPageParser(new PageParser<PageVo>() {
        @Override
        public void parse(Document html, PageVo pageVo) {
            // 解析封装 PageVo 对象
            String pageUrl = html.baseUri();
            System.out.println(pageUrl + ":" + pageVo.toString());
        }
    })
    .build();

第四步:启动爬虫

crawler.start(true);

三、总体设计

3.1 功能定位

XXL-CRAWLER 是一个灵活高效、面向对象的Web爬虫框架。;

借助 XXL-CRAWLER,一行代码开发一个分布式爬虫。

3.2 核心概念

概念说明
XxlCrawler爬虫对象,维护爬虫信息
PageVo页面数据对象,一张Web页面可抽取一个或多个PageVo
PageParser页面解析器,绑定泛型PageVO后将会自动抽取页面数据对象

3.3 爬虫对象:XxlCrawler

功能:爬虫对象,维护爬虫信息,可选属性如下。

方法说明
setUrls待爬的URL列表
setAllowSpread允许扩散爬取,将会以现有URL为起点扩散爬取整站
setWhiteUrlRegexsURL白名单正则,非空时进行URL白名单过滤页面
setIfPost请求方式:true=POST请求、false=GET请求
setUserAgentUserAgent
setParamMap请求参数
setCookieMap请求Cookie
setTimeoutMillis超时时间,毫秒
setPauseMillis停顿时间,爬虫线程处理完页面之后进行主动停顿,避免过于频繁被拦截;
setThreadCount爬虫并发线程数
setPageParser页面解析器

3.4 核心注解:PageSelect

功能:描述页面数据对象,通过该注解从页面抽取PageVo数据信息,可选属性如下。

PageSelect说明
cssQueryCSS选择器, 如 “#body”

3.5 核心注解:PageFieldSelect

功能:描述页面数据对象的属性信息,通过该注解从页面抽取PageVo的属性信息,可选属性如下。
(支持基础数据类型 T ,包括 List)

PageFieldSelect说明
cssQueryCSS选择器, 如 “#title”
selectTypejquery 数据抽取方式,如 “.html()/.text()/.val()/.attr()”等
attributeKeyjquery 数据抽取参数,SelectType=ATTR 时有效,如 “abs:src / .attr(“attributeKey”)”
datePattern时间格式化,日期类型数据有效

四、版本更新日志

版本 V1.0.0,新特性[2017-09-13]

  • 1、面向对象:通过VO对象描述页面信息,提供注解方便的映射页面数据,爬取结果主动封装Java对象返回;
  • 2、多线程;
  • 3、扩散全站:将会以现有URL为起点扩散爬取整站;
  • 4、去重:防止重复爬取;
  • 5、URL白名单:支持设置页面白名单正则,过滤URL;
  • 6、异步:支持同步、异步两种方式运行;
  • 7、自定义请求信息,如:请求参数、Cookie、userAgent等;
  • 8、轻量级:底层实现仅依赖jsoup,简洁高效;
  • 9、超时控制:支持设置爬虫请求的超时时间;
  • 10、主动停顿:爬虫线程处理完页面之后进行主动停顿,避免过于频繁被拦截;
  • 11、单个页面支持抽取多个PageVO;

版本 V1.1.0,新特性[规划中]

  • 1、页面默认cssQuery调整为html标签;

TODO LIST

  • 1、爬虫超时重试;
  • 2、扩展SelectType,比如HasClass等;

五、其他

5.1 项目贡献

欢迎参与项目贡献!比如提交PR修复一个bug,或者新建 Issue 讨论新特性或者变更。

5.2 用户接入登记

更多接入的公司,欢迎在 登记地址 登记,登记仅仅为了产品推广。

5.3 开源协议和版权

产品开源免费,并且将持续提供免费的社区技术支持。个人或企业内部可自由的接入和使用。

  • Licensed under the GNU General Public License (GPL) v3.
  • Copyright (c) 2015-present, xuxueli.

捐赠

无论金额多少都足够表达您这份心意,非常感谢 :) XXL系列捐赠记录

微信:
支付宝:

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
下面是一个简单的分布式爬虫示例,使用 Python 的面向对象编程方式实现: ```python import requests from bs4 import BeautifulSoup import threading import queue class Crawler: def __init__(self, urls, num_threads=5): self.urls = urls self.num_threads = num_threads self.queue = queue.Queue() self.lock = threading.Lock() self.results = [] def run(self): # 将所有 URL 放入队列 for url in self.urls: self.queue.put(url) # 创建多个线程来处理队列中的 URL for i in range(self.num_threads): t = threading.Thread(target=self.fetch) t.start() # 等待所有线程完成 for i in range(self.num_threads): t.join() return self.results def fetch(self): while True: try: url = self.queue.get(block=False) except queue.Empty: break try: response = requests.get(url) soup = BeautifulSoup(response.content, 'html.parser') # 对网页进行解析并提取数据 data = self.parse(soup) with self.lock: self.results.append(data) except: pass def parse(self, soup): # 提取网页中的数据 pass # 示例:取多个网页并提取数据 urls = ['http://example.com/page1', 'http://example.com/page2', 'http://example.com/page3'] crawler = Crawler(urls) data = crawler.run() print(data) ``` 在这个示例中,我们定义了一个 `Crawler` 类,它包含了爬虫的主要逻辑。在 `run` 方法中,我们将所有 URL 放入一个队列中,并创建多个线程来处理队列中的 URL。每个线程都会从队列中取出一个 URL,对该 URL 对应的网页进行取和数据提取,并将提取出的数据存储在 `results` 列表中。在取和数据提取的过程中,我们需要使用一个锁来保证多个线程对 `results` 列表的访问不会出现竞争条件。 当所有线程都完成任务后,我们可以通过 `results` 列表来获取所有的取结果。在这个示例中,我们只是简单地打印了结果,你可以根据自己的需求来对结果进行处理。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值