1 В избранное 0 Ответвления 0

OSCHINA-MIRROR/xtuhcy-gecco

Присоединиться к Gitlife
Откройте для себя и примите участие в публичных проектах с открытым исходным кодом с участием более 10 миллионов разработчиков. Приватные репозитории также полностью бесплатны :)
Присоединиться бесплатно
Клонировать/Скачать
README_CN.md 14 КБ
Копировать Редактировать Web IDE Исходные данные Просмотреть построчно История
Отправлено 16.03.2025 02:32 1db56ec

ci maven

Что такое Gecco

Gecco — это легковесный и удобный в использовании сетевой паук, созданный с использованием языка Java. Gecco объединяет такие отличные библиотеки, как jsoup, HttpClient, FastJSON, Spring, HtmlUnit, Redisson и другие. Вам потребуется только конфигурирование некоторых выборок в стиле jQuery, чтобы быстро создать паука. Фреймворк Gecco имеет отличную расширяемость; он основан на принципе открытости для расширения и закрытости для модификаций. В то же время Gecco использует очень открытую лицензию MIT, поэтому независимо от того, являетесь вы пользователем или разработчиком, желающим улучшить Gecco, приветствуем ваши pull requests. Если вам понравился этот паук, пожалуйста, добавьте звездочку или форк!

Руководство пользователя

Основные характеристики- [x] Легкость использования, с использованием выборок в стиле jQuery для извлечения элементов

  • Поддерживает динамическое конфигурирование и загрузку правил парсинга
  • Поддерживает асинхронные AJAX-запросы внутри страниц
  • Поддерживает извлечение JavaScript-переменных внутри страниц
  • Использует Redis для реализации распределённого парсинга, см. gecco-redis
  • Поддерживает интеграцию с Spring для разработки бизнес-логики, см. gecco-spring
  • Поддерживает расширение через HtmlUnit, см. gecco-htmlunit
  • Поддерживает механизм расширения плагинами
  • Поддерживает случайное выбор User-Agent при скачивании
  • Поддерживает случайное выбор прокси-сервера при скачивании## Обзор фреймворка

Структурная диаграмма

GeccoEngine

GeccoEngine является движком паука, каждый движок паука лучше всего работает в отдельном процессе. В распределённой среде парсинга рекомендуется запуск одного GeccoEngine на каждом сервере пауков (физическом или виртуальном). Движок паука состоит из пяти основных модулей: Scheduler, Downloader, Spider, SpiderBeanFactory и PipelineFactory.

Scheduler

Обычно паукам требуется роль эффективного управления адресами для скачивания. Scheduler отвечает за управление этими адресами. Для управления начальными адресами в gecco используется StartScheduler, который использует блокирующую FIFO-очередь внутри себя. Начальные адреса обычно порождают множество других адресов для парсинга, а эти новые адреса управляются с помощью SpiderScheduler, который использует неблокирующую FIFO-очередь с поддержкой многопоточности внутренне. Такое проектирование позволяет gecco использовать стратегию глубинной рекурсии для начальных адресов, то есть один поток завершает парсинг одного начального адреса перед тем как приступить к следующему; для адресов, порождённых начальными адресами, используется стратегия обхода в ширину.

Downloader> Downloader отвечает за получение запросов на скачивание из Scheduler с использованием по умолчанию httpclient4.x в качестве движка для загрузки. Реализация интерфейса Downloader позволяет создать свой собственный движок для загрузки. Для каждого запроса можно также определить BeforeDownload и AfterDownload, чтобы удовлетворять различные требования к загрузке.### FactorySpiderBean

Gecco преобразует скачанный контент в объект типа SpiderBean; все JavaBeans, используемые в процессе парсинга, наследуются от SpiderBean. SpiderBean разделены на HtmlBean и JsonBean для представления рендера HTML страниц и JSON данных соответственно. SpiderBeanFactory выбирает соответствующий SpiderBean на основе URL-запроса и создает контекст SpiderBeanContext. Контекст SpiderBeanContext содержит информацию о том, какой рендер используется, какая загрузка применяется, какие пайплайны используются после рендера и так далее.

FactoryPipeline

Пайплайн представляет собой единицу последующего бизнес-обработки после рендера SpiderBean. FactoryPipeline является фабрикой для создания экземпляров пайплайнов. Расширение FactoryPipeline позволяет интеграцию с фреймворками бизнес-логики, такими как Spring.

Паук

Самый центральный класс в Gecco — это поток Паук. Один движок пауков может запустить несколько потоков Паук одновременно. Паук описывает основной скелет работы этого фреймворка: он получает запросы из Scheduler, затем использует SpiderBeanFactory для выбора соответствующего SpiderBeanClass, а затем находит контекст SpiderBean через этот класс. После того, как страница скачана, она рендерится в объект типа SpiderBean, который затем передается пайплайну для дальнейшей обработки.

Установка

Установка через Maven

<dependency>
    <groupId>com.geccocrawler</groupId>
    <artifactId>gecco</artifactId>
    <version>x.x.x</version>
</dependency>
```![maven](https://img.shields.io/maven-central/v/com.geccocrawler/gecco.svg?style=flat-square)

### Внешние зависимости

httpclient, jsoup, fastjson, reflections, cglib, rhino, log4j, jmxutils, commons-lang3

## Быстрое начало

```java
@Gecco(matchUrl="https://github.com/{user}/{project}", pipelines="consolePipeline")
public class MyGithub implements HtmlBean {

