Перейти к основному содержимому

Использование плагина Puppeteer Stealth (puppeteer-extra) и playwright-extra

puppeteer-extra и playwright-extra - это библиотеки, разработанные сообществом, которые добавляют систему плагинов для расширения функциональности puppeteer и playwright соответственно (например, улучшение маскировки бота с помощью плагина Puppeteer Stealth (puppeteer-extra-plugin-stealth)).

Доступные плагины

Список доступных плагинов для puppeteer-extra.

Для playwright смотрите список плагинов playwright-extra.

В этом примере мы покажем, как использовать плагин Puppeteer Stealth (puppeteer-extra-plugin-stealth) для обхода обнаружения ботов при сканировании целевого сайта.

Перед началом работы

Убедитесь, что у вас установлены пакеты Puppeteer Extra (puppeteer-extra) и Puppeteer Stealth (puppeteer-extra-plugin-stealth) через ваш менеджер пакетов

npm install puppeteer-extra puppeteer-extra-plugin-stealth
подсказка

Для запуска этого примера на платформе Apify выберите образ apify/actor-node-puppeteer-chrome для вашего Dockerfile.

Run on
src/crawler.ts
import { PuppeteerCrawler } from 'crawlee';
import puppeteerExtra from 'puppeteer-extra';
import stealthPlugin from 'puppeteer-extra-plugin-stealth';

// Сначала мы говорим puppeteer-extra использовать плагин (или плагины), которые мы хотим.
// Некоторые плагины могут иметь параметры, которые вы можете передать - ознакомьтесь с их документацией!
puppeteerExtra.use(stealthPlugin());

// Создаем экземпляр класса PuppeteerCrawler - краулера,
// который автоматически загружает URL в headless Chrome / Puppeteer.
const crawler = new PuppeteerCrawler({
launchContext: {
// !!! Вы должны указать этот параметр, чтобы сказать Crawlee использовать puppeteer-extra в качестве запускателя !!!
launcher: puppeteerExtra,
launchOptions: {
// Другие параметры puppeteer работают так же
headless: true,
},
},

// Останавливаем краулинг после нескольких страниц
maxRequestsPerCrawl: 50,

// Эта функция будет вызываться для каждого URL для краулинга.
// Здесь вы можете написать скрипты Puppeteer, с которыми вы уже знакомы,
// с исключением того, что браузеры и страницы автоматически управляются Crawlee.
// Функция принимает один параметр, который является объектом с следующими полями:
// - request: экземпляр класса Request с информацией, такой как URL и HTTP-метод
// - page: объект Page Puppeteer (см. https://pptr.dev/#show=api-class-page)
async requestHandler({ pushData, request, page, enqueueLinks, log }) {
log.info(`Processing ${request.url}...`);

// Функция для выполнения в контексте браузерного контекста Puppeteer.
const data = await page.$$eval('.athing', ($posts) => {
const scrapedData: { title: string; rank: string; href: string }[] = [];

// Мы получаем заголовок, ранг и URL каждого поста на Hacker News.
$posts.forEach(($post) => {
scrapedData.push({
title: $post.querySelector('.title a').innerText,
rank: $post.querySelector('.rank').innerText,
href: $post.querySelector('.title a').href,
});
});

return scrapedData;
});

// Сохраняем результаты в стандартный набор данных.
await pushData(data);

// Находим ссылку на следующую страницу и добавляем ее в очередь, если она существует.
const infos = await enqueueLinks({
selector: '.morelink',
});

if (infos.processedRequests.length === 0) log.info(`${request.url} is the last page!`);
},

// Эта функция вызывается, если обработка страницы завершилась неудачно более maxRequestRetries+1 раз.
failedRequestHandler({ request, log }) {
log.error(`Запрос ${request.url} завершился неудачно слишком много раз.`);
},
});

await crawler.addRequests(['https://news.ycombinator.com/']);

// Запускаем краулер и ждем, пока он закончит работу.
await crawler.run();

console.log('Краулер закончил работу.');