Gecco — это легковесный и удобный в использовании сетевой паук, созданный с использованием языка Java. Gecco объединяет такие отличные библиотеки, как jsoup, HttpClient, FastJSON, Spring, HtmlUnit, Redisson и другие. Вам потребуется только конфигурирование некоторых выборок в стиле jQuery, чтобы быстро создать паука. Фреймворк Gecco имеет отличную расширяемость; он основан на принципе открытости для расширения и закрытости для модификаций. В то же время Gecco использует очень открытую лицензию MIT, поэтому независимо от того, являетесь вы пользователем или разработчиком, желающим улучшить Gecco, приветствуем ваши pull requests. Если вам понравился этот паук, пожалуйста, добавьте звездочку или форк!
GeccoEngine является движком паука, каждый движок паука лучше всего работает в отдельном процессе. В распределённой среде парсинга рекомендуется запуск одного GeccoEngine на каждом сервере пауков (физическом или виртуальном). Движок паука состоит из пяти основных модулей: Scheduler, Downloader, Spider, SpiderBeanFactory и PipelineFactory.
Обычно паукам требуется роль эффективного управления адресами для скачивания. Scheduler отвечает за управление этими адресами. Для управления начальными адресами в gecco используется StartScheduler, который использует блокирующую FIFO-очередь внутри себя. Начальные адреса обычно порождают множество других адресов для парсинга, а эти новые адреса управляются с помощью SpiderScheduler, который использует неблокирующую FIFO-очередь с поддержкой многопоточности внутренне. Такое проектирование позволяет gecco использовать стратегию глубинной рекурсии для начальных адресов, то есть один поток завершает парсинг одного начального адреса перед тем как приступить к следующему; для адресов, порождённых начальными адресами, используется стратегия обхода в ширину.
Gecco преобразует скачанный контент в объект типа SpiderBean; все JavaBeans, используемые в процессе парсинга, наследуются от SpiderBean. SpiderBean разделены на HtmlBean и JsonBean для представления рендера HTML страниц и JSON данных соответственно. SpiderBeanFactory выбирает соответствующий SpiderBean на основе URL-запроса и создает контекст SpiderBeanContext. Контекст SpiderBeanContext содержит информацию о том, какой рендер используется, какая загрузка применяется, какие пайплайны используются после рендера и так далее.
Пайплайн представляет собой единицу последующего бизнес-обработки после рендера SpiderBean. FactoryPipeline является фабрикой для создания экземпляров пайплайнов. Расширение FactoryPipeline позволяет интеграцию с фреймворками бизнес-логики, такими как Spring.
Самый центральный класс в Gecco — это поток Паук. Один движок пауков может запустить несколько потоков Паук одновременно. Паук описывает основной скелет работы этого фреймворка: он получает запросы из Scheduler, затем использует SpiderBeanFactory для выбора соответствующего SpiderBeanClass, а затем находит контекст SpiderBean через этот класс. После того, как страница скачана, она рендерится в объект типа SpiderBean, который затем передается пайплайну для дальнейшей обработки.
<dependency>
<groupId>com.geccocrawler</groupId>
<artifactId>gecco</artifactId>
<version>x.x.x</version>
</dependency>
```
### Внешние зависимости
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-код и помогите автору выпить кофе!


## Лицензионное соглашение
Пожалуйста, следуйте условиям лицензии [MIT](https://raw.githubusercontent.com/xtuhcy/gecco/master/LICENSE)
Вы можете оставить комментарий после Вход в систему
Неприемлемый контент может быть отображен здесь и не будет показан на странице. Вы можете проверить и изменить его с помощью соответствующей функции редактирования.
Если вы подтверждаете, что содержание не содержит непристойной лексики/перенаправления на рекламу/насилия/вульгарной порнографии/нарушений/пиратства/ложного/незначительного или незаконного контента, связанного с национальными законами и предписаниями, вы можете нажать «Отправить» для подачи апелляции, и мы обработаем ее как можно скорее.
Опубликовать ( 0 )