Автор оригинала: Johnny B. (Ionică Bizău).
Иногда нам нужно собирать информацию с разных веб-страниц, автоматически. Очевидно, что человек не нужен для этого. Умный сценарий может сделать работу довольно хорошо, особенно если это что-то повторяется.
Когда нет веб-API, чтобы поделиться с помощью данных с нашим приложением, и мы все еще хотим извлечь некоторые данные с этого сайта, мы должны отступить к соскоре.
Это означает:
- Мы загружаем страницу (A
Get
запрос достаточно часто) - Разобрать результат HTML
- Извлечь необходимые данные
В Node.js все эти три этапа довольно просты, потому что функциональность уже выполнена для нас в разных модулях, различными разработчиками.
Потому что я часто соскребаю случайных веб-сайтов, я создал еще один скребок: Scrape-It
– Node.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 ...' } ] }
Счастливый соскоб!