用Java版本爬虫-WebMagic

2023-12-13 05:44:17

我长期关注和实践各种网页数据爬取技术。今天,我想分享我的经验,特别是使用 WebMagic 框架来爬取淘宝网的数据。WebMagic 是一个灵活、强大的Java爬虫框架,适合于数据挖掘和网页内容分析。

WebMagic 简介

WebMagic 是一个简单而强大的 Java 爬虫框架,它提供了灵活的API来抓取网页数据。它的核心优势在于易用性和可扩展性,使得从网页抓取数据变得轻而易举。这个部分将介绍 WebMagic 的基本架构和工作原理。

// 基础代码示例:初始化一个简单的 WebMagic 爬虫
Spider.create(new YourPageProcessor())
    .addUrl("http://www.taobao.com")
    .thread(5)
    .run();

核心组件

  • PageProcessor: 页面处理接口,用于解析页面和提取信息。
  • Downloader: 下载网页的组件。
  • Scheduler: 管理待爬取URL队列的组件。
  • Pipeline: 处理PageProcessor提取出的结果。

环境搭建

首先,确保你的开发环境中安装了 JDK 1.8 或更高版本。WebMagic 可以通过 Maven 依赖轻松集成到你的项目中:

几个比较关键的依赖

<dependency>
    <groupId>us.codecraft</groupId>
    <artifactId>webmagic-core</artifactId>
    <version>0.10.0</version>
</dependency>
<dependency>
    <groupId>us.codecraft</groupId>
    <artifactId>webmagic-extension</artifactId>
    <version>0.10.0</version>
</dependency>
<dependency>
    <groupId>us.codecraft</groupId>
    <artifactId>webmagic-selenium</artifactId>
    <version>0.10.0</version>
</dependency>
<dependency>
    <groupId>org.jsoup</groupId>
    <artifactId>jsoup</artifactId>
    <version>1.17.1</version>
</dependency>

WebMagic 基础使用

始之前,我们先建立一个简单的爬虫来爬取淘宝网的某个商品页面。首先,创建一个实现 PageProcessor 接口的类:

public class TaobaoPageProcessor implements PageProcessor {

    private Site site = Site.me().setRetryTimes(3).setSleepTime(1000);

    @Override
    public void process(Page page) {
        // 解析页面,获取商品标题
        page.putField("title", page.getHtml().xpath("//title/text()").toString());
page.putField("name", page.getHtml().xpath("//h3[@class='product-        name']/text()").toString());
        page.putField("price", page.getHtml().xpath("//span[@class='product-price']/text()").toString());
        // 添加更多URL到爬取队列
        page.addTargetRequests(page.getHtml().links().regex("(https://item.taobao.com/item.htm\\?id=[\\w]+)").all());
        

    }

    @Override
    public Site getSite() {
        return site;
    }
}

接下来,设置一个主类来启动爬虫:

public class TaobaoSpider {
    public static void main(String[] args) {
        Spider.create(new TaobaoPageProcessor())
            .addUrl("https://item.taobao.com/item.htm?id=示例商品ID")
            .thread(5)
            .run();
    }
}

自定义 Downloader

WebMagic 默认使用 HttpClient 进行网页下载。但有时我们需要处理复杂的网页,比如 AJAX 加载的内容。这时,可以使用 Selenium 来实现一个自定义的 Downloader:

public class SeleniumDownloader implements Downloader {

    @Override
    public Page download(Request request, Task task) {
        // 使用 Selenium WebDriver 获取动态内容
        // ...
    }

    @Override
    public void setThread(int threadNum) {
        // 实现多线程逻辑
    }
}

WebMagic 是一个强大的工具,适用于各种网页数据爬取任务。通过本文的介绍,你应该能够开始使用 WebMagic 来爬取所需的数据。记住,爬虫的使用应遵守网站的使用条款和相关法律法规。

队列去重-布隆过滤器

在 WebMagic 中使用布隆过滤器(Bloom Filter)是一种有效的方法来避免重复抓取已经访问过的 URL。布隆过滤器是一种空间效率极高的概率数据结构,用于判断一个元素是否在一个集合中。在爬虫应用中,它通常用来判断一个 URL 是否已经被爬取。

WebMagic 并没有直接集成布隆过滤器,但你可以通过扩展或定制 Scheduler 来实现这一功能。以下是如何在 WebMagic 中使用布隆过滤器的步骤:

1. 引入布隆过滤器依赖

首先,如果你的项目中还没有布隆过滤器的实现,你可以使用如 Google 的 Guava 库。在 Maven 项目中添加以下依赖:

<dependency>
    <groupId>com.google.guava</groupId>
    <artifactId>guava</artifactId>
    <version>最新版本</version>
</dependency>
2. 自定义 Scheduler

创建一个自定义的 Scheduler,它使用布隆过滤器来检查 URL 是否已经被抓取。

import com.google.common.hash.BloomFilter;
import com.google.common.hash.Funnels;
import us.codecraft.webmagic.Request;
import us.codecraft.webmagic.Scheduler;
import us.codecraft.webmagic.Task;

public class BloomFilterScheduler implements Scheduler {

    private BloomFilter<CharSequence> bloomFilter;

    public BloomFilterScheduler() {
        // 初始化布隆过滤器
        bloomFilter = BloomFilter.create(Funnels.stringFunnel(), 1000000);
    }

    @Override
    public void push(Request request, Task task) {
        if (!bloomFilter.mightContain(request.getUrl())) {
            bloomFilter.put(request.getUrl());
            // 将新的URL加入队列
            // ...
        }
    }

    @Override
    public Request poll(Task task) {
        // 从队列中获取下一个URL
        // ...
        return null;
    }
}
3. 在爬虫中使用自定义 Scheduler

在你的爬虫中,使用这个自定义的 BloomFilterScheduler 替代默认的 Scheduler。

Spider.create(new YourPageProcessor())
    .setScheduler(new BloomFilterScheduler())
    .addUrl("http://www.taobao.com")
    .thread(5)
    .run();

文章来源:https://blog.csdn.net/oWuChenHua/article/details/134864000
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。