    private static final long serialVersionUID = -7127412585200687225L;

    @RequestParameter("user")
    private String user; // значение {user} из URL

    @RequestParameter("project")
    private String project; // значение {project} из URL
    @Text
    @HtmlField(cssPath=".pagehead-actions li:nth-child(2) .social-count")
    private String star; // извлечение количества звезд со страницы

    @Text
    @HtmlField(cssPath=".pagehead-actions li:nth-child(3) .social-count")
    private String fork; // извлечение количества форков со страницы

    @Html
    @HtmlField(cssPath=".entry-content")
    private String readme; // извлечение файла README со страницы

    public String getReadme() {
        return readme;
    }

    public void setReadme(String readme) {
        this.readme = readme;
    }

    public String getUser() {
        return user;
    }

    public void setUser(String user) {
        this.user = user;
    }

    public String getProject() {
        return project;
    }

    public void setProject(String project) {
        this.project = project;
    }

    public String getStar() {
        return star;
    }

    public void setStar(String star) {
        this.star = star;
    }

    public String getFork() {
        return fork;
    }

    public void setFork(String fork) {
        this.fork = fork;
    }
```    public static void main(String[] args) {
        GeccoEngine.create()
        // путь к пакету программы
        .classpath("com.geccocrawler.gecco.demo")
        // адрес стартовой страницы для парсинга
        .start("https://github.com/xtuhcy/gecco")
        // количество потоков для парсинга
        .threads(1)
        // время задержки между запросами в миллисекундах
        .interval(2000)
        // циклический режим работы
        .loop(true)
        // использование User-Agent для браузера PC
        .pc(true)
        // запуск в неблокирующем режиме
        .start();
    }
}## DynamicGecco

Цель DynamicGecco — это реализация правил парсинга в режиме выполнения без необходимости определения объекта SpiderBean. Это достигается с помощью программирования байт-кодом для динамического создания объекта SpiderBean и использования пользовательского классификатора GeccoClassLoader для горячей замены правил парсинга. Ниже приведен пример простого демонстрационного приложения, более сложные примеры можно найти в папке `com.geccocrawler.gecco.demo.dynamic`.

Ниже представлен код, который позволяет конфигурировать правила парсинга в режиме выполнения:

```java
DynamicGecco.html()
    .gecco("https://github.com/{user}/{project}", "consolePipeline")
    .requestField("request").request().build()
    .stringField("user").requestParameter("user").build()
    .stringField("project").requestParameter().build()
    .stringField("star").csspath(".pagehead-actions li:nth-child(2) .social-count").text(false).build()
    .stringField("fork").csspath(".pagehead-actions li:nth-child(3) .social-count").text().build()
    .stringField("contributors").csspath("ul.numbers-summary > li:nth-child(4) > a").href().build()
    .register();
```

Для начала парсинга используется следующий код:

```java
// Начало парсинга
GeccoEngine.create()
    .classpath("com.geccocrawler.gecco.demo")
    .start("https://github.com/xtuhcy/gecco")
    .run();
```

Как можно заметить, подход с использованием DynamicGecco значительно уменьшает объём кода по сравнению с традиционным способом использования аннотаций, а также позволяет в реальном времени определять и изменять правила.

## Полное руководство

[Учебник по использованию Java-пауков Gecco для получения всей информации о товарах JD (часть 1)](http://my.oschina.net/u/2336761/blog/620158)[Руководство по использованию Java-пауков Gecco для получения всей информации о товарах JD (часть 2)](http://my.oschina.net/u/2336761/blog/620827)

[Руководство по использованию Java-пауков Gecco для получения всей информации о товарах JD (часть 3)](http://my.oschina.net/u/2336761/blog/624683)

[Интеграция Htmlunit для загрузки страниц](http://my.oschina.net/u/2336761/blog/631959)

[Мониторинг пауков](http://my.oschina.net/u/2336761/blog/644330)

[Пример полной реализации, работающий с пагинацией, использует Spring и MySQL для записи данных](http://git.oschina.net/xiaomaoguai/gecco-demo)

## Контактная информация

- Блог: http://my.oschina.net/u/2336761/blog
- Электронная почта: xtuhcy@163.com
- Группа QQ: cq 531949844

## Поддержка проекта

Gecco развивается благодаря вашей поддержке. Сканируйте QR-код и помогите автору выпить кофе!

![АлиПай](http://www.geccocrawler.com/content/images/jz-zfb.jpg?xx=2)
![WeChat Pay](http://www.geccocrawler.com/content/images/jz-wx.png)

## Лицензионное соглашение

Пожалуйста, следуйте условиям лицензии [MIT](https://raw.githubusercontent.com/xtuhcy/gecco/master/LICENSE)

Опубликовать ( 0 )

Вы можете оставить комментарий после Вход в систему

1
https://api.gitlife.ru/oschina-mirror/xtuhcy-gecco.git
git@api.gitlife.ru:oschina-mirror/xtuhcy-gecco.git
oschina-mirror
xtuhcy-gecco
xtuhcy-gecco
master