HTTP-заголовки для веб-скрейпинга

Узнайте о наиболее распространенных HTTP-заголовках, о том, почему они важны для веб-скрейпинга и как их оптимизировать.
3 min read
HTTP Headers for Web Scraping

Контекст, будь то культурный, экологический или реляционный, присутствует во всех коммуникациях и влияет на эффективность коммуникаций. В веб-коммуникациях HTTP-заголовки представляют собой технический контекст, которым веб-серверы и клиенты обмениваются при отправке HTTP-запросов или получении HTTP-ответов. Этот контекст можно использовать для упрощения аутентификации, определения поведения кэширования или управления состоянием сеанса. Это также помогает веб-серверам определить источник HTTP-запроса и способ ответа на него. Этот ответ может включать рендеринг сайта в соответствии с требованиями вашего клиентского устройства или доставку вам данных. Когда последняя выполняется с помощью бота, эта операция называется веб-скрейпингом, что удобно, когда вам нужно автоматически получать данные с сайта.

При создании скрейпера легко не обращать внимания на настройку HTTP-заголовка, поскольку значения по умолчанию позволяют выполнять запросы. Однако без правильно настроенных HTTP-заголовков трудно поддерживать непрерывную связь между скрейпером и веб-сервером. Это связано с тем, что веб-серверы можно настроить на обнаружение ботов и автоматических скриптов на основе информации в HTTP-заголовках по умолчанию, таких как User-AgentRefererи Accept-Language.

Однако, если вы правильно настроите заголовки, вы сможете смоделировать обычный пользовательский трафик, повышая надежность операций скрейпинга. В этой статье вы узнаете все об HTTP-заголовках, их роли в веб-скрейпинге и о том, как оптимизировать их для эффективного сбора данных.

Зачем нужны HTTP-заголовки

HTTP-заголовки — это пары ключ-значение в запросах и ответах, необходимые для веб-коммуникаций. Через заголовки запроса веб-сервер получает информацию и инструкции о клиенте и интересующем ресурсе. Между тем, заголовки ответов предоставляют клиенту больше информации о полученном ресурсе и полученном ответе. Хотя существует множество HTTP-заголовков, наиболее важными для веб-скрейпинга являются следующие:

User-Agent

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

По умолчанию в этом заголовке установлено значение, позволяющее легко идентифицировать ваш скрейпер как бота. Например, если вы хотите собрать данные о ценах с сайта электронной коммерции с помощью скрипта запросов Python, ваш скрейпер отправит в HTTP-заголовке User-Agent , аналогичный следующему:

"python-requests/X.X.X"

Вы можете избежать обнаружения, изменив User-Agent так, чтобы он имитировал разные браузеры и устройства. Для этого вам необходимо заменить заголовок запросов Python User-Agent следующим:

    "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/121.0.0.0 Safari/537.36"

Этот новый заголовок содержит информацию о браузере и собственной платформе, на которой он работает.

Accept-Language

Заголовок Accept-Language позволяет указать, на каком языке (языках) вы хотите получить запрошенный ресурс. При необходимости вы можете указать код страны или тип алфавита. Например, если для Accept-Language присвоено значение «en-US», это означает, что ресурс будет доступен на английском языке, на котором говорят в Соединенных Штатах Америки, даже если вы находитесь на другом континенте. Вы также можете использовать тип алфавита, чтобы определить заголовок как версию сербского языка на латинском алфавите, указав «sr-Latn». Это гарантирует получение соответствующих локализованных данных.

При наличии нескольких языков заголовок Accept-Language header становится разделенным запятыми списком языков со значениями качества , которые помогают определить порядок приоритета. Примером этого является «en -GB;q=1.0, en-US;q=0.9, fr;q=0.8», где более высокие значения q означают более высокий приоритет, а q варьируется от 0 до 1.

Cookie

