1. 程式人生 > 程式設計 >WebMagic 實現爬蟲入門教程

WebMagic 實現爬蟲入門教程

本示例實現某電影網站最新片源名稱列表及詳情頁下載地址的抓取。

webmagic是一個開源的Java垂直爬蟲框架,目標是簡化爬蟲的開發流程,讓開發者專注於邏輯功能的開發。

WebMagic 特點:

  • 完全模組化的設計,強大的可擴充套件性。
  • 核心簡單但是涵蓋爬蟲的全部流程,靈活而強大,也是學習爬蟲入門的好材料。
  • 提供豐富的抽取頁面API。
  • 無配置,但是可通過POJO+註解形式實現一個爬蟲。
  • 支援多執行緒。
  • 支援分散式。
  • 支援爬取js動態渲染的頁面。
  • 無框架依賴,可以靈活的嵌入到專案中去。

示例

本示例實現:https://www.dytt8.net/html/gndy/dyzz/list23

1.html 電影網站最新片源名稱及詳情頁影片下載連結內容的抓取。

配置Maven依賴

pom.xml配置,這裡因為日誌檔案和spring boot衝突了,所以移除webmagic的日誌依賴 log4j12

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.1.9.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.easy</groupId>
    <artifactId>webmagic</artifactId>
    <version>0.0.1</version>
    <name>webmagic</name>
    <description>Demo project for Spring Boot</description>

    <properties>
        <java.version>1.8</java.version>
        <encoding>UTF-8</encoding>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
    </properties>

    <dependencies>
        <dependency>
            <groupId>us.codecraft</groupId>
            <artifactId>webmagic-core</artifactId>
            <version>0.7.3</version>
            <exclusions>
                <exclusion>
                    <groupId>org.slf4j</groupId>
                    <artifactId>slf4j-log4j12</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
        <dependency>
            <groupId>us.codecraft</groupId>
            <artifactId>webmagic-extension</artifactId>
            <version>0.7.3</version>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
        
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <scope>compile</scope>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <configuration>
                    <source>1.8</source>
                    <target>1.8</target>
                </configuration>
            </plugin>
        </plugins>
    </build>

</project>
複製程式碼

建立列表及詳情頁解析類

PageProcessor負責解析頁面,抽取有用資訊,以及發現新的連結。WebMagic使用Jsoup作為HTML解析工具,並基於其開發瞭解析XPath的工具Xsoup。

ListPageProcesser.java 實現影片名稱列表獲取

package com.easy.webmagic.controller;

import us.codecraft.webmagic.Page;
import us.codecraft.webmagic.Site;
import us.codecraft.webmagic.processor.PageProcessor;

public class ListPageProcesser implements PageProcessor {
    private Site site = Site.me().setDomain("127.0.0.1");

    @Override
    public void process(Page page) {
        page.putField("title",page.getHtml().xpath("//a[@class='ulink']").all().toString());
    }

    @Override
    public Site getSite() {
        return site;
    }
}複製程式碼

DetailPageProcesser.java 實現詳情頁影片下載地址獲取

package com.easy.webmagic.controller;

import us.codecraft.webmagic.Page;
import us.codecraft.webmagic.Site;
import us.codecraft.webmagic.processor.PageProcessor;

public class DetailPageProcesser implements PageProcessor {
    private Site site = Site.me().setDomain("127.0.0.1");

    @Override
    public void process(Page page) {
        page.putField("download",page.getHtml().xpath("//*[@id=\"Zoom\"]/span/table/tbody/tr/td/a").toString());
    }

    @Override
    public Site getSite() {
        return site;
    }
}
複製程式碼

使用Pipeline處理抓取結果

Pipeline負責抽取結果的處理,包括計算、持久化到檔案、資料庫等。WebMagic預設提供了“輸出到控制檯”和“儲存到檔案”兩種結果處理方案。

Pipeline定義了結果儲存的方式,如果你要儲存到指定資料庫,則需要編寫對應的Pipeline。對於一類需求一般只需編寫一個Pipeline。

這裡不做任何處理,直接把抓包到的結果在控制檯輸出

MyPipeline.java

package com.easy.webmagic.controller;

