#---------------------------------------------------------------------------------
1. Изучение исходного кода crawler4j (1): сбор данных с новостей сайта Sohu 2. Изучение исходного кода crawler4j (2): сбор данных о квартирах с сайта Ziroom #---------------------------------------------------------------------------------
crawler4j — это открытое исходное программное обеспечение для создания веб-краблеров на Java, которое предоставляет простой интерфейс для извлечения информации с веб-ресурсов. Используя его, вы можете создать многопоточный веб-краблер всего за несколько минут.
Чтобы использовать последнюю версию crawler4j, используйте следующий фрагмент в вашем файле pom.xml
:
<dependency>
<groupId>edu.uci.ics</groupId>
<artifactId>crawler4j</artifactId>
<version>4.2</version>
</dependency>
JAR-файлы crawler4j доступны на странице релизов и на странице Maven Central.Если вы используете crawler4j без Maven, обратите внимание, что JAR-файл crawler4j имеет несколько внешних зависимостей. На странице релизов можно найти файл с названием crawler4j-X.Y-with-dependencies.jar
, который включает в себя crawler4j со всеми его зависимостями как единое целое. Вы можете скачать этот файл и добавить его в свой CLASSPATH, чтобы обеспечить наличие всех необходимых зависимостей.## Быстрый старт
Вы должны создать класс краблера, расширяющий WebCrawler
. Этот класс решает, какие URL следует извлекать, а также обрабатывает скачанные страницы. Ниже приведён пример реализации:
public class MyCrawler extends WebCrawler {
private final static Pattern FILTERS = Pattern.compile(". *(\\.(css|js|gif|jpg"
+ "|png|mp3|zip|gz))$");
/**
* Этот метод получает два параметра.
*/
Первый параметр — это страница, в которой мы обнаружили этот новый URL, а второй параметр — сам новый URL. Вы должны реализовать эту функцию для указания того, следует ли выполнять данный URL (основываясь на вашей логике парсинга). В этом примере мы указываем парсеру игнорировать URL-ы, имеющие расширения типа CSS, JS, GIF и т. д., и принимать только те URL-ы, которые начинаются с "http://www.ics.uci.edu/". В данном случае нам не требовался параметр referringPage для принятия решения.
@Override
public boolean shouldVisit(Page referringPage, WebURL url) {
String href = url.getURL().toLowerCase();
return !FILTERS.matcher(href).matches()
&& href.startsWith("http://www.ics.uci.edu/");
}
/**
* Эта функция вызывается после того, как содержимое URL было успешно загружено.
* Вы можете легко получить URL, текст, ссылки, HTML и уникальный ID загруженной страницы.
*/
@Override
public void visit(Page page) {
String url = page.getWebURL().getURL();
System.out.println("URL: " + url);
if (page.getParseData() instanceof HtmlParseData) {
HtmlParseData htmlParseData = (HtmlParseData) page.getParseData();
String text = htmlParseData.getText();
String html = htmlParseData.getHtml();
Set<WebURL> links = htmlParseData.getOutgoingUrls();
Вы должны создать класс краблера, расширяющий WebCrawler
. Этот класс решает, какие URL следует извлекать, а также обрабатывает скачанные страницы. Ниже приведён пример реализации:
public class MyCrawler extends WebCrawler {
private final static Pattern FILTERS = Pattern.compile(". *(\\.(css|js|gif|jpg|png|mp3|zip|gz))$");
/**
* Этот метод получает два параметра.
*
* Первый параметр — это страница, в которой мы обнаружили этот новый URL, а второй параметр — сам новый URL.
* Вы должны реализовать эту функцию для указания того, следует ли выполнять данный URL (основываясь на вашей логике парсинга).
* В этом примере мы указываем парсеру игнорировать URL-ы, имеющие расширения типа CSS, JS, GIF и т. д.,
* и принимать только те URL-ы, которые начинаются с "http://www.ics.uci.edu/".
* В данном случае нам не требовался параметр referringPage для принятия решения.
*/
@Override
public boolean shouldVisit(Page referringPage, WebURL url) {
String href = url.getURL().toLowerCase();
return !FILTERS.matcher(href).matches()
&& href.startsWith("http://www.ics.uci.edu/");
}
/**
* Эта функция вызывается после того, как содержимое URL было успешно загружено.
* Вы можете легко получить URL, текст, ссылки, HTML и уникальный ID загруженной страницы.
*/
@Override
public void visit(Page page) {
String url = page.getWebURL().getURL();
System.out.println("URL: " + url);
if (page.getParseData() instanceof HtmlParseData) {
HtmlParseData htmlParseData = (HtmlParseData) page.getParseData();
String text = htmlParseData.getText();
String html = htmlParseData.getHtml();
Set<WebURL> links = htmlParseData.getOutgoingUrls();
}
}
}
``` System.out.println("Длина текста: " + text.length());
System.out.println("Длина HTML: " + html.length());
System.out.println("Количество исходящих ссылок: " + links.size());
}
}```
Как можно видеть в приведённом выше коде, есть две основные функции, которые следует переопределить:
- `shouldVisit`: Эта функция решает, следует ли выполнять данный URL. В приведённом выше примере эта функция запрещает скачивание файлов с расширениями `.css`, `.js` и других типов медиафайлов, и позволяет только страницы внутри домена `'www.ics.uci.edu'`.
- `visit`: Эта функция вызывается после успешной загрузки содержимого URL. Вы можете легко получить URL, текст, ссылки, HTML и уникальный ID загруженной страницы. Также вам следует реализовать контроллерный класс, который будет указывать семена парсинга, папку для хранения промежуточных данных парсинга и количество одновременно выполняющихся потоков:
```java
public class Controller {
public static void main(String[] args) throws Exception {
String crawlStorageFolder = "/data/crawl/root";
int numberOfCrawlers = 7;
CrawlConfig config = new CrawlConfig();
config.setCrawlStorageFolder(crawlStorageFolder);
/*
* Создаём контроллер для этого ползунка.
*/
PageFetcher pageFetcher = new PageFetcher(config);
RobotstxtConfig robotstxtConfig = new RobotstxtConfig();
RobotstxtServer robotstxtServer = new RobotstxtServer(robotstxtConfig, pageFetcher);
CrawlController controller = new CrawlController(config, pageFetcher, robotstxtServer);
/*
* Для каждого ползунка вам нужно добавить некоторые начальные URL-адреса. Это первые
* URL-адреса, которые будут получены, а затем ползунок начинает следовать за ссылками,
* найденными в этих страницах.
*/
controller.addSeed("http://www.ics.uci.edu");
``````markdown
edu/~lopes/");
controller.addSeed("http://www.ics.uci.edu/~welling/");
controller.addSeed("http://www.ics.uci.edu/");
/*
* Начинаем ползание. Это блокирующая операция, то есть ваш код
* достигнет строки после этой только когда ползание будет завершено.
*/
controller.start(MyCrawler.class, numberOfCrawlers);
}
}
## Подробности конфигураций
Класс контроллера имеет обязательный параметр типа [CrawlConfig](https://github.com/yasserg/crawler4j/blob/master/src/main/java/edu/uci/ics/crawler4j/crawler/CrawlConfig.java).
Экземпляры этого класса могут использоваться для настройки crawler4j. В следующих разделах описаны некоторые детали конфигураций.
### Глубина сбора данных
По умолчанию нет ограничений на глубину сбора данных. Однако вы можете установить ограничение на глубину сбора данных. Например, предположим, что у вас есть страница-источник "A", которая ссылается на "B", которая ссылается на "C", которая ссылается на "D". Таким образом, у нас имеется следующая структура ссылок:
A -> B -> C -> D
Поскольку "A" является страницей-источником, она будет иметь глубину 0. "B" будет иметь глубину 1 и так далее. Вы можете установить ограничение на глубину страниц, которые собирает crawler4j. Например, если вы установите это ограничение на 2, он не будет собирать страницу "D". Чтобы установить максимальную глубину, вы можете использовать:
```java
crawlConfig.setMaxDepthOfCrawling(maxDepthOfCrawling);
Хотя по умолчанию нет ограничений на количество страниц для сбора данных, вы можете установить такое ограничение:
crawlConfig.setMaxPagesToFetch(maxPagesToFetch);
``````java
setMaxPagesToFetch(maxPagesToFetch);
crawler4j спроектирован очень эффективно и способен быстро собирать данные с доменов (например, он смог собирать 200 страниц Википедии в секунду). Однако, поскольку это противоречит политикам сбора данных и создает огромную нагрузку на серверы (и они могут заблокировать вас!), начиная с версии 1.3, по умолчанию crawler4j ждет минимум 200 миллисекунд между запросами. Однако этот параметр можно настроить:
crawlConfig.setPolitenessDelay(politenessDelay);
Нужно ли запускать ваш сборщик данных через прокси? Если да, вы можете использовать:
crawlConfig.setProxyHost("proxyserver.example.com");
crawlConfig.setProxyPort(8080);
Если ваш прокси также требует аутентификацию:
crawlConfig.setProxyUsername(username);
crawlConfig.setProxyPassword(password);
Иногда вам нужно запустить сборщик данных на длительное время. Возможно, сборщик данных будет завершен непреднамеренно. В таких случаях может потребоваться возобновление парсинга. Вы сможете возобновить ранее остановленный/сломанный парсинг с помощью следующих настроек:
crawlConfig.setResumableCrawling(true);
Однако следует отметить, что это может сделать парсинг немного медленнее.
Строка агента пользователя используется для представления вашего парсера веб-серверам. Подробнее см. здесь. По умолчанию crawler4j использует следующую строку агента пользователя:
"crawler4j (https://github.com/yasserg/crawler4j/)"
Однако вы можете переопределить её:
crawlConfig.setUserAgentString(userAgentString);
Авторское право © 2010-2015 Yasser Ganjisaffar Размещено под лицензией Apache License 2.0, см. LICENSE
Вы можете оставить комментарий после Вход в систему
Неприемлемый контент может быть отображен здесь и не будет показан на странице. Вы можете проверить и изменить его с помощью соответствующей функции редактирования.
Если вы подтверждаете, что содержание не содержит непристойной лексики/перенаправления на рекламу/насилия/вульгарной порнографии/нарушений/пиратства/ложного/незначительного или незаконного контента, связанного с национальными законами и предписаниями, вы можете нажать «Отправить» для подачи апелляции, и мы обработаем ее как можно скорее.
Опубликовать ( 0 )