Заголовок Cookie содержит данные, позволяющие веб-серверу идентифицировать сеанс пользователя в нескольких циклах запрос-ответ. Во время скрейпинга вы можете создавать файлы cookie на стороне клиента (или использовать ранее сохраненные файлы cookie) и включать их в HTTP-заголовок нового запроса. Это позволяет веб-серверу связать ваш запрос с действительным сеансом пользователя и вернуть необходимые данные. Например, если вам нужно сделать несколько запросов на получение пользовательских данных с сайта электронной коммерции, вам следует включить сеансовые файлы cookie в заголовок HTTP-запроса Cookie , чтобы ваш скрейпер мог войти в систему, хранить соответствующие данные и избежать использования систем обнаружения ботов на основе файлов cookie.

Заголовок Cookie состоит из списка, содержащего одну или несколько пар ключ-значение, разделенных точкой с запятой и пробелом («; »). Обычно он имеет вид «name0=value0; name1=value1; name2=value2».

Referer

Referer содержит абсолютный или частичный URL-адрес страницы, с которой вы запросили ресурс. Например, прокручивая домашнюю страницу сайта электронной коммерции, вы можете нажать на интересующую вас ссылку. Заголовок Referer в HTTP-запросе, открывающем следующую веб-страницу, указывает на домашнюю страницу сайта электронной коммерции, с которого вы инициировали запрос. При переходе на другие веб-страницы с текущей страницы каждая просмотренная ранее страница служит реферером (англ. Referer) для следующей. Это аналогично тому, как рефералы работают во взаимодействии с людьми.

Естественно, некоторые сайты проверяют этот заголовок как часть механизма защиты от скрейпинга. Это означает, что если вы хотите смоделировать естественный поток трафика с других сайтов и избежать блокировок, вам необходимо указать в заголовке Referer действительный URL-адрес, например домашнюю страницу сайта или URL-адрес поисковой системы.

Как оптимизировать HTTP-заголовки для веб-скрейпинга

Выполняя скрейпинг, имейте в виду, что нужные вам данные ценны для их владельцев, и они, возможно, не решатся поделиться ими. В результате многие владельцы принимают меры по обнаружению автоматических агентов, пытающихся получить доступ к их контенту. В случае успеха они могут заблокировать вас или вернуть нерелевантные данные.

HTTP-заголовки помогают обойти эти меры безопасности, создавая впечатление, будто ваш скрейпер является обычным пользователем Интернета, просматривающим сайт. Правильно настроив заголовки, такие как User-AgentAcceptAccept-Languageи Referer, вы сможете эффективно имитировать обычный веб-трафик и затруднить веб-серверу идентификацию вашего бота как скрейпера.

Получение и настройка пользовательских заголовков

Чтобы продемонстрировать, как оптимизировать HTTP-заголовки, давайте сделаем запрос Python, предписывающий удалить книги из категории «Тайны» с фиктивного сайта электронной коммерции Books to Scrape. Перед этим вам необходимо получить HTTP-заголовки из инструментов разработчика вашего браузера.

Для начала зайдите на сайт в другой вкладке браузера:

Затем запустите инструменты разработчика в своем браузере. Один из способов сделать это — щелкнуть правой кнопкой мыши в любом месте страницы и выбрать Inspect или проверить подсписок инструментов. Затем нажмите на вкладку «Сеть» в верхнем меню инструментов разработчика:

Открыв вкладку «Сеть» , поставьте галочку рядом с пунктом «Отключить кэш». Это позволяет увидеть весь заголовок запроса. Затем нажмите на ссылку на категорию «Тайны» из списка категорий на сайте. Откроется страница с книгами этой категории, но, что более важно, на вкладке «Сеть» в окне инструментов разработчика появится список запросов:

Прокрутите список вверх и нажмите на первый элемент. Это откроет небольшое окно в инструментах разработчика. Перейдите к разделу «Заголовки запросов»:

В разделе «Заголовки запросов»вы найдете заголовки HTTP-запросов, особенно те, о которых вы только что узнали. Чтобы использовать эти заголовки с помощью скрейпера, создайте скрипт Python с переменными для заголовков User-AgentAcceptAccept-LanguageCookieи Referer :

import requests

