Использование плагина 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 и puppeteer-extra
- Playwright и playwright-extra
Убедитесь, что у вас установлены пакеты 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.
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('Краулер закончил работу.');
Убедитесь, что у вас установлены пакеты playwright-extra
и puppeteer-extra-plugin-stealth
через ваш менеджер пакетов
npm install playwright-extra puppeteer-extra-plugin-stealth
Для запуска этого примера на платформе Apify выберите образ apify/actor-node-puppeteer-chrome
для вашего Dockerfile.
import { PlaywrightCrawler } from 'crawlee';
// Для playwright-extra вам нужно будет импортировать тип браузера, который вы хотите использовать!
// По умолчанию PlaywrightCrawler использует chromium, но вы также можете использовать firefox или webkit.
import { chromium } from 'playwright-extra';
import stealthPlugin from 'puppeteer-extra-plugin-stealth';
// Сначала мы говорим playwright-extra использовать плагин (или плагины), которые мы хотим.
// Некоторые плагины могут иметь параметры, которые вы можете передать - ознакомьтесь с их документацией!
chromium.use(stealthPlugin());
// Создаем экземпляр класса PlaywrightCrawler - краулера,
// который автоматически загружает URL в headless Chrome / Playwright.
const crawler = new PlaywrightCrawler({
launchContext: {
// !!! Вы должны указать этот параметр, чтобы сказать Crawlee использовать playwright-extra в качестве запускателя !!!
launcher: chromium,
launchOptions: {
// Другие параметры playwright работают так же
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('Краулер закончил работу.');