使用WebMagic实现网络爬虫快速抓取内容

在本教程中,我们研究了WebMagic,它的架构和设置细节。WebMagic提供了一种简单而强大的方法来用Java构建Web爬虫。它的设计允许开发人员专注于提取数据,而不是编写HTTP、解析和线程的样板代码。

网络爬虫或蜘蛛是一个程序,搜索和自动索引网络内容和网络上的其他数据。网络爬虫扫描网页以了解每个网站页面,以便在用户执行搜索查询时检索,更新和索引信息。

WebMagic是一个简单,强大,可扩展的网络爬虫框架。它的灵感来自Python的流行框架Scrapy。它处理HTTP请求,HTML解析,任务调度和数据管道处理,使用最少的样板。

在本教程中,我们将探索WebMagic,它的架构,设置和一个基本的Hello World示例。


WebMagic采用模块化和可扩展的架构构建。让我们来看看它的核心组件:

webmagic-architecture
1. Spider
Spider是协调整个爬行过程的主引擎。它接受初始URL并调用下载器、处理器和管道。

2. 调度器
爬虫的主要工作是管理需要抓取的URL队列。它还通过跟踪访问过的URL来防止重复抓取。它每次发送一个请求到下载器进行进一步处理。我们还可以使用内存中的、基于文件的、Redis支持的或自定义的编译器。

3. 下载器
Downloader负责处理实际的HTTP请求。它负责从互联网下载HTML内容。下载器的默认实现使用Apache HttpClient,但我们可以将其自定义为使用OkHttp或任何其他库。一旦页面被下载,它就会将下载的页面传递给PageProcessor。

4. PageProcessor网页处理器
PageProcessor也被称为爬虫逻辑的核心。顾名思义,它定义了如何提取目标数据(如产品、价格等)。和新的链接从一个页面抓取。我们必须实现process方法来解析响应并提取所需的信息。

一旦被提取,数据将被发送到管道,而要抓取的新链接将被发送回爬虫。

5.管道
管道处理提取数据的后处理。最常见的操作是将提取的数据保存到数据库或将其写入文件或控制台。

安装Maven
WebMagic使用Maven作为其构建工具,因此最好使用Maven管理我们的项目。让我们看看pom.xml文件中的以下依赖项:

<dependency>
    <groupId>us.codecraft</groupId>
    <artifactId>webmagic-core</artifactId>
    <version>1.0.3</version>
</dependency>
<dependency>
    <groupId>us.codecraft</groupId>
    <artifactId>webmagic-extension</artifactId>
    <version>1.0.3</version>
</dependency>
此外,WebMagic使用slf 4j和slf 4j-log4j 12实现。我们需要从我们的实现中排除slf 4j-log4j 12以避免冲突:

<exclusions>
    <exclusion>
        <groupId>org.slf4j</groupId>
        <artifactId>slf4j-log4j12</artifactId>
    </exclusion>
</exclusions>

Hello World示例
让我们看一个例子,我们将抓取books.toscrape.com网站,并在控制台上打印前10本书的标题和价格。

public class BookScraper implements PageProcessor {
    private Site site = Site.me().setRetryTimes(3).setSleepTime(1000);
    @Override
    public void process(Page page) {
        var books = page.getHtml().css("article.product_pod");
        for (int i = 0; i < Math.min(10, books.nodes().size()); i++) {
            var book = books.nodes().get(i);
            String title = book.css(
"h3 a", "title").get();
            String price = book.css(
".price_color", "text").get();
            System.out.println(
"Title: " + title + " | Price: " + price);
        }
    }
    @Override
    public Site getSite() {
        return site;
    }
    public static void main(String[] args) {
        Spider.create(new BookScraper())
          .addUrl(
"https://books.toscrape.com/")
          .thread(1)
          .run();
    }
}

在上面的例子中,我们定义了一个实现PageProcessor的类BookScraper。函数process()和getSite()允许我们定义如何抓取页面和爬虫设置。下面的行配置Crawler重试失败的请求最多三次,并在请求之间等待一秒钟,以帮助避免被阻塞:

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

的进程()函数包含实际的抓取逻辑。它选择所有的HTML文章元素从books.toscrape.com具有CSS类站点.product_pod.我们浏览每本书,并使用CSS选择器来提取和打印标题和价格。

在main函数中,我们使用我们的类创建了一个新的WebMagic spider。我们从书的主页开始,用一个线程运行它,然后开始爬行。

让我们来看看程序下面的输出,在那里我们可以看到10本书的标题和价格:

17:02:26.460 [main] INFO us.codecraft.webmagic.Spider -- Spider books.toscrape.com started!
Title: A Light in the Attic | Price: £51.77
Title: Tipping the Velvet | Price: £53.74
Title: Soumission | Price: £50.10
Title: Sharp Objects | Price: £47.82
Title: Sapiens: A Brief History of Humankind | Price: £54.23
Title: The Requiem Red | Price: £22.65
Title: The Dirty Little Secrets of Getting Your Dream Job | Price: £33.34
Title: The Coming Woman: A Novel Based on the Life of the Infamous Feminist, Victoria Woodhull | Price: £17.93
Title: The Boys in the Boat: Nine Americans and Their Epic Quest for Gold at the 1936 Berlin Olympics | Price: £22.60
Title: The Black Maria | Price: £52.15
get page: https://books.toscrape.com/