WebMagic 實(shí)現(xiàn)爬蟲入門教程

本示例實(shí)現(xiàn)某電影網(wǎng)站最新片源名稱列表及詳情頁(yè)下載地址的抓取。

webmagic是一個(gè)開(kāi)源的Java垂直爬蟲框架,目標(biāo)是簡(jiǎn)化爬蟲的開(kāi)發(fā)流程,讓開(kāi)發(fā)者專注于邏輯功能的開(kāi)發(fā)。

WebMagic 特點(diǎn):

  • 完全模塊化的設(shè)計(jì),強(qiáng)大的可擴(kuò)展性。

  • 核心簡(jiǎn)單但是涵蓋爬蟲的全部流程,靈活而強(qiáng)大,也是學(xué)習(xí)爬蟲入門的好材料。

  • 提供豐富的抽取頁(yè)面API。

  • 無(wú)配置,但是可通過(guò)POJO+注解形式實(shí)現(xiàn)一個(gè)爬蟲。

  • 支持多線程。

  • 支持分布式。

  • 支持爬取js動(dòng)態(tài)渲染的頁(yè)面。

  • 無(wú)框架依賴,可以靈活的嵌入到項(xiàng)目中去。

示例

本示例實(shí)現(xiàn):https://www.dytt8.net/html/gndy/dyzz/list_23_1.html 電影網(wǎng)站最新片源名稱及詳情頁(yè)影片下載鏈接內(nèi)容的抓取。

配置Maven依賴

pom.xml配置,這里因?yàn)槿罩疚募蛃pring 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>

創(chuàng)建列表及詳情頁(yè)解析類

PageProcessor負(fù)責(zé)解析頁(yè)面,抽取有用信息,以及發(fā)現(xiàn)新的鏈接。WebMagic使用Jsoup作為HTML解析工具,并基于其開(kāi)發(fā)了解析XPath的工具Xsoup。

ListPageProcesser.java 實(shí)現(xiàn)影片名稱列表獲取

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("http://a[@class='ulink']").all().toString());
    }

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

DetailPageProcesser.java 實(shí)現(xiàn)詳情頁(yè)影片下載地址獲取

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("http://*[@id=\"Zoom\"]/span/table/tbody/tr/td/a").toString());
    }

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

使用Pipeline處理抓取結(jié)果

Pipeline負(fù)責(zé)抽取結(jié)果的處理,包括計(jì)算、持久化到文件、數(shù)據(jù)庫(kù)等。WebMagic默認(rèn)提供了“輸出到控制臺(tái)”和“保存到文件”兩種結(jié)果處理方案。

Pipeline定義了結(jié)果保存的方式,如果你要保存到指定數(shù)據(jù)庫(kù),則需要編寫對(duì)應(yīng)的Pipeline。對(duì)于一類需求一般只需編寫一個(gè)Pipeline。

這里不做任何處理,直接把抓包到的結(jié)果在控制臺(tái)輸出

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());
        }
    }
}

啟動(dòng)抓包入口

Main.java

package com.easy.webmagic.controller;

import us.codecraft.webmagic.Spider;

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

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

運(yùn)行示例

啟動(dòng)運(yùn)行Main.java,觀察控制臺(tái)

影片第一頁(yè)標(biāo)題列表

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年劇情《中國(guó)機(jī)長(zhǎng)》HD國(guó)語(yǔ)中英雙字</a>, <a href="/html/gndy/dyzz/20191201/59437.html" class="ulink">2019年動(dòng)畫喜劇《雪人奇緣》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年高分劇情《愛(ài)爾蘭人/愛(ài)爾蘭殺手》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年懸疑動(dòng)作《雪暴》BD國(guó)語(yǔ)中字</a>, <a href="/html/gndy/dyzz/20191128/59427.html" class="ulink">2019年劇情驚悚《官方機(jī)密》BD中英雙字幕</a>, <a href="/html/gndy/dyzz/20191127/59425.html" class="ulink">2019年高分劇情《少年的你》HD國(guó)語(yǔ)中字</a>, <a href="/html/gndy/dyzz/20191126/59424.html" class="ulink">2019年劇情冒險(xiǎn)《攀登者》HD國(guó)語(yǔ)中英雙字</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年高分獲獎(jiǎng)《好萊塢往事》BD中英雙字幕</a>, <a href="/html/gndy/dyzz/20191125/59421.html" class="ulink">2018年動(dòng)畫冒險(xiǎn)《貓與桃花源》BD國(guó)粵雙語(yǔ)中字</a>, <a href="/html/gndy/dyzz/20191124/59418.html" class="ulink">2019年恐怖《準(zhǔn)備好了沒(méi)/弒婚游戲》BD中英雙字幕</a>, <a href="/html/gndy/dyzz/20191124/59417.html" class="ulink">2019年劇情懸疑《雙魂》BD國(guó)粵雙語(yǔ)中字</a>, <a href="/html/gndy/dyzz/20191122/59409.html" class="ulink">2019年科幻動(dòng)作《雙子殺手》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年高分動(dòng)畫《克勞斯:圣誕節(jié)的秘密》BD國(guó)英西三語(yǔ)雙字</a>, <a href="/html/gndy/dyzz/20191116/59400.html" class="ulink">2019年動(dòng)作《天使陷落》BD中英雙字幕</a>, <a href="/html/gndy/dyzz/20191115/59399.html" class="ulink">2019年懸疑驚悚《犯罪現(xiàn)場(chǎng)》HD國(guó)粵雙語(yǔ)中字</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年動(dòng)作《原始恐懼》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年動(dòng)作戰(zhàn)爭(zhēng)《危機(jī):龍?zhí)吨畱?zhàn)》BD中英雙字幕</a>, <a href="/html/gndy/dyzz/20191113/59386.html" class="ulink">2019年犯罪動(dòng)作《沉默的證人》BD國(guó)粵雙語(yǔ)中字</a>]

