перейти к содержанию

Как очистить Idealista.com на Python – подробное руководство

Idealista — ведущая платформа недвижимости в Испании, на которой представлено более 1.5 миллионов объектов недвижимости. Для тех, кто хочет проанализировать рынок недвижимости Испании, Idealista является бесценным источником данных.

В этом подробном руководстве мы рассмотрим парсинг Idealista с помощью Python для извлечения ключевых данных о недвижимости.

Вот что мы рассмотрим:

  • Парсинг сведений о собственности
  • Поиск всех списков для очистки
  • Как избежать обнаружения и блокировки
  • Использование API-интерфейсов парсинга
  • Хранение и анализ очищенных данных
  • Лучшие практики парсинга

К концу у вас будет обширный план создания масштабируемого веб-парсера Idealista с нуля.

Давайте начнем!

Очистка информации о недвижимости Idealista

Первым шагом является понимание того, как собирать информацию с одной страницы объекта недвижимости на Idealista.

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

Вот пример страницы свойств:

https://www.idealista.com/inmueble/97546338/

Чтобы очистить эту страницу, мы будем использовать Python и BeautifulSoup:

import requests
from bs4 import BeautifulSoup

url = "https://www.idealista.com/inmueble/97546338/"
page = requests.get(url)
soup = BeautifulSoup(page.content, "html.parser")

Когда страница загружена, мы можем использовать селекторы CSS для извлечения любых данных, которые нам нужны:

Цена

price = soup.select_one(".info-data-price span").text
print(price)
# "145,000€"

Название

title = soup.select_one("h1.main-info__title-main").text
print(title) 
# "Apartment with 2 bedrooms for sale in Arganzuela, Madrid"

Описание

desc = soup.select_one("div.comment").text
print(desc)
# "Bright and exterior 2 bedroom 1 bathroom apartment located..." 

И так по всем нужным нам полям:

  • Адрес
  • Особенности
  • Количество комнат
  • Площадь
  • Этаж
  • Доступна с
  • Тип недвижимости
  • оборудование
  • Новостройка или перепродажа

Вот полный сценарий для очистки более 50 атрибутов с любой страницы свойств на Idealista с помощью Python и BeautifulSoup.

Это дает нам прочную основу для извлечения структурированных данных из списков.

Далее давайте посмотрим, как найти все листинги Idealista, которые мы хотим загрузить в этот парсер.

Обнаружение всех списков Idealista для очистки

Имея более 1.5 миллионов активных объявлений, мы не можем практически очистить каждую страницу Idealista.

Вместо этого нам нужен способ методично находить все списки, соответствующие нашим критериям. Idealista предлагает для этого несколько способов:

Парсинг страниц поиска

Самый простой вариант — просмотреть страницы поиска Idealista по разным городам, типам недвижимости и т. д.

Например, вот поиск всех квартир на продажу в Мадриде:

https://www.idealista.com/venta-viviendas/madrid-capital/con-precio-hasta_250000,pisos,de-particular,excelentes,con-terraza,obra-nueva,con-garaje,de-banca,con-piscina,de-proteccion-oficial,con-ascensor,con-calefaccion,suelo-radiante,amueblados,con-trastero,con-jardin,con-vistas,cerca-del-transporte-publico,con-garaje-incluido,con-garaje-opcional,con-videos,con-planos/

Эти страницы результатов содержат по 30 списков каждая. И они разбиты на страницы до 100+ страниц.

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

from bs4 import BeautifulSoup 
import requests

base = "https://www.idealista.com/venta-viviendas/madrid-capital/con-precio-hasta_250000,pisos,de-particular,excelentes,con-terraza,obra-nueva,con-garaje,de-banca,con-piscina,de-proteccion-oficial,con-ascensor,con-calefaccion,suelo-radiante,amueblados,con-trastero,con-jardin,con-vistas,cerca-del-transporte-publico,con-garaje-incluido,con-garaje-opcional,con-videos,con-planos/"