import lombok.extern.slf4j.Slf4j;
import us.codecraft.webmagic.ResultItems;
import us.codecraft.webmagic.Task;
import us.codecraft.webmagic.pipeline.Pipeline;

import java.util.Map;

@Slf4j
public class MyPipeline implements Pipeline {
    @Override
    public void process(ResultItems resultItems,Task task) {
        log.info("get page: " + resultItems.getRequest().getUrl());
        for (Map.Entry<String,Object> entry : resultItems.getAll().entrySet()) {
            log.info(entry.getKey() + ":\t" + entry.getValue());
        }
    }
}複製程式碼

啟動抓包入口

Main.java

package com.easy.webmagic.controller;

import us.codecraft.webmagic.Spider;

public class Main {
    public static void main(String[] args) {
        //獲取影片標題和頁面連結
        Spider.create(new ListPageProcesser()).addUrl("https://www.dytt8.net/html/gndy/dyzz/list_23_1.html")
                .addPipeline(new MyPipeline()).thread(1).run();

        //獲取指定詳情頁面的影片下載地址
        Spider.create(new DetailPageProcesser()).addUrl("https://www.dytt8.net/html/gndy/dyzz/20191204/59453.html")
                .addPipeline(new MyPipeline()).thread(1).run();
    }
}複製程式碼

執行示例

啟動執行Main.java,觀察控制檯

影片第一頁標題列表

14:06:28.704 [pool-1-thread-1] INFO com.easy.webmagic.controller.MyPipeline - get page: https://www.dytt8.net/html/gndy/dyzz/list_23_1.html
14:06:28.704 [pool-1-thread-1] INFO com.easy.webmagic.controller.MyPipeline - title:    [<a href="/html/gndy/dyzz/20191204/59453.html" class="ulink">2019年劇情《中國機長》HD國語中英雙字</a>,<a href="/html/gndy/dyzz/20191201/59437.html" class="ulink">2019年動畫喜劇《雪人奇緣》BD中英雙字幕</a>,<a href="/html/gndy/dyzz/20191201/59435.html" class="ulink">2019年喜劇《伯納黛特你去了哪》BD中英雙字幕</a>,<a href="/html/gndy/dyzz/20191129/59431.html" class="ulink">2019年高分劇情《愛爾蘭人/愛爾蘭殺手》BD中英雙字幕</a>,<a href="/html/gndy/dyzz/20191129/59429.html" class="ulink">2019年劇情《唐頓莊園電影版》BD中英雙字[修正字幕]</a>,<a href="/html/gndy/dyzz/20191129/59428.html" class="ulink">2018年懸疑動作《雪暴》BD國語中字</a>,<a href="/html/gndy/dyzz/20191128/59427.html" class="ulink">2019年劇情驚悚《官方機密》BD中英雙字幕</a>,<a href="/html/gndy/dyzz/20191127/59425.html" class="ulink">2019年高分劇情《少年的你》HD國語中字</a>,<a href="/html/gndy/dyzz/20191126/59424.html" class="ulink">2019年劇情冒險《攀登者》HD國語中英雙字</a>,<a href="/html/gndy/dyzz/20191126/59423.html" class="ulink">2019年劇情《金翅雀》BD中英雙字幕</a>,<a href="/html/gndy/dyzz/20191125/59422.html" class="ulink">2019年高分獲獎《好萊塢往事》BD中英雙字幕</a>,<a href="/html/gndy/dyzz/20191125/59421.html" class="ulink">2018年動畫冒險《貓與桃花源》BD國粵雙語中字</a>,<a href="/html/gndy/dyzz/20191124/59418.html" class="ulink">2019年恐怖《準備好了沒/弒婚遊戲》BD中英雙字幕</a>,<a href="/html/gndy/dyzz/20191124/59417.html" class="ulink">2019年劇情懸疑《雙魂》BD國粵雙語中字</a>,<a href="/html/gndy/dyzz/20191122/59409.html" class="ulink">2019年科幻動作《雙子殺手》HD中英雙字幕</a>,<a href="/html/gndy/dyzz/20191122/59408.html" class="ulink">2019年奇幻《天堂山/天堂山�f》BD中英雙字幕</a>,<a href="/html/gndy/dyzz/20191121/59407.html" class="ulink">2019年恐怖《小丑回魂2》BD中英雙字幕</a>,<a href="/html/gndy/dyzz/20191117/59403.html" class="ulink">2019年高分動畫《克勞斯:聖誕節的祕密》BD國英西三語雙字</a>,<a href="/html/gndy/dyzz/20191116/59400.html" class="ulink">2019年動作《天使陷落》BD中英雙字幕</a>,<a href="/html/gndy/dyzz/20191115/59399.html" class="ulink">2019年懸疑驚悚《犯罪現場》HD國粵雙語中字</a>,<a href="/html/gndy/dyzz/20191115/59398.html" class="ulink">2019年高分劇情《別告訴她》BD中英雙字幕</a>,<a href="/html/gndy/dyzz/20191114/59393.html" class="ulink">2019年動作《原始恐懼》BD中英雙字幕</a>,<a href="/html/gndy/dyzz/20191114/59392.html" class="ulink">2019年劇情《婚禮之後》BD中英雙字幕</a>,<a href="/html/gndy/dyzz/20191113/59387.html" class="ulink">2019年動作戰爭《危機:龍潭之戰》BD中英雙字幕</a>,<a href="/html/gndy/dyzz/20191113/59386.html" class="ulink">2019年犯罪動作《沉默的證人》BD國粵雙語中字</a>]複製程式碼

