WebMagic

WebMagic是一个简单易用的Java爬虫框架,涉及URL管理、数据流转和持久化。通过Request对象处理下载,Page封装了下载内容,ResultItems存储处理结果。使用Xpath、正则表达式和CSS选择器进行抽取。Spider类包含爬虫配置和启动方法,Scheduler组件负责URL管理和去重,支持HashSet、Redis和BloomFilter等去重策略。

WebMagic介绍
在这里插入图片描述
下载,处理,管理,持久化
数据流转对象
request:URL地址封装,是下载和处理的交互的载体
Page:下载的一个页面——Html,Json,文本格式
ResultItems:相当于一个map,保存PageProcesser处理的结果,提供Pipeline使用。一个字段skip,设置true,则不应被处理。

简单入门案例代码
需要导入 webmagic的工程‘

public class JobProcessor implements PageProcessor {
    //这个方法解析页面
    public void process(Page page) {
        //解析返回数据page,并且把解析的结果放到ResultItem
        page.putField("div",page.getHtml().css("div._2Kb8-nplK47lBDl_iifFWM" ).all());
    }

    private Site site=Site.me();
    public Site getSite() {
        return site;
    }
//主函数执行爬虫
    public static void main(String[] args) {
        //Spider大的容器
        Spider.create(new JobProcessor() )
                //设置爬取页面的数据
                .addUrl("https://kuaibao.jd.com/?ids=214569150,789182,223349485,790737")
                .run();

实现PageProcess
抽取三种抽取技术:
Xpath:http://www.w3school.com.cn
正则表达式:
CSS选择器
在这里插入图片描述
在这里插入图片描述
Spider的方法
在这里插入图 Spider片描述
爬虫的配置,启动和终止
site.me()可以对爬虫进行配置配置,包括编码,抓取时间,超时时间
在这里插入图片描述
爬虫分类
通用网络爬虫;聚焦网络爬虫;增量式爬虫;DeepWeb爬虫

Scheduler组件
管理Url的组件:抓取URL队列进行管理;对已抓取的URL进行去重。
在这里插入图片描述

在这里插入图片描述

package cn.itcast.webmagic.test;

import us.codecraft.webmagic.Page;
import us.codecraft.webmagic.Site;
import us.codecraft.webmagic.Spider;
import us.codecraft.webmagic.pipeline.FilePipeline;
import us.codecraft.webmagic.processor.PageProcessor;
import us.codecraft.webmagic.scheduler.BloomFilterDuplicateRemover;
import us.codecraft.webmagic.scheduler.QueueScheduler;

public class JobProcessor implements PageProcessor {
    //这个方法解析页面
    public void process(Page page) {
        //解析返回数据page,并且把解析的结果放到ResultItem
        page.putField("div",page.getHtml().css("div.dt cw-icon" ).all());
        //xpath
        page.putField("key2",page.getHtml().xpath("//div[@id=shortcut-2014]/div/ul/li/a"));
        //正则
        page.putField("div3",page.getHtml().css("div._3oESJEbA6EDqNUcNu8namk ").regex(".*健康.*").all());
        //获取连接   以2结尾
        page.addTargetRequests(page.getHtml().css("div._3oESJEbA6EDqNUcNu8namk data-log-url").links().regex(".*2$").all());
        page.putField("url",page.getHtml().css("div.mt h1").all());
        page.addTargetRequest("https://www.jd.com/news.html?id=37319");
        page.addTargetRequest("https://www.jd.com/news.html?id=37319");
        page.addTargetRequest("https://www.jd.com/news.html?id=37319");
    }
    //site.me()可以对爬虫进行配置配置,包括编码,抓取时间,超时时间
    private Site site=Site.me()
            .setCharset("utf8")
            .setTimeOut(10000) //设置超时时间10ms
            .setRetrySleepTime(30000)//设置重试的间隔时间
            .setSleepTime(3)//设置重试次数
            ;
    public Site getSite() {
        return site;
    }
    //主函数执行爬虫
    public static void main(String[] args) {
        //Spider大的容器
        Spider spider=Spider.create(new JobProcessor() )
                //设置爬取页面的数据
                .addUrl("https://kuaibao.jd.com/?ids=214569150")
                //设置路径
                .addPipeline(new FilePipeline("文件路经"))
                //分配线程处理
                .thread(5)
                //设置布隆去重过滤器,添加依赖
                .setScheduler(new QueueScheduler().setDuplicateRemover(new BloomFilterDuplicateRemover(1000)));

        spider.run();
    }
}

三种去重方式
HashSet;Redis;BloomFilter
在这里插入图片描述

public class JobProcessor implements PageProcessor {
    //这个方法解析页面
    public void process(Page page) {
        //解析返回数据page,并且把解析的结果放到ResultItem
        page.putField("div",page.getHtml().css("div.dt cw-icon" ).all());
        //xpath
        page.putField("key2",page.getHtml().xpath("//div[@id=shortcut-2014]/div/ul/li/a"));
        //正则
        page.putField("div3",page.getHtml().css("div._3oESJEbA6EDqNUcNu8namk ").regex(".*健康.*").all());
        //获取连接   以2结尾
        page.addTargetRequests(page.getHtml().css("div._3oESJEbA6EDqNUcNu8namk data-log-url").links().regex(".*2$").all());
        page.putField("url",page.getHtml().css("div.mt h1").all());
        page.addTargetRequest("https://www.jd.com/news.html?id=37319");
        page.addTargetRequest("https://www.jd.com/news.html?id=37319");
        page.addTargetRequest("https://www.jd.com/news.html?id=37319");
    }
    //site.me()可以对爬虫进行配置配置,包括编码,抓取时间,超时时间
    private Site site=Site.me()
            .setCharset("utf8")
            .setTimeOut(10000) //设置超时时间10ms
            .setRetrySleepTime(30000)//设置重试的间隔时间
            .setSleepTime(3)//设置重试次数
            ;
    public Site getSite() {
        return site;
    }
    //主函数执行爬虫
    public static void main(String[] args) {
        //Spider大的容器
        Spider spider=Spider.create(new JobProcessor() )
                //设置爬取页面的数据
                .addUrl("https://kuaibao.jd.com/?ids=214569150")
                //设置路径
                .addPipeline(new FilePipeline("文件路经"))
                //分配线程处理
                .thread(5)
                //设置布隆去重过滤器,添加依赖
                .setScheduler(new QueueScheduler().setDuplicateRemover(new BloomFilterDuplicateRemover(1000)));
        spider.run();
    }
}

<think>我们正在讨论Java开源爬虫框架,特别是WebMagic。根据引用内容,WebMagic是一个开源的Java垂直爬虫框架,由国人开发,在GitHub上有近7000个star,具有模块化设计、可扩展性强、支持多线程和分布式爬取等特点。它由核心模块(webmagic-core)和扩展模块(webmagic-extension)组成,还提供了与Saxon(用于XPath 2.0)和Selenium(用于动态页面抓取)结合的扩展包。 用户的问题已经明确:寻找一个可以在Java中爬取特定网站数据的开源框架,并且已经提到了WebMagic。因此,我们的回答应该围绕WebMagic展开,同时也可以简要提及其他选项(如Jsoup、Selenium等)作为补充,但重点在WebMagic。 根据引用[1][2][3][4][5],我们可以总结WebMagic的主要特点: 1. 模块化设计,可扩展性强。 2. 核心简单,覆盖爬虫全部流程。 3. 提供丰富的抽取页面API(支持XPath、CSS选择器等)。 4. 支持注解方式编写爬虫(通过POJO+注解)。 5. 支持多线程和分布式爬取。 6. 通过扩展支持动态页面(如结合Selenium)。 接下来,我们将构建回答: 1. 介绍WebMagic框架及其优势。 2. 展示一个简单的WebMagic爬虫示例(静态页面)。 3. 说明如何扩展WebMagic以处理动态页面(结合Selenium)。 4. 提供一些实施建议(如反爬措施、数据存储等)。 5. 生成相关问题。 注意:用户要求的是开源框架,WebMagic符合要求(开源协议为Apache 2.0)。 我们参考引用[4]中的代码示例,展示一个基本的WebMagic爬虫结构。 同时,根据引用[3],我们可以展示注解方式编写爬虫的示例(如果适用)。 最后,根据引用[5],我们可以提到WebMagic的四大组件(Downloader, PageProcessor, Scheduler, Pipeline)以及Spider如何组织它们。 我们将按照以下结构组织回答: - 框架简介 - 核心组件 - 示例代码(两种方式:普通方式和注解方式) - 动态页面处理(结合Selenium) - 实施建议 - 相关问题 注意:引用标记要正确,例如[^1][^2]等。 由于用户的问题中已经明确提到WebMagic,所以我们将重点放在它上面,但也会简要提及其他选项(如纯Jsoup)作为对比,以便用户根据需求选择。 下面开始构建回答。</think>基于您的需求,WebMagic 是最适合 Java 环境的高效开源爬虫框架。以下是详细说明和使用指南: ### WebMagic 核心优势 1. **纯 Java 开发**:国人开发的开源框架,GitHub 近 7k stars,文档完善[^1] 2. **模块化设计**:核心仅 700KB,支持按需扩展(动态页面/分布式等)[^2] 3. **四大核心组件**: - `Downloader`:处理 HTTP 请求(支持代理/HTTPS) - `PageProcessor`:编写页面解析逻辑 - `Scheduler`:URL 调度与去重 - `Pipeline`:数据存储(文件/DB/消息队列) 4. **支持动态渲染**:通过 `webmagic-selenium` 扩展处理 JS 页面[^1] ### 快速入门示例 #### 基础爬虫(静态页面) ```java public class MyCrawler implements PageProcessor { private Site site = Site.me() .setRetryTimes(3) .setSleepTime(1000) .setUserAgent("Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36"); @Override public void process(Page page) { // 使用XPath提取标题 String title = page.getHtml().xpath("//h1/text()").get(); page.putField("title", title); // 使用CSS选择器提取链接 List<String> links = page.getHtml().css("div.article a").links().all(); page.addTargetRequests(links); } @Override public Site getSite() { return site; } public static void main(String[] args) { Spider.create(new MyCrawler()) .addUrl("https://target-site.com") .addPipeline(new FilePipeline("D:/data")) // 保存到文件 .thread(5) // 多线程 .run(); } } ``` #### 注解模式(简化开发) ```java @TargetUrl("https://blog.oschina.net/*") public class OschinaBlog { @ExtractBy("//h1[@class='title']/text()") private String title; @ExtractBy(value = "div.content", type = ExtractBy.Type.Css) private String content; // 自动注入结果 public static void main(String[] args) { OOSpider.create(Site.me(), new ConsolePageModelPipeline(), OschinaBlog.class) .addUrl("https://blog.oschina.net/").run(); } } ``` ### 进阶功能实现 | 需求场景 | 实现方案 | |-------------------|--------------------------------------------------------------------------| | **动态页面** | 集成 `webmagic-selenium`,通过 `SeleniumDownloader` 渲染 JS[^1] | | **登录认证** | 使用 `HttpClient` 管理 Cookie 或模拟表单提交 | | **分布式爬取** | 配置 `RedisScheduler` 实现多节点协作[^4] | | **反爬虫突破** | 随机 User-Agent + 代理 IP 池 + 请求延迟 | ### 性能优化建议 1. **线程控制**:`.thread(N)` 根据目标站点承受能力设置(通常 5-20) 2. **去重策略**:内置 `HashSetScheduler` 或分布式 `RedisScheduler` 3. **断点续爬**:通过 `SpiderMonitor` 监控爬虫状态 4. **异常处理**:`setRetryTimes(3).setCycleRetryTimes(5)` 设置重试机制 > **法律提示**:爬取前务必检查 `robots.txt`,遵守 `User-Agent` 规范,避免高频请求[^1]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值