User-Agent и заголовки в Puppeteer
Puppeteer — это мощная библиотека для Node.js, позволяющая управлять браузером Chrome или Chromium для тестирования, автоматизации и скрапинга. Одной из важных возможностей, которые предоставляет Puppeteer, является управление HTTP-заголовками и user-agent. Это позволяет настраивать поведение браузера при взаимодействии с веб-страницами, эмулировать различные устройства и маскировать действия бота, скрывая их от серверов.
User-Agent — это строка, которую браузер отправляет на сервер в HTTP-заголовке при каждом запросе. Эта строка содержит информацию о браузере, операционной системе и других параметрах, которые могут быть использованы сервером для адаптации контента под определённые устройства или платформы. Иногда необходимо изменить User-Agent, чтобы заставить сервер думать, что запрос поступает от другого браузера или устройства. Это может быть полезно, например, при скрапинге данных или тестировании адаптивности сайта.
Для изменения User-Agent в Puppeteer необходимо использовать метод
setUserAgent объекта страницы (page). Это
позволит настроить заголовок User-Agent для всех запросов,
отправляемых с этой страницы.
const puppeteer = require(&
(async () => {
const browser = await puppeteer.launch();
const page = await browser.newPage();
// Установка кастомного User-Agent
await page.setUserAgent('Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36');
await page.goto('https://example.com');
await browser.close();
})();
В данном примере setUserAgent изменяет строку User-Agent на
строку, идентифицирующую браузер Chrome на Windows 10. Все запросы с
этой страницы будут отправляться с изменённым User-Agent.
Помимо User-Agent, можно изменять и другие HTTP-заголовки. Это может
быть полезно для маскировки запросов, например, при скрапинге контента,
когда нужно подменить или добавить заголовки, такие как
Referer, Authorization или
Accept-Language.
Для изменения других заголовков используется метод
setExtraHTTPHeaders. Этот метод позволяет добавить или
изменить несколько заголовков одновременно.
const puppeteer = require('puppeteer');
(async () => {
const browser = await puppeteer.launch();
const page = await browser.newPage();
// Установка дополнительных HTTP-заголовков
await page.setExtraHTTPHeaders({
'Authorization': 'Bearer your-token',
'Accept-Language': 'en-US,en;q=0.9',
'Referer': 'https://example.com'
});
await page.goto('https://example.com');
await browser.close();
})();
Этот код добавляет заголовки Authorization,
Accept-Language и Referer ко всем
HTTP-запросам, отправляемым на сайт. Использование таких заголовков
может быть полезным, например, для аутентификации или корректной работы
с языковыми настройками на сайте.
Одним из мощных инструментов в Puppeteer является возможность эмуляции мобильных устройств. При эмуляции устройства необходимо не только изменить User-Agent, но и другие параметры, такие как размеры экрана, устройство ввода (например, сенсорный экран), а также добавить поддержку устройства для работы с touch-событиями.
const puppeteer = require('puppeteer');
(async () => {
const browser = await puppeteer.launch();
const page = await browser.newPage();
// Эмуляция мобильного устройства (iPhone 6)
const iPhone = puppeteer.devices['iPhone 6'];
await page.emulate(iPhone);
// Переход на страницу
await page.goto('https://example.com');
await browser.close();
})();
При эмуляции устройства Puppeteer автоматически меняет не только User-Agent, но и другие параметры, такие как размер экрана и возможности сенсорного ввода, чтобы воспроизвести поведение реального устройства.
Puppeteer также предоставляет возможность манипулировать заголовками на уровне отдельных запросов. Это полезно, если нужно изменить заголовки для определённых запросов, например, при загрузке изображений или скриптов.
const puppeteer = require('puppeteer');
(async () => {
const browser = await puppeteer.launch();
const page = await browser.newPage();
// Перехват HTTP-запросов и изменение заголовков
await page.setRequestInterception(true);
page.on('request', (request) => {
const headers = request.headers();
// Изменяем заголовок User-Agent для изображений
if (request.resourceType() === 'image') {
headers['User-Agent'] = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36';
}
request.continue({ headers });
});
await page.goto('https://example.com');
await browser.close();
})();
В этом примере заголовок User-Agent изменяется только для
изображений, которые загружаются на странице. Метод
setRequestInterception позволяет перехватывать все
HTTP-запросы и изменять их параметры перед тем, как они будут отправлены
на сервер.
Также стоит отметить, что при изменении заголовков нередко важно
работать с кукисами. Кукисы могут быть использованы для идентификации
пользователя и поддержания сессий. Puppeteer предоставляет методы для
работы с кукисами, такие как setCookie и
cookies, которые позволяют вручную устанавливать или
получать кукисы в браузере.
const puppeteer = require('puppeteer');
(async () => {
const browser = await puppeteer.launch();
const page = await browser.newPage();
// Установка куки
await page.setCookie({
name: 'session_id',
value: '12345',
domain: 'example.com'
});
// Переход на страницу
await page.goto('https://example.com');
// Получение всех куки
const cookies = await page.cookies();
console.log(cookies);
await browser.close();
})();
Здесь с помощью метода setCookie устанавливается cookie, а
с помощью метода cookies можно получить все cookies текущей
страницы.
Работа с заголовками в Puppeteer — важная часть процесса автоматизации браузера. Возможность изменять User-Agent и другие заголовки даёт гибкость при тестировании и скрапинге, позволяя манипулировать запросами и скрывать свою активность от серверов. Эмуляция мобильных устройств и перехват запросов добавляют дополнительные возможности для тонкой настройки взаимодействия с веб-страницами.