CoderCastrov logo
CoderCastrov
Парсер

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

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

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

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

Для начала, вот код, который нам нужен, чтобы получить страницу с результатами поиска на Realtor.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.11 (KHTML, like Gecko) Version/9.0.2 Safari/601.3.9',
'Accept-Encoding': 'identity'
}
#'Accept-Encoding': 'identity'url = 'https://www.realtor.com/realestateandhomes-search/San-Francisco_CA'response=requests.get(url,headers=headers)

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

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

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

Мы можем использовать это, чтобы разбить 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.11 (KHTML, like Gecko) Version/9.0.2 Safari/601.3.9',
'Accept-Encoding': 'identity'
}
#'Accept-Encoding': 'identity'url = 'https://www.realtor.com/realestateandhomes-search/San-Francisco_CA'response=requests.get(url,headers=headers)#print(response.content)soup=BeautifulSoup(response.content,'lxml')
for item in soup.select('.component_property-card'):
	try:
		print('**********')
		print(item)	except Exception as e:
		#raise e
		print('')

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

python3 scraperealtor.py

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

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

# -*- 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.11 (KHTML, like Gecko) Version/9.0.2 Safari/601.3.9',
'Accept-Encoding': 'identity'
}
#'Accept-Encoding': 'identity'url = 'https://www.realtor.com/realestateandhomes-search/San-Francisco_CA'response=requests.get(url,headers=headers)#print(response.content)soup=BeautifulSoup(response.content,'lxml')
for item in soup.select('.component_property-card'):
	try:
		print('**********')
		#print(item)
		print(item.select('[data-label=pc-price]')[0].get_text())		
	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.11 (KHTML, like Gecko) Version/9.0.2 Safari/601.3.9',
'Accept-Encoding': 'identity'
}
#'Accept-Encoding': 'identity'url = 'https://www.realtor.com/realestateandhomes-search/San-Francisco_CA'response=requests.get(url,headers=headers)#print(response.content)soup=BeautifulSoup(response.content,'lxml')
for item in soup.select('.component_property-card'):
	try:
		print('**********')
		#print(item)
		print(item.select('[data-label=pc-price]')[0].get_text())
		print(item.select('img')[0]['data-src'])
		print(item.select('.summary-wrap')[0].get_text())
		print(item.select('.address')[0].get_text())
		print(item.select('.property-meta')[0].get_text())
		print(item.select('.special-feature-list')[0].get_text())
		
	except Exception as e:
		#raise e
		print('')

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

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

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

Если мы становимся немного более продвинутыми, то вы поймете, что Realtor может просто заблокировать ваш 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-realtor-with-python-and-bea.html.php