referer = "https://books.toscrape.com/"
accept = "text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8"
accept_language = "en-GB,en;q=0.6"
cookie = "zero-chakra-ui-color-mode=light-zero; AMP_MKTG_8f1ede8e9c=JTdCJTIycmVmZXJyZXIlMjIlM0ElMjJodHRwcyUzQSUyRiUyRnd3dy5nb29nbGUuY29tJTJGJTIyJTJDJTIycmVmZXJyaW5nX2RvbWFpbiUyMiUzQSUyMnd3dy5nb29nbGUuY29tJTIyJTdE; AMP_8f1ede8e9c=JTdCJTIyZGV2aWNlSWQlMjIlM0ElMjI1MjgxOGYyNC05ZGQ3LTQ5OTAtYjcxMC01NTY0NzliMzAwZmYlMjIlMkMlMjJzZXNzaW9uSWQlMjIlM0ExNzA4MzgxNTQ4ODQzJTJDJTIyb3B0T3V0JTIyJTNBZmFsc2UlMkMlMjJsYXN0RXZlbnRUaW1lJTIyJTNBMTcwODM4MjE1NTQ2MCUyQyUyMmxhc3RFdmVudElkJTIyJTNBNiU3RA=="
user_agent = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/121.0.0.0 Safari/537.36"

custom_headers = {
    "User-Agent": user_agent,
    "Accept": accept,
    "Accept-Language": accept_language,
    "Cookie": cookie,
    "Referer": referer
}

В этом фрагменте кода вы импортируете библиотеку запросов и определяете переменные для каждого HTTP-заголовка в виде строк. Затем вы создаете словарь под названием headers для сопоставления имен HTTP-заголовков с определенными переменными.

Теперь добавьте в скрипт следующий код для отправки HTTP-запроса без настраиваемых заголовков и распечатайте результат:

URL = 'https://books.toscrape.com/catalogue/category/books/mystery_3/index.html'

r = requests.get(URL)
print(r.request.headers)

Здесь вы присваиваете переменной URL-адрес книг из категории «Тайны». Затем вы вызываете метод requests.get с этим URL-адресом в качестве единственного параметра и печатаете заголовки запроса.

Ваш результат должен выглядеть следующим образом:

