Объяснение вложенных пауков в Scrapy с использованием веб-сайта Airbnb | Парсинг с 🐍
Table Of Content
Парсинг - это искусство сбора данных в Интернете. Иногда вам может потребоваться получить глубокую информацию с веб-сайтов. Для этого вы будете использовать вложенные пауки. Давайте посмотрим, как это работает!
Эта статья является частью серии "Парсинг с использованием Python 🐍", где я намерен представить и обучить основным и более опытным концепциям парсинга.
"Первое правило веб-парсинга - не наносить вред веб-сайту. Второе правило веб-парсинга - НЕ наносить вред веб-сайту." - от Zite
Введение
Недавно мы провели практическое применение парсинга на сайте Airbnb. Мы выбрали город, даты и диапазон цен, чтобы собрать основную информацию о объявлениях. Сегодня давайте разберем процесс, как углубиться и перейти по разным типам URL-адресов в рамках одного процесса парсинга.
Ранее, переходя со страницы поиска на страницу поиска, мы смогли получить информацию о тысячах объявлений на Airbnb, такую как название, тип комнаты, URL, цена, рейтинг, количество комментариев, количество гостей, изображение, информацию о "суперхосте" и все другие характеристики, которые можно найти на главной странице.
Но что, если вам нужно узнать больше? Если вам нужно описание отеля для вашего NLP-проекта, дополнительные фотографии, подробности о плате и правилах дома?
Вам нужно будет перейти по ссылке и открыть новый тип страницы. Вместо страницы поиска вы захотите сосредоточиться на странице комнат.
То, что я обычно называю вложенными пауками, лучше назвать вложенными парсерами, потому что мы теперь будем использовать несколько методов парсинга в одном классе паука. Первый парсер, который знает, как работать со страницами поиска, найдет URL-адреса страниц комнат и отправит их во второй парсер.
Классический парсер
Для этого вы измените фокус вашего алгоритма парсинга. В то время как раньше вы собирали данные из вашей функции parse
и вызывали ее рекурсивно для всех страниц поиска благодаря ссылке на следующую страницу.
Вложенный парсер
Теперь вы будете использовать функцию парсинга только для поиска URL-адресов отелей, чтобы перейти по ним.
И, используя второй обратный вызов, вы будете парсить конечную страницу. Обратите внимание, что мы используем обратный вызов parse_hotel
для перехода по ссылкам, но все еще используем обратный вызов parse
, когда мы хотим перейти от страницы поиска к страницам поиска.
И все! Довольно просто, не так ли?
Предупреждение: поскольку Scrapy является асинхронной системой скрапинга, все страницы не будут собраны в том же порядке, в котором вы строго делали бы это! Это ничего не меняет в итоговом результате (пока вы получаете данные), но всегда хорошо знать 😉
Чтобы следить за процессом скрапинга, я обычно добавляю конструктор в свой паук, чтобы создать атрибуты nb_page
и nb_items
в моем классе. Затем каждый раз, когда вызывается один из обратных вызовов, я увеличиваю эти значения и, при необходимости, регистрирую их с URL-адресом страницы или названием элемента.
Дополнительные советы
- При выполнении вложенного парсинга вы будете открывать гораздо больше веб-страниц. Поэтому будьте вежливыми, используйте файл настроек, чтобы уменьшить количество одновременных запросов и их частоту, чтобы избежать перегрузки сервера цели.
- Использование большего количества веб-страниц также означает вызывать больше подозрений! Уменьшение количества запросов также поможет избежать блокировки и бана до окончания сбора данных.
- В некоторых случаях вы можете даже представить себе третий уровень парсинга. Здесь это может быть открытие страницы хоста, например. Но так как вы можете просто собрать URL профиля на этом этапе, я рекомендую выполнить это с помощью двух разных парсингов. Первый - вложенный, чтобы получить все отели. И второй - классический (не вложенный), где точкой входа для парсинга является список ранее собранных URL профилей.
- При практике вложенного парсинга всегда добавляйте URL страницы, с которой вы извлекли информацию, в объект элемента. Позже, при работе с данными, вам будет полезно найти его в своем DataFrame. Вы можете получить к нему доступ из
_response.url_
во втором парсере.
Заключение
Сегодня мы узнали, как продвинуться на шаг вперед при парсинге, используя вложенные парсеры. Процесс не такой сложный и позволяет собирать гораздо больше информации. Однако он требует гораздо больше запросов, поэтому я могу только рекомендовать обдумать, какую дополнительную информацию он предоставит вам.
Надеюсь, вам понравилось и до скорой встречи 🤠