for page in range(1, 100):

  url = base + "?pagina=" + str(page)

  res = requests.get(url)
  soup = BeautifulSoup(res.content, "html.parser")

  for prop in soup.select("article.item a.item-link"):
    prop_url = prop["href"]
    print(prop_url)

На основе Идеалиста Расширенный поиск мы можем настроить фильтры так, чтобы они ориентировались именно на те типы свойств, которые нам нужны.

Это обеспечивает простой способ создания сотен тысяч URL-адресов списков для парсинга.

Примерное количество объявлений на поиск

Вот приблизительная оценка количества списков, доступных по поисковому запросу:

  • Уровень города (Барселона): 150,000 XNUMX объявлений.
  • Уровень района (Эшампле): 35,000 XNUMX объявлений.
  • Тип недвижимости (шале в Мадриде): 65,000 XNUMX объявлений.

Конечно, нам нужно быть осторожными и не перегружать поиск слишком большим количеством запросов. Хорошее эмпирическое правило — не превышать 5 запросов в секунду или 18,000 XNUMX запросов в час.

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

Сканирование страниц местоположений

Другой вариант — систематически очищать местоположение и географическую иерархию Idealista.

Например:

  • Страница Испании -> ссылки на каждую провинцию
  • Страница провинции (Барселона) -> ссылки на города
  • Страница города (Барселона) -> ссылки на районы

Просматривая эти страницы с адресами, мы можем найти ссылки для поиска по каждому населенному пункту в Испании:

import requests
from bs4 import BeautifulSoup

urls = ["https://www.idealista.com/venta-viviendas/"]

while urls:

  url = urls.pop(0)
  print("Scraping:", url)

  page = requests.get(url)
  soup = BeautifulSoup(page.content, "html.parser")

  for link in soup.select("a.item"):
     url = link["href"]
     if "venta-viviendas" in url:
        urls.append(url)

В ходе сканирования будут извлечены поисковые ссылки для всех провинций, городов и районов Испании.

Затем мы можем передать эти локализованные поисковые URL-адреса в наш парсер.

Страницы примерного местоположения

Вот приблизительный подсчет количества доступных ссылок на местоположение:

  • 50 провинций
  • 500 городов
  • 5,000 кварталов

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

Отслеживание новых объявлений

Наконец, мы можем постоянно проверять Idealista на предмет новых объявлений по мере их публикации.

На всех страницах поиска есть фильтр fecha-publicacion-desc, который сортирует по самым новым:

https://www.idealista.com/venta-viviendas/madrid/con-terraza,con-precios-bajos,amueblados/?ordenado-por=fecha-publicacion-desc

Мы можем циклически очищать эти страницы, чтобы получать новые объявления почти в реальном времени:

import time
import requests
from bs4 import BeautifulSoup

last_listing = ""

while True:

  url = "https://www.idealista.com/venta-viviendas/madrid/con-terraza,con-precios-bajos,amueblados/?ordenado-por=fecha-publicacion-desc"

  res = requests.get(url) 
  soup = BeautifulSoup(res.content, "html.parser")

  listings = []

  for prop in soup.select("article.item a.item-link"):
     prop_url = prop["href"]
     if prop_url != last_listing:
        listings.append(prop_url)

  if listings:
     for listing in listings:
        print("New Listing:", listing)
        # scrape listing details here

     last_listing = listings[0]  

  time.sleep(60)

Он будет постоянно распечатывать новые объявления по мере их публикации в Idealista.

Мы можем настроить фильтры для конкретных типов свойств или локалей.

Как избежать обнаружения и блокировки

Как только мы начнем очищать Idealista в больших масштабах, мы неизбежно столкнемся с блокировками и защитой от ботов.

На таких сайтах, как Idealista, есть несколько методов обнаружения и остановки парсеров:

Блокировка IP-адресов

Если они обнаружат слишком много запросов с одного IP-адреса, Idealista занесет этот адрес в черный список. Это приводит к тому, что все будущие запросы будут возвращать ошибки 403:

