CoderCastrov logo
CoderCastrov
Парсер

Парсинг списка отелей с Booking.com с использованием Python и BeautifulSoup

Парсинг списка отелей с Booking.com с использованием Python и BeautifulSoup
просмотров
3 мин чтение
#Парсер

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

Вот простой скрипт, который делает это. Мы будем использовать BeautifulSoup для извлечения информации, а также получим информацию об отелях на Booking.com.

Для начала, вот код, который нам нужен для получения страницы результатов поиска Booking.com и настройки BeautifulSoup для использования CSS-селекторов для запроса страницы с полезными данными.

# -*- coding: utf-8 -*-
from bs4 import BeautifulSoup
import requestsheaders = {'User-Agent':'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_2) AppleWebKit/601.3.9 (KHTML, like Gecko) Version/9.0.2 Safari/601.3.9'}
url = 'https://www.booking.com/searchresults.html?label=gen173nr-1FCAEoggI46AdIM1gEaGyIAQGYATG4AQfIAQzYAQHoAQH4AQKIAgGoAgO4AvTIm_IFwAIB;sid=7101b3fb6caa095b7b974488df1521d2;city=-2109472;from_idr=1&;dr_ps=IDR;ilp=1;d_dcp=1'response=requests.get(url,headers=headers)
soup=BeautifulSoup(response.content,'lxml')

Мы также передаем заголовки пользовательского агента, чтобы имитировать вызов браузера и избежать блокировки.

Теперь давайте проанализируем результаты поиска на Booking.com для нужного нам направления. Вот как это выглядит.

И когда мы проверяем страницу, мы видим, что каждый элемент HTML инкапсулирован в теге с классом sr_property_block.

Мы можем использовать это, чтобы разбить HTML-документ на эти карточки, которые содержат информацию об отдельных элементах, например, так:

# -*- coding: utf-8 -*-
from bs4 import BeautifulSoup
import requestsheaders = {'User-Agent':'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_2) AppleWebKit/601.3.9 (KHTML, like Gecko) Version/9.0.2 Safari/601.3.9'}
url = 'https://www.booking.com/searchresults.html?label=gen173nr-1FCAEoggI46AdIM1gEaGyIAQGYATG4AQfIAQzYAQHoAQH4AQKIAgGoAgO4AvTIm_IFwAIB&sid=eae1a774e77c394c5e69703d37e033a3&sb=1&src=searchresults&src_elem=sb&error_url=https://www.booking.com/searchresults.html?label=gen173nr-1FCAEoggI46AdIM1gEaGyIAQGYATG4AQfIAQzYAQHoAQH4AQKIAgGoAgO4AvTIm_IFwAIB;sid=eae1a774e77c394c5e69703d37e033a3;tmpl=searchresults;city=-2109472;class_interval=1;dest_id=-2109472;dest_type=city;dr_ps=IDR;dtdisc=0;from_idr=1;ilp=1;inac=0;index_postcard=0;label_click=undef;offset=0;postcard=0;room1=A%2CA;sb_price_type=total;shw_aparth=1;slp_r_match=0;srpvid=7df1609ef03a0103;ss_all=0;ssb=empty;sshis=0;top_ufis=1&;&sr_autoscroll=1&ss=Rishīkesh&is_ski_area=0&ssne=Rishīkesh&ssne_untouched=Rishīkesh&city=-2109472&checkin_year=2020&checkin_month=3&checkin_monthday=4&checkout_year=2020&checkout_month=3&checkout_monthday=5&group_adults=2&group_children=0&no_rooms=1&from_sf=1'response=requests.get(url,headers=headers)
soup=BeautifulSoup(response.content,'lxml')#print(soup.select('.a-carousel-card')[0].get_text())for item in soup.select('.sr_property_block'):
	try:
		print('----------------------------------------')		print('----------------------------------------')
	except Exception as e:
		#raise e
		print('')

И когда вы запускаете его...

python3 scrapeBooking.py

Вы можете увидеть, что код выделяет HTML-карточки.

При более детальном рассмотрении вы можете увидеть, что название отеля всегда имеет класс sr-hotel__name... Давайте также получим количество отзывов, цены и рейтинги.

for item in soup.select('.sr_property_block'):
	try:
		print('----------------------------------------')
		print(item.select('.sr-hotel__name')[0].get_text().strip())
		print(item.select('.hotel_name_link')[0]['href'])
		print(item.select('.bui-review-score__badge')[0].get_text().strip())
		print(item.select('.bui-review-score__text')[0].get_text().strip())
		print(item.select('.bui-review-score__title')[0].get_text().strip())
		print(item.select('.hotel_image')[0]['data-highres'])
 
		print(item.select('.bui-price-display__value')[0].get_text().strip())

