У цій статті демонструється методика збору даних із сайту 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.com!
Коментарі: 0