Контекст, будь то культурный, экологический или реляционный, присутствует во всех коммуникациях и влияет на эффективность коммуникаций. В веб-коммуникациях HTTP-заголовки представляют собой технический контекст, которым веб-серверы и клиенты обмениваются при отправке HTTP-запросов или получении HTTP-ответов. Этот контекст можно использовать для упрощения аутентификации, определения поведения кэширования или управления состоянием сеанса. Это также помогает веб-серверам определить источник HTTP-запроса и способ ответа на него. Этот ответ может включать рендеринг сайта в соответствии с требованиями вашего клиентского устройства или доставку вам данных. Когда последняя выполняется с помощью бота, эта операция называется веб-скрейпингом, что удобно, когда вам нужно автоматически получать данные с сайта.
При создании скрейпера легко не обращать внимания на настройку HTTP-заголовка, поскольку значения по умолчанию позволяют выполнять запросы. Однако без правильно настроенных HTTP-заголовков трудно поддерживать непрерывную связь между скрейпером и веб-сервером. Это связано с тем, что веб-серверы можно настроить на обнаружение ботов и автоматических скриптов на основе информации в HTTP-заголовках по умолчанию, таких как User-Agent
, Referer
и 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-Agent
, Accept
, Accept-Language
и Referer
, вы сможете эффективно имитировать обычный веб-трафик и затруднить веб-серверу идентификацию вашего бота как скрейпера.
Получение и настройка пользовательских заголовков
Чтобы продемонстрировать, как оптимизировать HTTP-заголовки, давайте сделаем запрос Python, предписывающий удалить книги из категории «Тайны» с фиктивного сайта электронной коммерции Books to Scrape. Перед этим вам необходимо получить HTTP-заголовки из инструментов разработчика вашего браузера.
Для начала зайдите на сайт в другой вкладке браузера:
Затем запустите инструменты разработчика в своем браузере. Один из способов сделать это — щелкнуть правой кнопкой мыши в любом месте страницы и выбрать Inspect или проверить подсписок инструментов. Затем нажмите на вкладку «Сеть» в верхнем меню инструментов разработчика:
Открыв вкладку «Сеть» , поставьте галочку рядом с пунктом «Отключить кэш». Это позволяет увидеть весь заголовок запроса. Затем нажмите на ссылку на категорию «Тайны» из списка категорий на сайте. Откроется страница с книгами этой категории, но, что более важно, на вкладке «Сеть» в окне инструментов разработчика появится список запросов:
Прокрутите список вверх и нажмите на первый элемент. Это откроет небольшое окно в инструментах разработчика. Перейдите к разделу «Заголовки запросов»:
В разделе «Заголовки запросов»вы найдете заголовки HTTP-запросов, особенно те, о которых вы только что узнали. Чтобы использовать эти заголовки с помощью скрейпера, создайте скрипт Python с переменными для заголовков User-Agent
, Accept
, Accept-Language
, Cookie
и 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-Agent
, Referer
, Accept-Language
и Cookie
, которые являются одними из самых важных заголовков для веб-скрейпинга. Необходимо оптимизировать HTTP-заголовки, чтобы обеспечить долговечность и полезность операции скрейпинга.
Правильное использование HTTP-заголовков для отправки запросов в ваших проектах по веб-скрейпингу снижает частоту блокировок и повышает вероятность успеха, упрощая преодоление механизмов защиты от скрейпинга. Это также повышает эффективность операции скрейпинга. Однако передовые механизмы защиты от скрейпинга, включающие проблемы JavaScript и капчи, все еще могут быть препятствием. Bright Data упрощает операции скрейпинга, предоставляя вам отмеченную наградами и удобную прокси-сеть , расширенный браузер для скрейпинга , комплексную ИСР для веб-скрейпера и Web Unlocker. Независимо от того, являетесь ли вы новичком или экспертом, эти продукты помогут вам достичь ваших целей в области скрейпинга. Начните использовать бесплатную пробную версию и ознакомьтесь с предложениями Bright Data уже сегодня.