Что такое веб-соскреб?
Он включает в себя автоматизирующую задачу сбора информации с веб-сайтов.
Есть много случаев использования для веб-соскоба, вы можете собирать цены на различных сайтах электронной коммерции для сайта сравнения цен. Или, возможно, вам нужны время полета и списки отелей для туристического сайта. Может быть, вы хотите собрать электронные письма от различных каталогов на продажи, или вы даже можете хотеть построить поисковую систему, как 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:
- Список веб-сервисов Scraping прокси
- Список удобных веб-инструментов Scraping
- Список веб-соров
- Сравнение прокси
- Caderio Documentation
- Документация Щелки
- Руководство к Интернету Уклон Предложения и исправления являются наиболее приветствиями ️. Получить код:
Garima-Sharma814/веб-скребок
Простое веб-приложение Scraping, чтобы соскрести всех индийских президентов (имя и дни рождения), присутствующие на Википедии.
Простое веб-приложение Scraping, чтобы соскрести всех индийских президентов (имя и дни рождения), присутствующие на Википедии.
Вид на Github
Написано и отредактировано я ❤️.
Оригинал: “https://dev.to/garimasharma/the-ultimate-guide-to-web-scraping-with-node-js-bn3”