Как парсить рынок недвижимости
Краткое руководство для начинающих на Python
Торонто известен своим безумным рынком недвижимости. С каждым днем все сложнее найти доступное и удобное место. Поиск "Как найти квартиру в Торонто" в Google приводит к десяткам страниц с советами, что является хорошим показателем того, что поиск квартиры - это мучительный процесс.
Как стажер-дата-саентист, я был уверен, что могу немного облегчить эту боль и упростить способ поиска жилья. Проект, который я придумал, направлен на выявление связей между ценой квартиры в Грэйтер Торонто (GTA), ее местоположением, площадью и количеством спален. Бизнес-идея этого проекта заключается в помощи искателям квартир в поиске лучшего предложения в разных районах GTA.
Для проведения этого проекта я решил использовать популярный веб-сайт Craiglist. Моя идея заключалась в извлечении данных с веб-сайта с помощью инструмента для парсинга веб-страниц на Python (версия 3.7.4) под названием Beautiful Soup.
Пять трендов в области Data Science и Machine Learning, которые определят перспективы работы в 2020 году | Data Driven...
Data Science и ML были одними из самых обсуждаемых трендов в 2019 году и, без сомнения, они продолжат...
Чтобы все оставались здесь внимательными, я разделил этот проект на две части: первая часть - это парсинг веб-сайта и создание таблицы данных, а вторая часть сосредоточена на анализе и прогнозах [скоро будет готово...].
Итак, что я могу извлечь из Craiglist?
Объявления о квартирах на Craigslist для Торонто находятся по адресу https://toronto.craigslist.org/d/apts-housing-for-rent/search/apa
Для начала мне нужно было получить URL веб-сайта. Чтобы сделать его более чистым, я отфильтровал объявления без фотографий, чтобы немного сузить поиск. Хотя это не "настоящий" базовый URL, он все равно подходит для наших целей здесь.
Затем я создал свой план действий в четыре шага:
· Понять данные
· Собрать данные
· Создать набор данных
· Очистить набор данных
Прежде чем приступить к каждому шагу, в этом проекте я использовал несколько пакетов Python, но расскажу только о наиболее важных. Конечно, Beautiful Soup из bs4, который является модулем для разбора HTML-кода веб-страницы, полученного с сервера. Я быстро проверил тип и длину этого элемента, чтобы убедиться, что он соответствует количеству объявлений на странице (по умолчанию 120 объявлений на странице).
Если вам интересны подробности, вот список пакетов, необходимых для этого проекта:
Понимание данных (веб-сайт)
Я использовал модуль get из пакета requests в Python. Я определил переменную response и присвоил ей метод get, вызванный на базовом URL. Что я имею в виду под "базовым URL" - это URL на первой странице, с которой вы хотите получить данные.
Типичное объявление на Craigslist, полезное для подтверждения четырех полей данных: цена, площадь, местоположение, количество спален. Источник: Автор
Затем, чтобы правильно выполнить парсинг, мне нужно было понять, как организован веб-сайт. Для этого я выполнил базовый поиск на Craiglist и открыл HTML-код. Просмотрев скриншот ниже, вы увидите справа <li class="result-row">
. Это тег, который нужно найти для каждого отдельного объявления; это блок, который содержит все элементы, которые мне нужны!
Сбор данных
Для проведения начального быстрого теста я работал следующим образом: я получил первое объявление и все переменные, которые я хотел из него, и убедился, что я знаю, как получить доступ к каждой из них, прежде чем пройти по всей странице. Таким же образом я убедился, что я могу успешно спарсить одну страницу, прежде чем добавить цикл, который проходит через все страницы.
Как выглядит цикл, который я разработал для извлечения данных? Вот подробности цикла "for", который я использовал в своем проекте:
· Для каждой страницы в pages: - Если страница возвращает код состояния, отличный от 200, отправить предупреждение
· Для объявления в объявлениях: - Если информация о районе не отсутствует: - Добавить дату-время размещения объявления в список дат-времени - Добавить район объявления в список районов - Добавить заголовок объявления в список заголовков объявлений - Добавить ссылку на объявление в список ссылок - Добавить очищенную цену объявления в список цен - Добавить площадь в список площадей - Добавить количество спален в список спален
Не стесняйтесь получить полный код на GitHub, нажав здесь.
Я также включил некоторые шаги по очистке данных в цикле, такие как извлечение атрибута 'DateTime' и удаление 'ft2' из переменной площади в квадратных футах и преобразование этого значения в целое число. Кроме того, я удалил 'br' из количества спален, так как это также было спарсено.
С этими дополнительными шагами я начал очистку данных с уже выполненной работой, что всегда хорошо, не так ли?
Создание набора данных
После извлечения данных с помощью вышеуказанного цикла я сохранил данные в таблицу данных. Затем я отфильтровал таблицу данных следующими столбцами: Дата размещения, Район, Заголовок объявления, URL, Цена, Площадь, Количество спален.
Очистка набора данных
Затем мне нужно было дополнительно очистить набор данных, изменив класс некоторых объектов и удалив другие. Вот дополнительные шаги, необходимые для этого:
· Преобразовал строку DateTime в объект DateTime.
· Удалил символ $ и преобразовал Цену в целое число.
· Преобразовал Количество спален в класс float.
· Удалил () из столбца Район.
· Изменил отсутствующие значения в Цене и Площади на тип NaN и удалил их.
Удивительно, но после всех этих операций очистки я получил 101 строку, и только 53 строки с значениями для площади. Это не идеальный размер выборки, который мы бы хотели, но посмотрим, что мы можем получить из этого.
Теперь, когда набор данных готов к анализу.