詳情頁(yè)影片下載地址

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:ygdy8@yg45.dydytt.net:4233/陽(yáng)光電影www.ygdy8.com.中國(guó)機(jī)長(zhǎng).HD.1080p.國(guó)語(yǔ)中英雙字.mkv">ftp://ygdy8:ygdy8@yg45.dydytt.net:4233/陽(yáng)光電影www.ygdy8.com.中國(guó)機(jī)長(zhǎng).HD.1080p.國(guó)語(yǔ)中英雙字.mkv</a>

表示成功抓取到數(shù)據(jù),然后做你想做的事情了。

爬蟲進(jìn)階

使用Selectable抽取元素

Selectable相關(guān)的抽取元素鏈?zhǔn)紸PI是WebMagic的一個(gè)核心功能。使用Selectable接口,你可以直接完成頁(yè)面元素的鏈?zhǔn)匠槿。矡o(wú)需去關(guān)心抽取的細(xì)節(jié)。

爬蟲的配置、啟動(dòng)和終止

Spider是爬蟲啟動(dòng)的入口。在啟動(dòng)爬蟲之前,我們需要使用一個(gè)PageProcessor創(chuàng)建一個(gè)Spider對(duì)象,然后使用run()進(jìn)行啟動(dòng)。同時(shí)Spider的其他組件(Downloader、Scheduler、Pipeline)都可以通過(guò)set方法來(lái)進(jìn)行設(shè)置。

Jsoup和Xsoup

WebMagic的抽取主要用到了Jsoup和我自己開(kāi)發(fā)的工具Xsoup。

爬蟲的監(jiān)控

利用這個(gè)功能,你可以查看爬蟲的執(zhí)行情況——已經(jīng)下載了多少頁(yè)面、還有多少頁(yè)面、啟動(dòng)了多少線程等信息。該功能通過(guò)JMX實(shí)現(xiàn),你可以使用Jconsole等JMX工具查看本地或者遠(yuǎn)程的爬蟲信息。

配置代理

ProxyProvider有一個(gè)默認(rèn)實(shí)現(xiàn):SimpleProxyProvider。它是一個(gè)基于簡(jiǎn)單Round-Robin的、沒(méi)有失敗檢查的ProxyProvider??梢耘渲萌我鈧€(gè)候選代理,每次會(huì)按順序挑選一個(gè)代理使用。它適合用在自己搭建的比較穩(wěn)定的代理的場(chǎng)景。

處理非HTTP GET請(qǐng)求

采用在Request對(duì)象上添加Method和requestBody來(lái)實(shí)現(xiàn)。例如:

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

使用注解編寫爬蟲

WebMagic支持使用獨(dú)有的注解風(fēng)格編寫一個(gè)爬蟲,引入webmagic-extension包即可使用此功能。

在注解模式下,使用一個(gè)簡(jiǎn)單對(duì)象加上注解,可以用極少的代碼量就完成一個(gè)爬蟲的編寫。對(duì)于簡(jiǎn)單的爬蟲,這樣寫既簡(jiǎn)單又容易理解,并且管理起來(lái)也很方便。

資料

Spring Boot、Cloud 學(xué)習(xí)項(xiàng)目

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • WebMagic指北 一、快速開(kāi)始 WebMagic主要包含兩個(gè)jar包:webmagic-core-{versi...
    thorhill閱讀 1,996評(píng)論 0 7
  • 一、Gecco是什么 Gecco是一款用java語(yǔ)言開(kāi)發(fā)的輕量化的易用的網(wǎng)絡(luò)爬蟲,不同于Nutch這樣的面向搜索引...
    4ea0af17fd67閱讀 2,142評(píng)論 0 1
  • 基礎(chǔ)知識(shí) 工欲善其事,必先利其器,要編寫爬蟲程序,首先必須找一個(gè)爬蟲框架,如果你使用Python語(yǔ)言,可以選用sc...
    空山雪林閱讀 1,863評(píng)論 0 2
  • 一、WebMagic簡(jiǎn)介 ??webmagic是一個(gè)開(kāi)源的Java垂直爬蟲框架,目標(biāo)是簡(jiǎn)化爬蟲的開(kāi)發(fā)流程,讓開(kāi)發(fā)者...
    無(wú)劍_君閱讀 2,267評(píng)論 0 2
  • 整理了Node.js、PHP、Go、JAVA、Ruby、Python等語(yǔ)言的爬蟲框架。不知道讀者們都用過(guò)什么爬蟲框...
    SeanCheney閱讀 5,807評(píng)論 0 16

友情鏈接更多精彩內(nèi)容