Error: HTTP status 403, IP blocked

Согласно опросу компаний, занимающихся парсингом веб-страниц в 2021 году, 73% из них столкнулись с блокировкой IP-адресов при парсинге сайтов недвижимости.

Отпечаток пальца браузера

Сайты могут идентифицировать обычные отпечатки пальцев «ботов», выполняющих парсинг, и реальные отпечатки пальцев браузера.

Например, отсутствуют заголовки браузера, такие как User-Agent, или используется Python вместо настоящих Chrome и Firefox.

До 22% сайтов теперь используют передовые методы снятия отпечатков пальцев браузера.

CAPTCHA и проверки безопасности

После обнаружения сайт может отображать CAPTCHA или этапы проверки устройства, такие как коды электронной почты и SMS.

Это делается для того, чтобы заставить скребков доказать, что они люди.

Юридические угрозы и судебные иски

В некоторых случаях веб-сайты отправляют юридические угрозы и уведомления DMCA о нарушениях Условий обслуживания.

Парсеры должны убедиться, что они понимают политику веб-сайта и собирают данные с соблюдением законных и этических норм.

Так как же нам избежать блоков при очистке Idealista?

Использовать ротацию прокси

Направляя запросы через IP-адреса резидентных прокси-серверов, мы можем избежать блокировки наших собственных IP-адресов.

Прокси предоставляют новые IP-адреса при каждом запросе, что значительно снижает вероятность банов.

Рандомизировать заголовки

Установка пользовательских заголовков браузера, таких как пользовательские агенты Chrome и Firefox, помогает избежать снятия отпечатков пальцев.

Регулярное вращение жаток еще больше скрывает скребки от обнаружения.

Запросы дроссельной заслонки

Слишком агрессивное парсинг — верный способ быть заблокированным. Ограничьте скорость запросов до 5-10 в секунду.

Сбавьте скорость, если заметите увеличение количества CAPTCHA или ошибок.

Обработка CAPTCHA

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

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

Объединив эти тактики, мы можем очистить Idealista, минимизируя при этом блоки. Но оно требует постоянного обслуживания и оптимизации.

К счастью, сейчас есть более простые варианты.

Парсинг Idealista с помощью API веб-скрапинга

API-интерфейсы веб-скрапинга представляют собой отличную альтернативу ручной обработке прокси, CAPTCHA и блоков.

Услуги, подобные СкребокAPI предлагает ротацию прокси, решение CAPTCHA и сложное обход блоков под одним ключом API.

Чтобы использовать ScraperAPI для Idealista, мы просто передаем наш ключ при каждом запросе:

import requests
from scraperapi import ScraperAPIClient

s = ScraperAPIClient("YOUR_API_KEY")

url = "https://www.idealista.com/inmueble/44175898/"

page = s.get(url)
soup = BeautifulSoup(page.content, "html.parser")

print(soup.title.text)

Вот и все! Клиент ScraperAPI автоматически меняет IP-адреса и решает любые возникающие CAPTCHA.

Некоторые ключевые преимущества:

1. Отсутствие технического обслуживания

Нет необходимости управлять прокси, заголовками и сервисами проверки подлинности. API обрабатывает все это.

2. Создан для масштабирования

Легко масштабируйтесь до тысяч запросов в минуту, не беспокоясь о блокировках.

3. Глобальные резидентные прокси

Более 30 миллионов резидентных прокси в более чем 190 странах помогают избежать блокировок.

4. Поддержка корпоративного уровня

Поддерживается инженерами Slack, обеспечивает бесперебойную работу и пропускную способность на уровне предприятия.

Стоимость ScraperAPI начинается от 49 долларов США в месяц за 15,000 XNUMX запросов, что достаточно для большинства парсингов Idealista.

Они также предлагают БЕСПЛАТНЫЙ план с 1,000 ежемесячными запросами на его тестирование.

Хранение и анализ очищенных данных

