4.1 Імплементація PageProcessor
У наведеному прикладі - клас GithubRepoPageProcessor
, імплементує PageProcessor
.
Будемо настроювати PageProcessor за допомогою PageProcessoration, що ділиться на три частини: конфігурація пошукача, екстракція елементів сторінки і виявлення посилань (лінків).
public class GithubRepoPageProcessor implements PageProcessor {
// Part I: crawl the site configuration, including coding, crawler space, retries, etc.
/// Частина 1: пошукачу вказують сайт, включаючи кодування, простір для пошуку, повторні спроби і т.д.
private Site site = Site.me().setRetryTimes(3).setSleepTime(1000);
@Override
// Process custom crawler logic core interfaces, where the preparation of extraction logic
/// Процес призначення пошукачу логіки основних інтерфейсів, де визначаються правила екстракції даних
public void process(Page page) {
// Part II: the definition of how to extract information about the page, and preserved
/// Частина 2: визначення правил екстракції інформацію зі сторінки і в якому полі классу зберігається
page.putField("author", page.getUrl().regex("https://github\\.com/(\\w+)/.*").toString());
page.putField("name", page.getHtml().xpath("//h1[@class='entry-title public']/strong/a/text()").toString());
if (page.getResultItems().get("name") == null) {
//skip this page
/// пропустити цю сторінку
page.setSkip(true);
}
page.putField("readme", page.getHtml().xpath("//div[@id='readme']/tidyText()"));
// Part III: From the subsequent discovery page url address to crawler
/// Частина 3: Із результатів попередніх обробок вишукуемо URL адреси інших сторінок для передачи пошукачеві на обробку
page.addTargetRequests(page.getHtml().links().regex("(https://github\\.com/[\w\-]+/[\w\-]+)").all());
}
@Override
public Site getSite() {
return site;
}
public static void main(String[] args) {
Spider.create(new GithubRepoPageProcessor())
//From "https://github.com/code4craft" began to grasp
/// URL адреса "https://github.com/code4craft" з якої починається пошук
.addUrl("https://github.com/code4craft")
//Open 5 threads of Crawler
/// Відкрвати 5 паралельних потоків пошукача
.thread(5)
//Start Crawler
/// Запуск в роботу пошукача
.run();
}
}
4.1.1 Конфігурація пошукача
Перша частина конфігурації сканеру пошукача, включають в себе: кодування, інтервал сканування, час очікування, число повторних спроб, а також включає в себе деякі параметри браузера: User Agent, cookie і налаштування проксі-сервера. Докладніше у 4.5 Знайомство з інструментами вилучення - екстракцією: Jsoup та Xsoup. Якщо коротенько, то тут у прикладі встановлено: число повторних спроб - до 3 разів, та сканувати з інтервалом в 1 секунду.
4.1.2 Екстракція елементів сторінок
Друга частина - ядро пошукового сканеру: витягти інформацію (екстракція) з HTML-сторінки, що щойно завантажена. WebMagic використовує в основному три технології екстракції: XPath, регулярні вирази (regular expressions) і CSS селектори. Окрім того, для резурсів де інформація у форматі JSON, ви можете використовувати JsonPath.
XPath
Започатковано XPath, як мова запитів XML елементів, але згодом також поширився та став зручним і для HTML, наприклад:
page.getHtml().xpath("//h1[@class='entry-title public']/strong/a/text()")
Цей код використовує XPath, та означає: "знайти всі атрибута класу @class 'entry-title public' для тегів (елемент)
<h1>
і знайти дочірній тег-вузол (ноду node)<strong>
, у якого наявний тег<a>
та з нього витягнути текстову інформацію." Відповідний до нього HTML-код наприклад наступний:CSS селектор
CSS і XPath селектори схожі за синтаксисом мови. Для front-end розробки знайоме формулювання $('h1.entry-title'), що відповідне до попереднього прикладу. Об'єктивно кажучи, його простіше писати, ніж XPath, але якщо ви пишете більш складні правила екстракції, то це відносно невеликі проблеми.
Регулярні вирази regular Expressions
Регулярні вирази (див. wikipedia) є універсальною мовою для екстракції тексту.
page.addTargetRequests(page.getHtml().links().regex("(https://github\\.com/\\w+/\\w+)").all());
Цей код використовує регулярний вираз для екстракції усіх лінків з "https://github.com/code4craft/webmagic".
JsonPath
JsonPath це мова дуже схожа у використанні на XPath, але для швидкого пошуку у JSON контенті. Докладніше про використаний у WebMagic формат JsonPath можна знайти тут: https://code.google.com/p/json-path/
4.1.3 Пошук лінків
Після обробки сторінки нашим сканером по всім виразам з логікою, краулер закриється!
Але тепер виникає проблема: сторінок сайту багато, і з самого початку ми можемо не знати та перерахувати всі. Але в отсканованих сторінках можна пошукати ще і додаткові линки. Таким чином можна додати їх до списку черги линків для сканування. Цей фунціонал такод є невід'ємною частиною пошукача.
page.addTargetRequests(page.getHtml().links().regex("(https://github\\.com/\\w+/\\w+)").all());
Цей код складається з двох частин:
* регулярний вираз посиланнь на сайт `page.getHtml().links().regex("(https://github\\.com/\\w+/\\w+)").all()` - тобто отримати всі лінки з "(https://github\\.com/\\w+/\\w+)" - це за шаблоном https://github.com/ОднаЧиБільшеБукв/ОднаЧиБільшеБукв,
* `page.addTargetRequests()` - визов метода - усі ці знайдені за шаблоном посилання будуть додані в чергу для подальшого пошукового сканування.