Мы также попытались получить изображение и ссылку на отель, все важные данные.

Весь код выглядит следующим образом..

# -*- coding: utf-8 -*-
from bs4 import BeautifulSoup
import requestsheaders = {'User-Agent':'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_2) AppleWebKit/601.3.9 (KHTML, like Gecko) Version/9.0.2 Safari/601.3.9'}
url = 'https://www.booking.com/searchresults.html?label=gen173nr-1FCAEoggI46AdIM1gEaGyIAQGYATG4AQfIAQzYAQHoAQH4AQKIAgGoAgO4AvTIm_IFwAIB&sid=eae1a774e77c394c5e69703d37e033a3&sb=1&src=searchresults&src_elem=sb&error_url=https://www.booking.com/searchresults.html?label=gen173nr-1FCAEoggI46AdIM1gEaGyIAQGYATG4AQfIAQzYAQHoAQH4AQKIAgGoAgO4AvTIm_IFwAIB;sid=eae1a774e77c394c5e69703d37e033a3;tmpl=searchresults;city=-2109472;class_interval=1;dest_id=-2109472;dest_type=city;dr_ps=IDR;dtdisc=0;from_idr=1;ilp=1;inac=0;index_postcard=0;label_click=undef;offset=0;postcard=0;room1=A%2CA;sb_price_type=total;shw_aparth=1;slp_r_match=0;srpvid=7df1609ef03a0103;ss_all=0;ssb=empty;sshis=0;top_ufis=1&;&sr_autoscroll=1&ss=Rishīkesh&is_ski_area=0&ssne=Rishīkesh&ssne_untouched=Rishīkesh&city=-2109472&checkin_year=2020&checkin_month=3&checkin_monthday=4&checkout_year=2020&checkout_month=3&checkout_monthday=5&group_adults=2&group_children=0&no_rooms=1&from_sf=1'response=requests.get(url,headers=headers)
soup=BeautifulSoup(response.content,'lxml')#print(soup.select('.a-carousel-card')[0].get_text())for item in soup.select('.sr_property_block'):
	try:
		print('----------------------------------------')
		print(item.select('.sr-hotel__name')[0].get_text().strip())
		print(item.select('.hotel_name_link')[0]['href'])
		print(item.select('.bui-review-score__badge')[0].get_text().strip())
		print(item.select('.bui-review-score__text')[0].get_text().strip())
		print(item.select('.bui-review-score__title')[0].get_text().strip())
		print(item.select('.hotel_image')[0]['data-highres'])
 
		print(item.select('.bui-price-display__value')[0].get_text().strip())		print('----------------------------------------')
	except Exception as e:
		#raise e
		print('')

И при запуске.

Вы получаете всю необходимую информацию.

В более сложных реализациях вам даже потребуется периодически менять строку пользовательского агента, чтобы Booking.com не мог понять, что это один и тот же браузер!

Если мы становимся немного более продвинутыми, то понимаем, что Booking.com может просто заблокировать ваш IP-адрес, игнорируя все ваши другие трюки. Это обидно, и именно здесь большинство проектов парсинга веб-страниц терпят неудачу.

Преодоление блокировки IP-адреса

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

Плюс с 1000 бесплатными API-вызовами, предлагаемыми в акции, у вас почти нет риска использования нашего сервиса с ротацией прокси и сравнения результатов. Для интеграции достаточно одной строки кода, поэтому это практически незаметно.

Наш сервер с ротацией прокси Proxies API предоставляет простое API, которое мгновенно решает все проблемы блокировки IP-адреса.

  • С миллионами высокоскоростных прокси, расположенных по всему миру,
  • С нашей автоматической ротацией IP-адресов
  • С нашей автоматической ротацией строки пользовательского агента (которая имитирует запросы от разных действительных веб-браузеров и их версий)
  • С нашей автоматической технологией решения CAPTCHA,

Сотни наших клиентов успешно решили проблему блокировки IP-адреса с помощью простого API.

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

curl "http://api.proxiesapi.com/?key=API_KEY&url=https://example.com"

У нас есть акция, в рамках которой предоставляется 1000 бесплатных API-вызовов. Зарегистрируйтесь и получите свой бесплатный API-ключ здесь.

Оригинал блога был опубликован здесь: https://www.proxiesapi.com/blog/scraping-hotel-listings-from-booking-com-with-python.html.php