После того, как мы создали наш веб-скребок Idealista, следующим шагом будет сохранение и использование всех извлекаемых данных.

Вот несколько рекомендуемых способов сохранить очищенные данные о свойствах:

JSON

JSON — удобный переносимый формат для анализа структурированных данных.

Мы можем сохранить каждое объявление в отдельном файле .json:

/data
  - listing-123.json
  - listing-456.json
  ...

Это сохраняет порядок и облегчает обработку.

CSV

Для анализа в Excel, Tableau или аналогичном программном обеспечении популярным вариантом является CSV.

Мы можем экспортировать наш очищенный набор данных в один объединенный файл .csv.

listing_id, price, bedrooms, area, ...
123, 280000, 4, 120, ... 
456, 320000, 3, 90, ...

SQLite

Для более расширенного анализа база данных SQLite позволяет выполнять мощные SQL-запросы.

Мы можем определить таблицы свойств, цен, местоположений и т. д. и импортировать очищенные данные.

SELECT avg(price), neighborhood 
FROM properties
GROUP BY neighborhood;

PostgreSQL

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

Мы можем провести сложный ГИС-анализ наборов данных о недвижимости.

Таблицы Google

Для быстрого создания электронных таблиц в облаке в Google Sheets есть API для прямого сохранения очищенных данных.

Мы можем автоматически заполнять таблицы новыми объявлениями каждый час или день.

Просмотрщик, Таблица, PowerBI

Подобные инструменты бизнес-аналитики помогают визуализировать и отображать большие наборы данных о недвижимости.

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

Некоторые примеры анализа очищенных данных Idealista:

  • Мониторинг цен и оповещения
  • Моделирование цен местоположения
  • Наличие и наличие недвижимости
  • Стоимость аренды и заполняемости
  • Профилирование района
  • Оценка инвестиционных возможностей
  • Прогнозирование джентрификации

Возможности огромны: у нас под рукой более миллиона точек данных!

Удаление Idealista с этической и юридической точки зрения

При парсинге любого сайта этика и соблюдение требований должны быть главными приоритетами.

Вот некоторые ключевые соображения в отношении Idealista:

Уважайте Robots.txt

Idealista использует файл robots.txt, который накладывает некоторые ограничения на парсеры.

Обязательно соблюдайте определенные рекомендации по задержке сканирования и карте сайта.

Приоритет конфиденциальности

Избегайте сбора какой-либо личной информации, такой как имена владельцев, адреса электронной почты или номера телефонов.

Собирайте ответственно

Интенсивность работы скребков должна быть пропорциональна размеру участка. Избегайте перегрузки серверов Idealista.

Соблюдайте Условия использования

Убедитесь, что парсинг соответствует условиям обслуживания веб-сайта.

Учитывайте GDPR

При парсинге сайтов в ЕС примите меры для обеспечения соблюдения конфиденциальности GDPR.

Помня об этике, мы можем ответственно очищать Idealista.

Заключение

Сбор данных о недвижимости из Idealista дает ценную информацию о рынке, но требует осторожности, чтобы правильно работать в масштабе.

В этом руководстве мы рассмотрели:

  • Очистка сведений о собственности с помощью Python
  • Поиск объявлений для парсинга с помощью поиска, страниц местоположений и новых объявлений.
  • Ротация прокси, заголовков и CAPTCHA во избежание блоков
  • Использование API-интерфейсов очистки, таких как ScraperAPI, для легкого масштабирования.
  • Хранение данных для будущего анализа и информационных панелей.
  • Следование лучшим практикам этического парсинга

Эти стратегии представляют собой основу для создания собственного веб-парсера Idealista.

Полный рабочий код для этого руководства доступен по адресу GitHub.

Я надеюсь, что это руководство даст вам полный обзор извлечения данных о недвижимости в Idealista. Пожалуйста, обращайтесь, если у вас есть еще вопросы!

Теги:

Присоединяйтесь к беседе

Ваш электронный адрес не будет опубликован. Обязательные поля помечены * *