CoderCastrov logo
CoderCastrov
Airbnb

Парсинг объявлений на Airbnb с помощью Python и BeautifulSoup

Парсинг объявлений на Airbnb с помощью Python и BeautifulSoup
просмотров
3 мин чтение
#Airbnb

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

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

Для начала, вот код, который нам нужен, чтобы получить страницу результатов поиска Airbnb.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.airbnb.co.in/s/New-York--NY--United-States/homes?query=New York, NY, United States&checkin=2020-03-12&checkout=2020-03-19&adults=4&children=1&infants=0&guests=5&place_id=ChIJOwg_06VPwokRYv534QaPC8g&refinement_paths[]=/for_you&toddlers=0&source=mc_search_bar&search_type=unknown'response=requests.get(url,headers=headers)
soup=BeautifulSoup(response.content,'lxml')

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

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

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

Мы можем использовать это, чтобы разделить 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.airbnb.co.in/s/New-York--NY--United-States/homes?query=New York, NY, United States&checkin=2020-03-12&checkout=2020-03-19&adults=4&children=1&infants=0&guests=5&place_id=ChIJOwg_06VPwokRYv534QaPC8g&refinement_paths[]=/for_you&toddlers=0&source=mc_search_bar&search_type=unknown'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('[itemprop=itemListElement]'):
	try:
		print('----------------------------------------')
		print(item)
		print('----------------------------------------')
	except Exception as e:
		#raise e
		print('')

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

python3 scrapeAirbnb.py

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

При более детальном изучении вы можете увидеть, что название гостевого дома всегда имеет атрибут aria-label. Давайте попробуем получить его.

# -*- 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.airbnb.co.in/s/New-York--NY--United-States/homes?query=New York, NY, United States&checkin=2020-03-12&checkout=2020-03-19&adults=4&children=1&infants=0&guests=5&place_id=ChIJOwg_06VPwokRYv534QaPC8g&refinement_paths[]=/for_you&toddlers=0&source=mc_search_bar&search_type=unknown'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('[itemprop=itemListElement]'):
	try:
		print('----------------------------------------')
		print(item.select('a')[0]['aria-label'])
		#name = item.find("meta",  itemprop="name")
		print(name)		print('----------------------------------------')
	except Exception as e:
		#raise e
		print('')

Таким образом, мы получим названия.

Бинго!

Теперь давайте получим другие данные..

# -*- 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.airbnb.co.in/s/New-York--NY--United-States/homes?query=New York, NY, United States&checkin=2020-03-12&checkout=2020-03-19&adults=4&children=1&infants=0&guests=5&place_id=ChIJOwg_06VPwokRYv534QaPC8g&refinement_paths[]=/for_you&toddlers=0&source=mc_search_bar&search_type=unknown'response=requests.get(url,headers=headers)
soup=BeautifulSoup(response.content,'lxml')
for item in soup.select('[itemprop=itemListElement]'):
	try:
		print('----------------------------------------')
		print(item.select('a')[0]['aria-label'])
		print(item.select('a')[0]['href'])
		print(item.select('._krjbj')[0].get_text())
		print(item.select('._krjbj')[1].get_text())
		print(item.select('._16shi2n')[0].get_text())		print(item.select('._zkkcbwd')[0].get_text())
		print(name)		print('----------------------------------------')
	except Exception as e:
		#raise e
		print('')

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

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

В более сложных реализациях вам может потребоваться даже вращать строку User-Agent, чтобы Airbnb не мог определить, что это один и тот же браузер!

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

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

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

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

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

  • С миллионами высокоскоростных ротирующих прокси, расположенных по всему миру,
  • С нашей автоматической ротацией IP-адресов
  • С нашей автоматической ротацией строки User-Agent (которая имитирует запросы от разных действительных веб-браузеров и версий веб-браузеров)
  • С нашей автоматической технологией решения 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-listings-from-airbnb-with-python-and-beau.html.php