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

Ultimate Guide To Web Scraping с Node.js

Что такое веб-соскреб? Это включает в себя автоматизирующую задачу сбора информации от … Теги с узлом, веб-описанием, начинающими, JavaScript.

Что такое веб-соскреб?

Он включает в себя автоматизирующую задачу сбора информации с веб-сайтов.

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

Начало работы с Web Scraping легко, и процесс можно разбить на две основные части:

  • Приобретение данных с использованием библиотеки HTML-запроса или браузера без головы (может быть Мы проверим это в другом посте),
  • и разбирая данные, чтобы получить точную информацию, которую вы хотите.

Это руководство будет прогуляться по процессу с популярным Node.js Запрос-обещание Модуль, Ceriojs и Кукла Отказ Проработав примеры в этом посте, мы узнаем все советы и трюки, которые вам нужно стать профессионалом, сбором любых данных, которые вам нужны с Node.js!

Мы будем собраны список всех имен и дней рождения индийских президентов из Википедии.

Давайте сделаем это шагом за шагом

Шаг 1: Проверьте, если у вас установлен узел и NPM в вашей системе. Запустите эти команды в концевой строке

node -v

а также

npm -v

Если вы получите версию в качестве вывода команды, которую вы уже установили Узел и NPM Если вы получили любую ошибку, пожалуйста, попробуйте установить их. Вывод может выглядеть как

v14.16.1

Шаг 2: Настройте новый пакет NPM Команда выполнения

npm init -y

Эта команда сделает много тяжелой работы сзади и создать package.json Файл, который будет следить за всеми зависимостями и DevDependonds, мы будем устанавливать во всей нашей программе.

Шаг 3: Сделать ваш первый запрос

npm i -D request request-promise cheerio puppeteer

или

npm install --save request request-promise cheerio puppeteer
  • -D и –спасти Метки используются для установки NPM модуля в качестве DevDependonds.

  • Uppeteeter займет некоторое время, чтобы установить, как это необходимо для скачивания Chromium, а также вы можете пропустить это, потому что мы еще не используем uppeter в нашей программе.

Шаг 3: Перейдите в свой любимый редактор кода/IDE Давайте сделаем файл с именем scraper.js И напишите быструю функцию, чтобы получить HTML страницы «Список президентов» HTML из Википедии «Список президентов».

const rp = require('request-promise');
const url = 'https://en.wikipedia.org/wiki/List_of_presidents_of_India';

rp(url)
  .then((html)=>{
    console.log(html);
  })
  .catch((err)=>{
    console.log(err);
  });

Выход:






List of Presidents of the India - Wikipedia
...

Используя Chrome devtools.

Cool, мы получили RAW HTML с веб-страницы! Но теперь нам нужно иметь смысл этого гигантского блока текста. Для этого нам нужно будет использовать Chrome devtools, чтобы позволить нам легко найти через HTML веб-страницы.

Использование Chrome devtools легко: просто откройте Google Chrome и щелкните правой кнопкой мыши на элементе, который вы хотели бы соскрести

Теперь просто нажмите «Проверка», и Chrome приведет к панели Devtools, что позволяет вам легко осмотреть исходный HTML страницы.

Проведуя имя президента Индии, мы узнали, что имена хранятся внутри TH Тег, завернутый в Якорная тег . Так что давайте будем использовать это тогда!

Шаг 4: Разбор HTML с Ceriojs.

const rp = require('request-promise');
const $ = require('cheerio');
const url = 'https://en.wikipedia.org/wiki/List_of_presidents_of_India';

rp(url)
  .then((html)=>{
    console.log($('th > a', html).length);
    console.log($('th > a', html));
  })
  .catch((err)=>{
    console.log(err);
  });

Выход:

