Основні комбінації сторінки та список деталей

Почнемо з простого прикладу. Наприклад у нас є список сторінок. Вони вміщують лінки, що мають різні формати. Яким чином ми можемо відібрати з них посилання, щоб знайти всі цільові сторінки?

1 Початокові лінки прикладу

Ось, наприклад, блог автора Сіна http://blog.sina.com.cn/flashsword20. У ньому ми хочемо, щоб останню сторінку статті блога, екстрактувати назву блогу title, контент, дату і іншу інформацію. Але ще сканувати посилання блогу та іншу інформацію зі списком сторінок, щоб отримати всі останні статті цього блогу.

2 Пошук URL-ів на статті

По вимозі пошукача URL статті є нашою кінцевою метою, так як знайти всі статті в цьому блозі адреса є першим кроком сканерів.

Ми можемо використовувати регулярні вирази http://blog\\.sina\\.com\\.cn/s/blog_\\w+\\.html як фільтр грубої очистки для URL-ів. Більш складним є те, що цей URL є занадто широким і може повзти до іншої інформації в блозі, тому ми повинні вказати область на сторінці зі списком URL, які необхідно отримати.  Тут ми використовуємо XPath //div[@class=\\"articleList\\"] для вибірки усіх областей. Потім використаємо links() або XPath //a/@href щоб отримати всі посилання. І, нарешті, застосовуємо регулярні вирази http://blog\\.sina\\.com\\.cn/s/blog_\\w+\\.html, щоб відфільтрувати URL та видалити деякі зайві категорії посиланнь "edit" (редагувати) або "more" (докладніще). Таким чином, ми можемо написати:

page.addTargetRequests(page.getHtml().xpath("//div[@class=\"articleList\"]").links().regex("http://blog\\.sina\\.com\\.cn/s/blog_\\w+\\.html").all());

У той же час, нам потрібно знайти список всіх сторінок, щоб додати їх URL до списку черги завантажень:

page.addTargetRequests(page.getHtml().links().regex("http://blog\\.sina\\.com\\.cn/s/articlelist_1487828712_0_\\d+\\.html").all());

3 Екстракція контенту

Витяг інформації зі сторінки статті досить простий, застосовуємо XPath вираз відповідний до цього.

page.putField("title", page.getHtml().xpath("//div[@class='articalTitle']/h2"));
page.putField("content", page.getHtml().xpath("//div[@id='articlebody']//div[@class='articalContent']"));
page.putField("date",
        page.getHtml().xpath("//div[@id='articlebody']//span[@class='time SG_txtc']").regex("\\((.*)\\)"));

4 Розрізнити лінки на списки та цільові сторінки

Ми визначили список URL цільових сторінок і шляхи їх обробки. Тепер маємо справу їх розрізнити. У цьому випадку відрізнити дуже просто - формат списку URL на інші сторінки та формат URL сторінки призначення відрізняється. Тому зробимо це!

// List
if (page.getUrl().regex(URL_LIST).match()) {
    page.addTargetRequests(page.getHtml().xpath("//div[@class=\"articleList\"]").links().regex(URL_POST).all());
    page.addTargetRequests(page.getHtml().links().regex(URL_LIST).all());
    // Article Page
} else {
    page.putField("title", page.getHtml().xpath("//div[@class='articalTitle']/h2"));
    page.putField("content", page.getHtml().xpath("//div[@id='articlebody']//div[@class='articalContent']"));
    page.putField("date",
            page.getHtml().xpath("//div[@id='articlebody']//span[@class='time SG_txtc']").regex("\\((.*)\\)"));
}

Переглянути повний код наведеного прикладу SinaBlogProcessor.java.

5 Підсумки

У цьому прикладі використали декілька головних метода:

  • Пошук посиланнь зі сторінки за допомогою регулярних виразів та їх фільтрація по області розташування.
  • PageProcessor з двома типами налаштувань сторінки, в залежності від його URL, для відокремлення цілей між ними.

Друзі, що мали з деякі незручності та відмінності залишили #issue83. Є плани з версії 0.5.0 додати до фіч у WebMagic SubPageProcessor для вирішення цих проблем.

results matching ""

    No results matching ""