{'User-Agent': 'python-requests/2.31.0', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive'}

Как видите, HTTP-заголовки по умолчанию, скорее всего, идентифицируют ваш скрейпер как бота. Обновите строку requests.get , передав функции дополнительный параметр:

r = requests.get(URL, headers=custom_headers)

Здесь вы передаете созданный вами словарь custom_header и параметр URL методу requests.get .

Ваш результат должен выглядеть следующим образом:

{'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/121.0.0.0 Safari/537.36', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8', 'Connection': 'keep-alive', 'Accept-Language': 'en-GB,en;q=0.6', 'Cookie': 'zero-chakra-ui-color-mode=light-zero; AMP_MKTG_8f1ede8e9c=JTdCJTIycmVmZXJyZXIlMjIlM0ElMjJodHRwcyUzQSUyRiUyRnd3dy5nb29nbGUuY29tJTJGJTIyJTJDJTIycmVmZXJyaW5nX2RvbWFpbiUyMiUzQSUyMnd3dy5nb29nbGUuY29tJTIyJTdE; AMP_8f1ede8e9c=JTdCJTIyZGV2aWNlSWQlMjIlM0ElMjI1MjgxOGYyNC05ZGQ3LTQ5OTAtYjcxMC01NTY0NzliMzAwZmYlMjIlMkMlMjJzZXNzaW9uSWQlMjIlM0ExNzA4MzgxNTQ4ODQzJTJDJTIyb3B0T3V0JTIyJTNBZmFsc2UlMkMlMjJsYXN0RXZlbnRUaW1lJTIyJTNBMTcwODM4MjE1NTQ2MCUyQyUyMmxhc3RFdmVudElkJTIyJTNBNiU3RA==', 'Referer': 'https://books.toscrape.com/'}

Здесь вы можете увидеть, что заголовки были обновлены с учетом информации, полученной из вашего браузера. Из-за этого любому веб-серверу сложнее обнаружить, что вы автоматически посещаете их сайты, что снижает вероятность блокировки.

Преимущества оптимизации заголовков

Правильная оптимизация HTTP-заголовков имеет решающее значение для обеспечения постоянного успеха операции скрейпинга.

Одним из преимуществ оптимизации является снижение частоты блокировок. Благодаря оптимизированным заголовкам взаимодействие ваших скрейперов с сайтами аналогично взаимодействию обычного пользователя. В результате вы можете обойти некоторые системы обнаружения ботов, что снизит вероятность блокировки вашего скрейпера со временем (частоту блокировок).

Еще одним преимуществом оптимизации HTTP-заголовков является повышение вероятности успеха, поскольку снижение частоты блокировок упрощает скрейпинг данных.

Кроме того, сосредоточение внимания на оптимизации HTTP-заголовков повышает эффективность операции скрейпинга. Это гарантирует получение релевантных данных, соответствующих вашим потребностям.

Советы по оптимизации заголовков

Хотя правильная настройка заголовка важна для обеспечения успеха ваших проектов по веб-скрейпингу, этим дело не заканчивается, особенно когда вам нужно собирать данные в больших масштабах. Ниже приведены несколько советов, как повысить вероятность успеха вашего скрейпера:

Чередуйте заголовки

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

В зависимости от масштаба операции скрейпинга вы можете использовать от десяти до сотен заголовков User-Agent. Чем больше запросов вам нужно отправить за короткое время, тем разумнее переключиться между большим количеством User-Agent.

Обновляйте заголовки

Еще одним соображением при оптимизации заголовков HTTP является регулярная актуализация заголовков. Пользователи обычно обновляют свои браузеры по мере выхода новых версий, поэтому есть большая вероятность, что действительные заголовки в любой момент времени будут соответствовать заголовкам последней версии браузера. Если вы укажете в заголовке один или несколько User-Agent, ссылающихся на устаревшие версии браузера или программного обеспечения, веб-серверы смогут выделить вас из толпы обычных пользователей и, возможно, заблокировать ваш запрос. То же самое относится и к другим заголовкам, требующим частого обновления.

Избегайте неправильных конфигураций заголовков

Вам также следует стараться избегать неправильных конфигураций заголовков. Это может произойти, если заголовок, такой как User-Agent, не совпадает со всеми другими стандартными заголовками, которые вы установили. Например, если User-Agent установлен в браузере Mozilla Firefox, работающем в Windows, а остальные заголовки определены для браузера Chromium, работающего в Windows, это, скорее всего, приведет к блокировке вашего скрейпера.

Кроме того, когда вы используете прокси-сервер , который выступает посредником между клиентом и сервером, вы можете непреднамеренно добавлять заголовки, позволяющие системе обнаружения на стороне браузера идентифицировать ваши запросы как автоматические. Чтобы проверить заголовки, отправьте тестовые запросы и убедитесь, что прокси-сервер не добавляет идентифицирующие заголовки.

Заключение

В этой статье вы узнали об HTTP-заголовках, включая заголовки User-AgentRefererAccept-Languageи Cookie , которые являются одними из самых важных заголовков для веб-скрейпинга. Необходимо оптимизировать HTTP-заголовки, чтобы обеспечить долговечность и полезность операции скрейпинга.

Правильное использование HTTP-заголовков для отправки запросов в ваших проектах по веб-скрейпингу снижает частоту блокировок и повышает вероятность успеха, упрощая преодоление механизмов защиты от скрейпинга. Это также повышает эффективность операции скрейпинга. Однако передовые механизмы защиты от скрейпинга, включающие проблемы JavaScript и капчи, все еще могут быть препятствием. Bright Data упрощает операции скрейпинга, предоставляя вам отмеченную наградами и удобную прокси-сеть , расширенный браузер для скрейпинга , комплексную ИСР для веб-скрейпера и Web Unlocker. Независимо от того, являетесь ли вы новичком или экспертом, эти продукты помогут вам достичь ваших целей в области скрейпинга. Начните использовать бесплатную пробную версию и ознакомьтесь с предложениями Bright Data уже сегодня.