User-agent и заголовки

User-Agent и заголовки в Puppeteer

Puppeteer — это мощная библиотека для Node.js, позволяющая управлять браузером Chrome или Chromium для тестирования, автоматизации и скрапинга. Одной из важных возможностей, которые предоставляет Puppeteer, является управление HTTP-заголовками и user-agent. Это позволяет настраивать поведение браузера при взаимодействии с веб-страницами, эмулировать различные устройства и маскировать действия бота, скрывая их от серверов.

User-Agent — это строка, которую браузер отправляет на сервер в HTTP-заголовке при каждом запросе. Эта строка содержит информацию о браузере, операционной системе и других параметрах, которые могут быть использованы сервером для адаптации контента под определённые устройства или платформы. Иногда необходимо изменить User-Agent, чтобы заставить сервер думать, что запрос поступает от другого браузера или устройства. Это может быть полезно, например, при скрапинге данных или тестировании адаптивности сайта.

Пример: изменение User-Agent в Puppeteer

Для изменения 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.

Пример: изменение заголовков в Puppeteer

Для изменения других заголовков используется метод 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, которые позволяют вручную устанавливать или получать кукисы в браузере.

Пример: установка и получение 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 и другие заголовки даёт гибкость при тестировании и скрапинге, позволяя манипулировать запросами и скрывать свою активность от серверов. Эмуляция мобильных устройств и перехват запросов добавляют дополнительные возможности для тонкой настройки взаимодействия с веб-страницами.