WebFetch
Беззависимый минималистичный сетевой паук-компонент, способный работать на мобильных устройствах.
Цели WebFetch:
- отсутствие сторонних зависимостей jar-пакетов;
- сокращение использования памяти;
- повышение коэффициента использования процессора;
- ускорение скорости сетевого сканирования;
- понятный и простой API-интерфейс;
- стабильная работа на устройствах Android;
- небольшой, гибкий и удобный для интеграции компонент для сбора веб-страниц.
Использование документа
WebFetch прост в использовании, что позволяет начинающим пользователям быстро приступить к работе. WebFetch предоставляет пользователю конфигурацию метода обработки по умолчанию, который по умолчанию использует System.out.print для вывода информации о странице на консоль (можно изменить поведение по умолчанию с помощью настройки PageHandler).
Код запуска:
WebFetch webFetch = new WebFetch();
webFetch.addBeginTask("https://github.com").start();
Остановочный код:
После выполнения метода start() WebFetch не блокирует выполнение программы, можно добавить несколько адресов веб-сайтов, в настоящее время поддерживаются протоколы http и https, требуется как минимум один начальный адрес.
Примечание: текущая версия (webfetch_v0.0.1) стабильно работает в среде Java для настольных компьютеров.
Расширенные настройки WebFetch
WebFetch предлагает множество полезных настроек интерфейса, которые можно использовать в цепочке вызовов. Ниже приведены наиболее часто используемые методы и их описание.
- addBeginTask(String url): метод ввода задачи сканирования веб-страницы, можно вызывать несколько раз для добавления начального адреса, передавая различные параметры, такие как настройка Cookie и кодировка страницы, или напрямую передавать объект Request (Request содержит всю информацию о запросе, которую можно настроить с помощью set).
Пример: самый простой способ вызова — это прямая передача URL.
//最简单的调用方式是直接传入url
webFetch.addBeginTask("https://github.com");
- addRule(String pattern): добавляет правило сканирования URL, можно добавлять несколько правил, несколько правил связаны отношением «и», используется регулярное выражение для проверки, и полученный URL должен пройти проверку, чтобы быть добавленным в новую очередь задач. Например:
только сканирование URL-адресов на github.com, содержащих ключевое слово p, другие проанализированные URL-адреса будут отброшены.
//只抓取github.com下,带有p关键字的URL,其他解析出来的URL直接丢弃
webFetch.addRule(".*?github\.com.*?p.*?");
- setMaxPageLayer(int max): устанавливает уровень сканирования веб-страниц, начиная с 0 для начального адреса и заканчивая n, отрицательное значение указывает на бесконечное количество уровней. Эта настройка специально разработана для WebFetch, и не все сканеры имеют эту функцию. Задачи сканирования веб-страниц управляются очередью, которая представляет собой узкоспециализированный подход к сканированию, предназначенный для сканирования каталогов пиратских романов.
Например: структура сайта выглядит следующим образом (A, B, C... представляют веб-страницы), A является начальным адресом, переданным через addBeginTask, A находится на уровне 0, B, C, D находятся на уровне 1, E, G находятся на уровне 2, а F — на уровне 3.
A — начальная страница, поиск ограничен двумя уровнями (первый уровень равен 0).
//设置A为起始页面,搜索层次为两层(第一层为0)
webFetch.addBeginTask("http://A").setMaxPageLayer(1).start();
Полученный набор страниц: {A, B , C , D}. WebFetch будет записывать уже посещённые URL в памяти, чтобы избежать повторного посещения.
- setPageHandler(PageHandler pageHandler): пользовательский обработчик после сканирования веб-страницы путём передачи объекта, реализующего интерфейс PageHandler. WebFetch реализует DefaultPageHandler по умолчанию, просто выводя на консоль через System.out.print, предоставляя интерфейс для ленивых пользователей, и пользователь может отменить поведение по умолчанию, передав собственный обработчик PageHandler.
Интерфейс PageHandler:
public interface PageHandler {
//finish интерфейс возвращает отсканированную страницу (возвращает только страницу с кодом состояния 200)
public void finish(Page page);
//этот метод предназначен для использования с базами данных, после вызова WebFetch.close() он вызовет этот метод
public void close();
}
Пользователь может использовать этот интерфейс для обработки отсканированных страниц, например, для хранения в базе данных. По умолчанию WebFetch запускает несколько потоков для обработки страниц (отдельно от потоков HTTP-запросов), поэтому пользователи могут безопасно реализовать этот метод, не беспокоясь о том, нужно ли реализовывать неблокирующие методы (учитывая ограниченные ресурсы, пул потоков управляется, если все потоки заблокированы, задача переходит в очередь ожидания до тех пор, пока поток не станет доступен).
- setURLParser(URLParser parser): пользовательская реализация анализа URL отсканированной страницы путём передачи экземпляра анализатора URL.
Интерфейс URLParser:
public interface URLParser {
public Vector parse(Request parentPage);
}
WebFetch использует регулярные выражения для извлечения URL из тегов , где href="...", цель состоит в том, чтобы уменьшить зависимость от сторонних библиотек, пользователи могут реализовать этот интерфейс самостоятельно, например, используя jsoup для анализа.
Request предоставляет метод public static Request createSub(String mUrl , Request parentRequest) для обработки относительных адресов.
Например, http://abc.def/web/index.html содержит ссылку , URL, полученный при сканировании, равен ./page.html, но при использовании этого URL для отправки HTTP-запроса возникает ошибка, и метод Request.createSub может исправить URL на http://abc.def/web/page.html.
Другие настройки:
public class WebFetch {
...
//установка количества потоков для сканера, отделена от обработки страниц, выполняет специализированную работу по сканированию сети, по умолчанию 5 потоков
public WebFetch setThreadSize(int max);
//установить количество повторных попыток для одной страницы, по умолчанию не повторяется
public WebFetch setRetryTimes(int times);
//настройки прокси
public WebFetch setProxy(String host , int port , Proxy.Type type);
//ограничение количества отправленных HTTP-запросов (независимо от успеха или неудачи), по умолчанию без ограничений
public WebFetch setMaxTaskSize(int max);
//время ожидания соединения, по умолчанию 8 секунд
public WebFetch setConnectionTimeout(int timeout);
//время чтения страницы, по умолчанию 10 секунд
public WebFetch setReadTimeout(int timeout);
}
О проекте
Первая версия всё ещё нуждается в постоянном улучшении и доработке, мы надеемся получить ценные предложения по улучшению от всех, спасибо за вашу поддержку.
Контакты: wanghailiang333@qq.com
Опубликовать ( 0 )