Поиск по сайту:

Как использовать node.js, request и cheerio для настройки простого веб-скрейпинга


Введение:

В этом уроке мы будем очищать первую страницу

Cheerio легкий, быстрый, гибкий и простой в использовании, если вы

Требования:

Я предполагаю, что вы уже знакомы с node.js, jQuery и

Если вы не знакомы с node.js или еще не установили его,

Код:

Чтобы установить необходимые модули с помощью NPM, просто введите следующее

запрос на установку npm приветствие

Это установит модули в ваш текущий рабочий каталог.

Чтобы установить модули глобально, запустите:

Создайте файл с именем scrape.js и добавьте следующие строки:

var request = require('request');
var cheerio = require('cheerio');

Это загрузит все зависимости нашего модуля.

Теперь загрузите первую страницу Hacker News простым запросом и

Добавьте эти строки в файл:

request('https://news.ycombinator.com', function (error, response, html) {
  if (!error && response.statusCode == 200) {
    console.log(html);
  }
});

Попробуйте запустить скрипт с помощью node scrape.js, и вы

Чтобы знать, как извлечь желаемые метаданные, нам нужно знать

В этом примере я открыл Hacker News в Chrome, щелкнул правой кнопкой мыши и

Бегло взглянув на консоль веб-разработчика, я пришел к

Мы можем проверить мое предположение, изменив наш код запроса на это:

request('https://news.ycombinator.com', function (error, response, html) {
  if (!error && response.statusCode == 200) {
    var $ = cheerio.load(html);
    $('span.comhead').each(function(i, element){
      var a = $(this).prev();
      console.log(a.text());
    });
  }
});

Как и ожидалось, запустив код, мы получим список из 30 наименований. Давайте

request('https://news.ycombinator.com', function (error, response, html) {
  if (!error && response.statusCode == 200) {
    var $ = cheerio.load(html);
    $('span.comhead').each(function(i, element){
      var a = $(this).prev();
      var rank = a.parent().parent().text();
      var title = a.text();
      var url = a.attr('href');
      var subtext = a.parent().parent().next().children('.subtext').children();
      var points = $(subtext).eq(0).text();
      var username = $(subtext).eq(1).text();
      var comments = $(subtext).eq(2).text();
      // Our parsed meta data object
      var metadata = {
        rank: parseInt(rank),
        title: title,
        url: url,
        points: parseInt(points),
        username: username,
        comments: parseInt(comments)
      };
      console.log(metadata);
    });
  }
});

Вот обзор того, что делает добавленный код:

Выберите предыдущий элемент:

var a = $(this).prev();

Получите ранг, проанализировав элемент на два уровня выше элемента \a\:

var rank = a.parent().parent().text();

Разберите заголовок ссылки:

var title = a.text();

Разберите атрибут href из элемента \a\:

var url = a.attr('href');

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

var subtext = a.parent().parent().next().children('.subtext').children();

Извлеките соответствующие данные из детей:

var points = $(subtext).eq(0).text();
var username = $(subtext).eq(1).text();
var comments = $(subtext).eq(2).text();

Запуск модифицированного скрипта должен вывести массив таких объектов:

[ { rank: 1,
    title: 'The Meteoric Rise of DigitalOcean ',
    url: 'http://news.netcraft.com/archives/2013/06/13/the-meteoric-rise-of-digitalocean.html',
    points: 240,
    username: 'beigeotter',
    comments: 163 },
  { rank: 2,
    title: 'Introducing Private Networking',
    url: 'https://linux-console.net/blog_posts/introducing-private-networking',
    points: 172,
    username: 'Goranek',
    comments: 75 },
...

Вот и все! Теперь вы можете сохранить извлеченные данные

var request = require('request');
var cheerio = require('cheerio');

request('https://news.ycombinator.com', function (error, response, html) {
  if (!error && response.statusCode == 200) {
    var $ = cheerio.load(html);
    var parsedResults = [];
    $('span.comhead').each(function(i, element){
      // Select the previous element
      var a = $(this).prev();
      // Get the rank by parsing the element two levels above the "a" element
      var rank = a.parent().parent().text();
      // Parse the link title
      var title = a.text();
      // Parse the href attribute from the "a" element
      var url = a.attr('href');
      // Get the subtext children from the next row in the HTML table.
      var subtext = a.parent().parent().next().children('.subtext').children();
      // Extract the relevant data from the children
      var points = $(subtext).eq(0).text();
      var username = $(subtext).eq(1).text();
      var comments = $(subtext).eq(2).text();
      // Our parsed meta data object
      var metadata = {
        rank: parseInt(rank),
        title: title,
        url: url,
        points: parseInt(points),
        username: username,
        comments: parseInt(comments)
      };
      // Push meta-data into parsedResults array
      parsedResults.push(metadata);
    });
    // Log our finished parse results in the terminal
    console.log(parsedResults);
  }
});