詳情頁影片下載地址

14:06:34.365 [pool-2-thread-1] INFO com.easy.webmagic.controller.MyPipeline - get page: https://www.dytt8.net/html/gndy/dyzz/20191204/59453.html
14:06:34.365 [pool-2-thread-1] INFO com.easy.webmagic.controller.MyPipeline - download:    <a href="ftp://ygdy8:[email protected]:4233/陽光電影www.ygdy8.com.中國機長.HD.1080p.國語中英雙字.mkv">ftp://ygdy8:[email protected]:4233/陽光電影www.ygdy8.com.中國機長.HD.1080p.國語中英雙字.mkv</a>複製程式碼

表示成功抓取到資料,然後做你想做的事情了。

爬蟲進階

使用Selectable抽取元素

Selectable相關的抽取元素鏈式API是WebMagic的一個核心功能。使用Selectable介面,你可以直接完成頁面元素的鏈式抽取,也無需去關心抽取的細節。

爬蟲的配置、啟動和終止

Spider是爬蟲啟動的入口。在啟動爬蟲之前,我們需要使用一個PageProcessor建立一個Spider物件,然後使用run()進行啟動。同時Spider的其他元件(Downloader、Scheduler、Pipeline)都可以通過set方法來進行設定。

Jsoup和Xsoup

WebMagic的抽取主要用到了Jsoup和我自己開發的工具Xsoup。

爬蟲的監控

利用這個功能,你可以檢視爬蟲的執行情況——已經下載了多少頁面、還有多少頁面、啟動了多少執行緒等資訊。該功能通過JMX實現,你可以使用Jconsole等JMX工具檢視本地或者遠端的爬蟲資訊。

配置代理

ProxyProvider有一個預設實現:SimpleProxyProvider。它是一個基於簡單Round-Robin的、沒有失敗檢查的ProxyProvider。可以配置任意個候選代理,每次會按順序挑選一個代理使用。它適合用在自己搭建的比較穩定的代理的場景。

處理非HTTP GET請求

採用在Request物件上新增Method和requestBody來實現。例如:

Request request = new Request("http://xxx/path");
request.setMethod(HttpConstant.Method.POST);
request.setRequestBody(HttpRequestBody.json("{'id':1}","utf-8"));複製程式碼

使用註解編寫爬蟲

WebMagic支援使用獨有的註解風格編寫一個爬蟲,引入webmagic-extension包即可使用此功能。

在註解模式下,使用一個簡單物件加上註解,可以用極少的程式碼量就完成一個爬蟲的編寫。對於簡單的爬蟲,這樣寫既簡單又容易理解,並且管理起來也很方便。

資料

Spring Boot、Cloud 學習專案