Рубрики
Без рубрики

Как написать веб-скребок в Node.js

Иногда нам нужно собирать информацию с разных веб-страниц, автоматически. Очевидно, что человек не нужен для этого. Умный сценарий может сделать работу довольно хорошо, особенно если это что-то повторяется. Вот как вы можете построить веб-скребок с Node.js!

Автор оригинала: Johnny B. (Ionică Bizău).

Иногда нам нужно собирать информацию с разных веб-страниц, автоматически. Очевидно, что человек не нужен для этого. Умный сценарий может сделать работу довольно хорошо, особенно если это что-то повторяется.

Когда нет веб-API, чтобы поделиться с помощью данных с нашим приложением, и мы все еще хотим извлечь некоторые данные с этого сайта, мы должны отступить к соскоре.

Это означает:

  1. Мы загружаем страницу (A Get запрос достаточно часто)
  2. Разобрать результат HTML
  3. Извлечь необходимые данные

В Node.js все эти три этапа довольно просты, потому что функциональность уже выполнена для нас в разных модулях, различными разработчиками.

Потому что я часто соскребаю случайных веб-сайтов, я создал еще один скребок: Scrape-ItNode.js Скребок для людей Отказ Он предназначен для того, чтобы быть действительно простым в использовании и до сих пор довольно минималист.

Вот как я это сделал:

1. Загрузите страницу

Чтобы загрузить веб-страницу, нам нужно использовать библиотеку, которая делает запросы HTTP (S). Есть много модулей, которые делают это. Как всегда, я рекомендую выбрать простые/маленькие модули – я написал крошечный пакет, который делает это: Tinyreq Отказ

Используя этот модуль, вы можете легко получить визуализацию HTML на сервере с веб-страницы:

const request = require("tinyreq");

request("http://ionicabizau.net/", function (err, body) {
    console.log(err || body); // Print out the HTML
});

Tinyreq на самом деле дружелюбированная оболочка вокруг родного http.request Встроенный раствор.

Как только у нас есть кусок HTML, нам нужно разбирать его. Как это сделать?

2. Разбор HTML

Ну, это сложная вещь. Другие люди уже сделали для нас. Мне очень нравится Cheerio модуль. Он предоставляет интерфейс, подобный jQuery, чтобы взаимодействовать с кусочком HTML, у вас уже есть.

const cheerio = require("cheerio");

// Parse the HTML 
let $ = cheerio.load("

Hello world

"); // Take the h2.title element and show the text console.log($("h2.title").text()); // => Hello world

Потому что я люблю модулировать все вещи, я создал Cheerio-Req который в основном Tinyreq в сочетании с Cheerio (в основном предыдущие два шага собраны вместе):

const cheerioReq = require("cheerio-req");

cheerioReq("http://ionicabizau.net", (err, $) => {
    console.log($(".header h1").text());
    // => Ionică Bizău
});

Поскольку мы уже знаем, как разбирать HTML, следующим шагом является создание хорошего общедоступного интерфейса, мы можем экспортировать в модуль.

3. Извлечь необходимые данные

Вместе предыдущие шаги вместе, у нас есть это (следуйте встроенным комментариям):

"use strict"

// Import the dependencies
const cheerio = require("cheerio")
    , req = require("tinyreq")
    ;

// Define the scrape function
function scrape(url, data, cb) {
    // 1. Create the request
    req(url, (err, body) => {
        if (err) { return cb(err); }

        // 2. Parse the HTML
        let $ = cheerio.load(body)
          , pageData = {}
          ;

        // 3. Extract the data
        Object.keys(data).forEach(k => {
            pageData[k] = $(data[k]).text();
        });

        // Send the data in the callback
        cb(null, pageData);
    });
}

// Extract some data from my website
scrape("http://ionicabizau.net", {
    // Get the website title (from the top header)
    title: ".header h1"
    // ...and the description
  , description: ".header h2"
}, (err, data) => {
    console.log(err || data);
});

При запуске этого кода мы получаем следующий вывод в консоли:

{ title: 'Ionică Bizău',
  description: 'Web Developer,  Linux geek and  Musician' }

Привет! Это моя информация о сайте, так что она работает. Теперь у нас есть небольшая функция, которая может получить текст из любого элемента на странице.

В Модуль я написал Я позволил скрестите списки вещей (например, статьи, страницы и т. Д.).

Итак, в основном, чтобы получить последние 3 статьи в моем блоге, вы можете сделать:

// Fetch the articles on the page (list)
scrapeIt("https://ionicabizau.net", {
    articles : {
        listItem: ".article"
      , data: {
            createdAt: {
                selector: ".date"
              , convert: x => new Date(x)
            }
          , title: "a.article-title"
          , tags: {
                selector: ".tags"
              , convert: x => x.split("|").map(c => c.trim()).slice(1)
            }
          , content: {
                selector: ".article-content"
              , how: "html"
            }
        }
    }
}, (err, page) => {
    console.log(err || page);
});

// { articles:
//    [ { createdAt: Mon Mar 14 2016 00:00:00 GMT+0200 (EET),
//        title: 'Pi Day, Raspberry Pi and Command Line',
//        tags: [Object],
//        content: '

Everyone knows (or should know)...a" alt="">

\n' }, // { createdAt: Thu Feb 18 2016 00:00:00 GMT+0200 (EET), // title: 'How I ported Memory Blocks to modern web', // tags: [Object], // content: '

Playing computer games is a lot of fun. ...' }, // { createdAt: Mon Nov 02 2015 00:00:00 GMT+0200 (EET), // title: 'How to convert JSON to Markdown using json2md', // tags: [Object], // content: '

I love and ...' } ] }

Счастливый соскоб!