В этом примере реализован захват последнего списка имен источников фильмов и адрес загрузки страницы сведений веб-сайта фильмов.
webmagic — это фреймворк вертикального сканера Java с открытым исходным кодом, цель которого — упростить процесс разработки сканера и позволить разработчикам сосредоточиться на разработке логических функций.
Возможности вебмагии:
- Полностью модульная конструкция, мощная масштабируемость.
- Ядро простое, но охватывает весь процесс сканирования, гибкое и мощное, а также является хорошим материалом для изучения того, как начать сканирование.
- Предоставляет богатый API для извлечения страниц.
- Без настройки, но можно реализовать краулер в виде аннотаций POJO+.
- Поддерживается многопоточность.
- Распределенная поддержка.
- Поддерживает сканирование динамически отображаемых страниц js.
- Нет зависимостей от фреймворка, можно гибко встроить в проект.
Пример
Эта примерная реализация: https://www.dytt8.net/html/gndy/dyzz/list231.html Фиксируются последнее исходное название веб-сайта фильма и содержимое ссылки на скачивание видео на странице сведений.
Настройка зависимостей Maven
Конфигурация pom.xml, поскольку файл журнала конфликтует с весенней загрузкой, поэтому удалите зависимость журнала 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 и на его основе разработал Xsoup, инструмент для анализа XPath.
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
Конвейер отвечает за обработку результатов извлечения, включая вычисления, сохранение в файлы, базы данных и т. д. По умолчанию 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:ygdy8@yg45.dydytt.net:4233/阳光电影www.ygdy8.com.中国机长.HD.1080p.国语中英双字.mkv">ftp://ygdy8:ygdy8@yg45.dydytt.net:4233/阳光电影www.ygdy8.com.中国机长.HD.1080p.国语中英双字.mkv</a>
Указывает, что данные успешно захвачены, а затем делаете то, что хотите.
Продвинутая рептилия
Извлечение элементов с помощью Selectable
API цепочки элементов извлечения, связанных с возможностью выбора, является основной функцией WebMagic. Используя интерфейс Selectable, вы можете напрямую выполнить извлечение цепочки элементов страницы, не беспокоясь о деталях извлечения.
Конфигурация сканера, запуск и завершение
Паук — это точка входа для запуска сканера. Перед запуском сканера нам нужно использовать PageProcessor для создания объекта Spider, а затем использовать run() для его запуска. В то же время другие компоненты Spider (Downloader, Scheduler, Pipeline) можно настроить через метод set.
Jsoup и Xsoup
Для извлечения WebMagic в основном используется Jsoup и инструмент Xsoup, разработанный мной.
Мониторинг краулеров
С помощью этой функции вы можете видеть, как работает сканер — сколько страниц было загружено, сколько страниц осталось, сколько потоков запущено и т. д. Эта функция реализована через JMX.Вы можете использовать инструменты JMX, такие как Jconsole, для просмотра информации о локальном или удаленном искателе.
Настроить прокси
ProxyProvider имеет реализацию по умолчанию: SimpleProxyProvider. Это простой прокси-провайдер на основе циклического перебора без проверки ошибок. Можно настроить любое количество агентов-кандидатов, и каждый раз для последовательного использования будет выбираться один агент. Он подходит для использования в сценарии относительно стабильного прокси, построенного самостоятельно.
Обработка GET-запросов, отличных от HTTP
Это реализуется путем добавления Method и requestBody к объекту Request. Например:
Request request = new Request("http://xxx/path");
request.setMethod(HttpConstant.Method.POST);
request.setRequestBody(HttpRequestBody.json("{'id':1}","utf-8"));
Пишите сканеры с аннотациями
WebMagic поддерживает написание сканера с уникальным стилем аннотаций, который можно использовать, установив пакет webmagic-extension.
В режиме аннотаций сканер можно написать с очень небольшим объемом кода, используя простой объект и аннотации. Для простых сканеров это просто, легко понять и легко управлять.