18
{ '0':
  { type: 'tag',
    name: 'a',
    attribs: { href: '/wiki/Rajendra_Prasad', title: 'Rajendra Prasad' },
    children: [ [Object] ],
    next: null,
    prev: null,
    parent:
      { type: 'tag',
        name: 'big',
        attribs: {},
        children: [Array],
        next: null,
        prev: null,
        parent: [Object] } },
  '1':
    { type: 'tag'
...

Примечание:

Я сталкивался с некоторыми проблемами, используя Cheerio и обнаружил, что иногда требуется («PackageName»). По умолчанию необходимо экспортировать. Так что, если вы получите ошибку о Черрио не функция или $ не функция Отказ Попробуйте использовать это:

var $ = require('cheerio');
if (typeof $ != "function") $ = require("cheerio").default;

Это сработало для меня!

Шаг 5: Получать имена всех президентов.

Мы проверяем, чтобы убедиться, что именно появляются ровно 18 элементов (количество президентов Индии), что означает, что нет никаких дополнительных тегов «Th» в другом месте на странице. Теперь мы можем пройти через список ссылок на все 18 страниц президентских википедий, получая их из раздела «Атрибут» каждого элемента.

const rp = require('request-promise');
const $ = require('cheerio');
const url = 'https://en.wikipedia.org/wiki/List_of_presidents_of_India';
if (typeof $ != "function") $ = require("cheerio").default;

rp(url)
  .then((html)=>{
    const presidentUrls = [];
    const length = $("th > a", html).length;
    for (let i = 0; i < length ; i++) {
      presidentUrls.push($('th > a', html)[i].attribs.href);
    }
    console.log(presidentUrls);
  })
  .catch((err)=>{
    console.log(err);
  });

Выход

[
  '/wiki/Rajendra_Prasad',
  '/wiki/Sir Sarvepalli_Radhakrishnan',
  '/wiki/Zakir_Husain',
  '/wiki/V._V._Giri',
  '/wiki/Mohammad_Hidayatullah',
  '/wiki/V._V._Giri',
  '/wiki/Fakhruddin_Ali_Ahmed',
  ...
]

Шаг 6: Давайте схватим их дни рождения с HTML-страницы.

Теперь у нас есть список всех 18 президентских страниц Википедии. Давайте создадим новый файл (с именем Scrapparse.js), который будет содержать функцию, чтобы взять наступление президентской википедии и вернуть имя президента и день рождения. Первые вещи сначала давайте получим RAW HTML от страницы Википедии Раджендра Прасада.

const rp = require('request-promise');
const url = 'https://en.wikipedia.org/wiki/Rajendra_Prasad';

rp(url)
  .then((html)=> {
    console.log(html);
  })
  .catch((err)=> {
    console.log(err);
  });

Выход:




Rajendra Prasad - Wikipedia
...

Давайте еще раз используем Chrome devtools, чтобы найти синтаксис кода, который мы хотим проанализировать, чтобы мы могли извлечь имя и день рождения с Cheerio.js.

Итак, мы видим, что имя в классе под названием «Firstheading» и день рождения в классе под названием «BDY». Давайте изменим наш код для использования Cheerio.js для извлечения этих двух классов.

const rp = require('request-promise');
const $ = require('cheerio');
const url = 'https://en.wikipedia.org/wiki/Rajendra_Prasad';
if (typeof $ != "function") $ = require("cheerio").default;

rp(url)
  .then((html)=> {
    console.log($('.firstHeading', html).text());
    console.log($('.bday', html).text());
  })
  .catch((err)=> {
    console.log(err);
  });

Выход:

Rajendra Prasad
1884-12-03

Шаг 4: Положить все вместе Теперь давайте отключаем это в функцию и экспортируйте его из этого модуля.

const rp = require('request-promise');
var $ = require('cheerio');

if( typeof $ != 'function' ) $ = require('cheerio').default;

const scrapParse = (url) => {
    return rp(url)
    .then((html)=>{
        return {
        name: $('.firstHeading', html).text(),
        birthday: $('.bday', html).text(),
        };
    }).catch((err)=>{
        console.log(err);
    });
}

module.exports = scrapParse;

Теперь давайте вернемся к нашему оригинальному файлу Scraper.js и требуют scrapparse.js модуль. Затем мы применим его к списку президеров, которые мы собрали ранее.

const rp = require("request-promise");
var $ = require("cheerio");
const scrapParse = require("scrapParse");
if (typeof $ != "function") $ = require("cheerio").default;

const url = "https://en.wikipedia.org/wiki/List_of_presidents_of_India";

if (typeof $ != "function") $ = require("cheerio").default;

rp(url)
  .then((html) => {
    const presidentUrl = [];
    const length = $("th > a", html).length;
    for (let i = 0; i < length; i++) {
      presidentUrl.push($("th > a", html)[i].attribs.href);
    }
    return Promise.all(
      presidentUrl.map((name) => {
        return scrapParse(`https://en.wikipedia.org${name}`);
      })
    );
  })
  .then((presidents) => {
    console.log(presidents);
  })
  .catch((err) => {
    console.log(err);
  });

Выход:

[
  { name: 'Rajendra Prasad', birthday: '1884-12-03' },
  { name: 'Sarvepalli Radhakrishnan', birthday: '1888-09-05' },
  { name: 'Zakir Husain (politician)', birthday: '1897-02-08' },
  { name: 'V. V. Giri', birthday: '1894-08-10' },
  { name: 'V. V. Giri', birthday: '1894-08-10' },
  { name: 'Fakhruddin Ali Ahmed', birthday: '1905-05-13' },
  { name: 'B. D. Jatti', birthday: '1912-09-10' },
  { name: 'Neelam Sanjiva Reddy', birthday: '1913-05-19' },
  { name: 'Zail Singh', birthday: '1916-05-05' },
  { name: 'Zail Singh', birthday: '1916-05-05' },
  { name: 'Zail Singh', birthday: '1916-05-05' },
  { name: 'Ramaswamy Venkataraman', birthday: '1910-12-04' },
  { name: 'Shankar Dayal Sharma', birthday: '1918-08-19' },
  { name: 'K. R. Narayanan', birthday: '1997-07-25' },
  { name: 'A. P. J. Abdul Kalam', birthday: '1931-10-15' },
  { name: 'Pratibha Patil', birthday: '1934-12-19' },
  { name: 'Pranab Mukherjee', birthday: '1935-12-11' },
  { name: 'Ram Nath Kovind', birthday: '1945-10-01' }
]

Дополнительные ресурсы

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

Написано и отредактировано я ❤️.

Оригинал: “https://dev.to/garimasharma/the-ultimate-guide-to-web-scraping-with-node-js-bn3”