Динамическая веб-страница - это страница, где контент не полностью вставлен в статический HTML, а генерируется с помощью серверного или клиентского рендеринга.
Она может отображать данные в режиме реального времени на основе действий пользователя, например, загружать больше контента при нажатии пользователем кнопки или прокрутке вниз по странице (например, бесконечная прокрутка). Такая конструкция улучшает пользовательский опыт и позволяет пользователям получать релевантную информацию без перезагрузки всей страницы.
Чтобы определить, является ли сайт динамической веб-страницей, вы можете отключить JavaScript в своем браузере. Если сайт динамичный, большая часть контента исчезнет.
Техники отпечатков пальцев: Многие сайты используют техники отпечатков пальцев для обнаружения и блокировки автоматических парсеров. Эти техники создают уникальный "отпечаток пальца" для каждого посетителя, анализируя информацию, такую как поведение в браузере, разрешение экрана, плагины, часовой пояс и т. д. Если обнаруживаются аномалии или несоответствия обычному поведению пользователя, сайт может заблокировать доступ.
Механизмы блокировки: Чтобы защитить свой контент, сайты реализуют различные механизмы блокировки, такие как:
Есть ли у вас какие-либо замечательные идеи или сомнения по поводу веб-парсинга и Browserless?
Давайте посмотрим, чем делятся другие разработчики на Discord и Telegram!
Эффективный способ перехвата XHR (XMLHttpRequest) и Fetch запросов во время процесса парсинга - это проверка вкладки Network браузера, чтобы определить конечные точки API, которые предоставляют динамический контент. После идентификации этих конечных точек HTTP-клиенты, такие как библиотека Requests, могут использоваться для отправки запросов непосредственно к этим API для получения данных.
Использование headless-браузера, такого как Puppeteer или Selenium, позволяет полностью имитировать поведение пользователя, включая загрузку страницы и взаимодействие. Эти инструменты способны обрабатывать JavaScript и парсить динамически генерируемый контент.
Запрос данных непосредственно из API сайта - это эффективный способ парсинга. Анализируйте сетевые запросы сайта, находите конечную точку API и используйте HTTP-клиент для запроса данных.
Отслеживая сетевые запросы, идентифицируя AJAX-вызовы и воспроизводя их, можно извлекать динамически загруженные данные.
Чтобы избежать блокировки сайтом, использование прокси-сервисов и ротации IP - это важная стратегия. Это поможет распределить запросы и снизить риск обнаружения.
Написание скриптов для имитации поведения пользователя при просмотре, например, добавление задержек между запросами, рандомизация порядка операций и т. д., может помочь снизить риск того, что сайт идентифицирует вас как парсер.
Browserless - это облачный сервис headlesschrome, который работает с онлайн-приложениями и автоматизирует скрипты без графического интерфейса. Он особенно полезен для таких задач, как веб-парсинг и другие автоматизированные операции.
Browserless - это также мощный headless-браузер. Далее мы будем использовать Browserless в качестве примера для парсинга динамических веб-страниц.
Прежде чем начать, нам нужно иметь сервис Browserless. Использование Browserless может решить сложные задачи веб-парсинга и крупномасштабной автоматизации, и теперь достигнуто полное управление развертыванием в облаке.
Browserless использует стратегию, ориентированную на браузер, предоставляет мощные возможности headless-развертывания и обеспечивает более высокую производительность и надежность. Вы можете щелкнуть здесь, чтобы узнать больше о настройке сервисов Browserless.
В самом начале нам нужно было получить API KEY от Nstbrowser. Вы можете перейти на страницу меню Browserless в клиенте Nstbrowser, или вы можете щелкнуть здесь, чтобы перейти.
Прежде чем начать, определим цель этого теста. Мы будем использовать Puppeteer и Playwright, чтобы получить контент заголовка страницы динамических сайтов:
Выполните следующие шаги, чтобы установить зависимости:
npm init -y
pnpm add playwright puppeteer-core
const { chromium } = require('playwright');
async function createBrowser() {
const token = ''; // required
const config = {
proxy:
'', // required; input format: schema://user:password@host:port eg: http://user:password@localhost:8080
// platform: 'windows', // support: windows, mac, linux
// kernel: 'chromium', // only support: chromium
// kernelMilestone: '124', // support: 113, 120, 124
// args: {
// '--proxy-bypass-list': 'detect.nstbrowser.io',
// }, // browser args
// fingerprint: {
// userAgent:
// 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/128.0.6613.85 Safari/537.36',
// },
};
const query = new URLSearchParams({
token: token, // required
config: JSON.stringify(config),
});
const browserWSEndpoint = `ws://less.nstbrowser.io/connect?${query.toString()}`;
const browser = await chromium.connectOverCDP(browserWSEndpoint);
const context = await browser.newContext();
const page = await context.newPage();
page.goto('https://www.nstbrowser.io/en');
// sleep for 5 seconds
await new Promise((resolve) => setTimeout(resolve, 5000));
const h1Element = await page.$('h1');
const content = await h1Element?.textContent();
console.log(`Playwright: The content of the h1 element is: ${content}`)
await page.close();
await page.context().close();
}
createBrowser().then();
const puppeteer = require('puppeteer-core');
async function createBrowser() {
const token = ''; // required
const config = {
proxy:
'', // required; input format: schema://user:password@host:port eg: http://user:password@localhost:8080
// platform: 'windows', // support: windows, mac, linux
// kernel: 'chromium', // only support: chromium
// kernelMilestone: '124', // support: 113, 120, 124
// args: {
// '--proxy-bypass-list': 'detect.nstbrowser.io',
// }, // browser args
// fingerprint: {
// userAgent:
// 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/128.0.6613.85 Safari/537.36',
// },
};
const query = new URLSearchParams({
token: token, // required
config: JSON.stringify(config),
});
const browserWSEndpoint = `ws://less.nstbrowser.io/connect?${query.toString()}`;
const browser = await puppeteer.connect({
browserWSEndpoint: browserWSEndpoint,
defaultViewport: null,
});
const page = await browser.newPage();
await page.goto('https://www.nstbrowser.io/en');
// sleep for 5 seconds
await new Promise((resolve) => setTimeout(resolve, 5000));
const h1Element = await page.$('h1');
if (h1Element) {
const content = await page.evaluate((el) => el.textContent, h1Element); // use page.evaluate to get the text content of the h1 element
console.log(`Puppeteer: The content of the h1 element is: ${content}`);
} else {
console.log('No h1 element found.');
}
await page.close();
}
createBrowser().then();
Парсинг динамических веб-страниц всегда сложнее, чем парсинг обычных веб-страниц. Во время процесса парсинга легко столкнуться с различными проблемами. Благодаря представленной в этом блоге информации вы должны были узнать: