В данной статье демонстрируется методика сбора данных с сайта Booking.com с использованием Python. Извлекаемая информация включает в себя, но не ограничивается, названиями отелей, рейтингами, ценами, адресами и описаниями местоположений. Предоставленный код позволяет получать данные со страниц отелей путем парсинга HTML-контента и извлечения встроенных JSON данных.
Перед запуском кода для скрапинга данных с Booking.com потребуется установить необходимые библиотеки Python:
Для установки необходимых библиотек можно воспользоваться pip:
pip install requests lxml
Это единственные внешние библиотеки, требуемые для работы; остальные (json, csv) уже включены в стандартную поставку Python.
При скрапинге данных с Booking.com важно разобраться в структуре веб-страницы и определить, какие данные необходимо извлекать. Каждая страница отеля на Booking.com содержит встроенные структурированные данные в формате JSON-LD, который облегчает извлечение таких деталей, как название, местоположение и ценообразование. Эти данные будут объектом скрапинга.
Так как Booking.com является динамичным сайтом и применяет меры борьбы с автоматизированными действиям, мы будем использовать соответствующие HTTP-заголовки и прокси для обеспечения бесперебойного скрапинга без риска блокировки.
Заголовки имитируют сессию пользователя в браузере и предотвращают обнаружение системами анти-скрапинга Booking.com. Без правильно настроенных заголовков сервер легко может идентифицировать автоматические скрипты, что может привести к блокировке IP или вызову капчи.
Для предотвращения блокировки механизмами анти-скрапинга Booking.com используется настройка заголовков для имитации действий реального пользователя, просматривающего сайт. Вот как можно отправить HTTP-запрос с правильно настроенными заголовками:
import requests
from lxml.html import fromstring
urls_list = ["https ссылки"]
for url in urls_list:
headers = {
'accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7',
'accept-language': 'en-IN,en;q=0.9',
'cache-control': 'no-cache',
'dnt': '1',
'pragma': 'no-cache',
'priority': 'u=0, i',
'sec-ch-ua': '"Chromium";v="130", "Google Chrome";v="130", "Not?A_Brand";v="99"',
'sec-ch-ua-mobile': '?0',
'sec-ch-ua-platform': '"Linux"',
'sec-fetch-dest': 'document',
'sec-fetch-mode': 'navigate',
'sec-fetch-site': 'none',
'sec-fetch-user': '?1',
'upgrade-insecure-requests': '1',
'user-agent': 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/130.0.0.0 Safari/537.36',
}
response = requests.get(url, headers=headers)
Использование прокси необходимо при скрапинге сайтов, таких как Booking.com, которые применяют строгие ограничения по частоте запросов или отслеживают IP-адреса. Прокси помогают распределять нагрузку запросов между различными IP-адресами, предотвращая блокировки. Для этих целей можно использовать как бесплатные прокси, так и платные прокси-сервисы с авторизацией по логину и паролю или IP-адресу. В нашем примере используется второй вариант.
proxies = {
'http': '',
'https': ''
}
response = requests.get(url, headers=headers, proxies=proxies)
После отправки запроса содержимое HTML анализируется с использованием библиотеки lxml для поиска встроенных данных JSON-LD, содержащих информацию об отелях. Этот этап позволяет извлечь структурированные данные со страницы, включая названия отелей, цены, местоположения и другие сведения.
parser = fromstring(response.text)
# Извлечение встроенных данных JSON
embeded_jsons = parser.xpath('//script[@type="application/ld+json"]/text()')
json_data = json.loads(embeded_jsons[0])
После парсинга данных JSON можно начать извлекать релевантные поля, такие как название отеля, адрес, рейтинг и ценовой диапазон. Ниже представлен код для извлечения информации об отеле из JSON:
name = json_data['name']
location = json_data['hasMap']
priceRange = json_data['priceRange']
description = json_data['description']
url = json_data['url']
ratingValue = json_data['aggregateRating']['ratingValue']
reviewCount = json_data['aggregateRating']['reviewCount']
type_ = json_data['@type']
postalCode = json_data['address']['postalCode']
addressLocality = json_data['address']['addressLocality']
addressCountry = json_data['address']['addressCountry']
addressRegion = json_data['address']['addressRegion']
streetAddress = json_data['address']['streetAddress']
image_url = json_data['image']
room_types = parser.xpath("//a[contains(@href, '#RD')]/span/text()")
# Добавление данных в список all_data
all_data.append({
"Name": name,
"Location": location,
"Price Range": priceRange,
"Rating": ratingValue,
"Review Count": reviewCount,
"Type": type_,
"Postal Code": postalCode,
"Address Locality": addressLocality,
"Country": addressCountry,
"Region": addressRegion,
"Street Address": streetAddress,
"URL": url,
"Image URL": image_url,
"Room Types": room_types
})
После извлечения данных их можно сохранить в файл CSV для дальнейшего анализа.
# После обработки всех URL, запись данных в файл CSV
with open('booking_data.csv', 'w', newline='') as csvfile:
fieldnames = ["Name", "Location", "Price Range", "Rating", "Review Count", "Type", "Postal Code",
"Address Locality", "Country", "Region", "Street Address", "URL", "Image URL", "Room Types"]
writer = csv.DictWriter(csvfile, fieldnames=fieldnames)
# Запись заголовков
writer.writeheader()
# Запись строк данных
writer.writerows(all_data)
import requests
from lxml.html import fromstring
import json
import csv
# Список URL-адресов отелей для скрапинга
urls_list = [
"Https ссылка",
"Https ссылка"
]
# Инициализация пустого списка для хранения всех извлеченных данных
all_data = []
proxies = {
'http': ''
}
# Цикл по каждому URL для извлечения данных
for url in urls_list:
headers = {
'accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7',
'accept-language': 'en-IN,en;q=0.9',
'cache-control': 'no-cache',
'dnt': '1',
'pragma': 'no-cache',
'priority': 'u=0, i',
'sec-ch-ua': '"Chromium";v="130", "Google Chrome";v="130", "Not?A_Brand";v="99"',
'sec-ch-ua-mobile': '?0',
'sec-ch-ua-platform': '"Linux"',
'sec-fetch-dest': 'document',
'sec-fetch-mode': 'navigate',
'sec-fetch-site': 'none',
'sec-fetch-user': '?1',
'upgrade-insecure-requests': '1',
'user-agent': 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/130.0.0.0 Safari/537.36',
}
# Отправка запроса на сайт
response = requests.get(url, headers=headers, proxies=proxies)
# Парсинг HTML содержимого
parser = fromstring(response.text)
# Извлечение встроенных данных JSON
embeded_jsons = parser.xpath('//script[@type="application/ld+json"]/text()')
json_data = json.loads(embeded_jsons[0])
# Извлечение данных об отеле из JSON
name = json_data['name']
location = json_data['hasMap']
priceRange = json_data['priceRange']
description = json_data['description']
url = json_data['url']
ratingValue = json_data['aggregateRating']['ratingValue']
reviewCount = json_data['aggregateRating']['reviewCount']
type_ = json_data['@type']
postalCode = json_data['address']['postalCode']
addressLocality = json_data['address']['addressLocality']
addressCountry = json_data['address']['addressCountry']
addressRegion = json_data['address']['addressRegion']
streetAddress = json_data['address']['streetAddress']
image_url = json_data['image']
room_types = parser.xpath("//a[contains(@href, '#RD')]/span/text()")
# Добавление извлеченных данных в список all_data
all_data.append({
"Name": name,
"Location": location,
"Price Range": priceRange,
"Rating": ratingValue,
"Review Count": reviewCount,
"Type": type_,
"Postal Code": postalCode,
"Address Locality": addressLocality,
"Country": addressCountry,
"Region": addressRegion,
"Street Address": streetAddress,
"URL": url,
"Image URL": image_url,
"Room Types": room_types
})
# После обработки всех URL, запись данных в файл CSV
with open('booking_data.csv', 'w', newline='') as csvfile:
fieldnames = ["Name", "Location", "Price Range", "Rating", "Review Count", "Type", "Postal Code",
"Address Locality", "Country", "Region", "Street Address", "URL", "Image URL", "Room Types"]
writer = csv.DictWriter(csvfile, fieldnames=fieldnames)
# Запись заголовка
writer.writeheader()
# Запись строк данных
writer.writerows(all_data)
print("Data successfully saved to booking_data.csv")
В заключение, в статье подчеркнута важность использования соответствующих HTTP-заголовков и прокси для успешного обхода систем анти-скрапинга. Извлеченная информация может быть сохранена в формате CSV для последующего анализа. Помните о необходимости соблюдения условий использования веб-сайтов, чтобы избежать возможных нарушений при проведении скрапинга.
Мы получили вашу заявку!
Ответ будет отправлен на почту в ближайшее время.
С уважением proxy-seller.io!
Комментарии: 0