CoderCastrov logo
CoderCastrov
Парсер

Парсинг веб-страниц с использованием Puppeteer

Парсинг веб-страниц с использованием Puppeteer
просмотров
3 мин чтение
#Парсер

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

Парсинг можно выполнять с использованием различного программного обеспечения. Вы можете выполнять парсинг веб-страниц с помощью чистого Node.js, но существуют библиотеки, которые упрощают этот процесс.

Puppeteer - это библиотека Node.js, которая предоставляет высокоуровневый API для управления браузером Chrome или Chromium через Протокол инструментов разработчика. Puppeteer по умолчанию работает в безголовом режиме, но может быть настроен для запуска полной версии Chrome или Chromium. — из README репозитория Puppeteer

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


Давайте создадим простой парсер одностраничного сайта с использованием Puppeteer. Парсинг общедоступных данных обычно разрешен, но иногда парсинг может быть запрещен политикой конфиденциальности. Поэтому мы будем парсить сайт со списком цитат, предоставленный toscrape.com, сайтом, созданным специально для парсинга.

Начните с установки библиотеки Puppeteer в вашем проекте. Следующая команда установит и библиотеку, и безголовый браузер, для которого предназначено API:

npm i puppeteer
# или "yarn add puppeteer"

Нам нужно инициализировать безголовый браузер, лучше всего сделать это в отдельном файле, который мы назовем 'browser.js', чтобы хорошо организовать структуру файлов, так как ваш парсер может быстро стать сложным.

const puppeteer = require('puppeteer'); //импорт puppeteer

async function startBrowser(){
    let browser;
    try {
        console.log("Открываю браузер......");
        browser = await puppeteer.launch({
            headless: true,
        });        //Запуск экземпляра браузера в безголовом режиме.
    } catch (err) {
        console.log("Не удалось создать экземпляр браузера => : ", err);
    }
    return browser;
}module.exports = {startBrowser}

Обратите внимание, что функция startBrowser() является асинхронной функцией, и используется обработчик await. Это связано с тем, что метод launch() в puppeteer возвращает promise, который должен быть разрешен. Это относится к большинству API Puppeteer.

Затем мы можем создать новый файл с именем 'pageScraper.js', в котором будет определена функциональность парсера.

const scraperObject = {
url: 'https://quotes.toscrape.com/',
async scraper(browserInstance){    let browser = await browserInstance; //инициализация браузера
    let page = await browser.newPage(); //инициализация страницы    console.log(`Переход на ${this.url}...`);
    // Переходим на выбранную страницу    await page.goto(this.url); //переходим по URL.    // Ожидаем, пока не будет отрисован необходимый DOM
    await page.waitForSelector('body > div > div:nth-child(2) >  div.col-md-8');    //Используем селекторы DOM для поиска текста цитаты и автора каждой цитаты, перечисленной на странице.
     let quoteList = await page.$$eval('body > div > div:nth-child(2) > div.col-md-8 > div', quotes => {        let data = [] //инициализация массива, содержащего объекты цитат
        text = quotes.map(el => el.querySelector('div > span:nth-child(1).text').textContent);        author = quotes.map(el => el.querySelector('div > span:nth-child(2) > small').textContent)        //Создаем объекты цитат
        for (let i = 0; i < quotes.length; i++) {
              data[i] = {
                  text: text[i],
                  author: author[i]
               }
         }         return data; //Возвращаем promise
    })   return quoteList;  }}module.exports = scraperObject;

Парсер готов. Осталось только создать файл index, в котором мы передадим экземпляр браузера нашему парсеру. Создадим 'index.js'.

const browserObject = require('./browser');
const pageScraper = require('./pageScraper');//Запускаем браузер и создаем экземпляр браузера
let browserInstance = browserObject.startBrowser();// Передаем экземпляр браузера объекту парсера
pageScraper.scraper(browserInstance)

Вот и все! Теперь мы можем запустить наш парсер через node с помощью команды:

node index.js

Это крайне простой пример. Он может парсить только одностраничные приложения, однако это может быть хорошей основой для создания более сложных парсеров.

API Puppeteer поставляется с очень подробной документацией, которую можно найти на их github или на pptr.dev для интерактивной документации.