CoderCastrov logo
CoderCastrov
Питон

Использование карты сайта для написания эффективных парсеров веб-страниц

Использование карты сайта для написания эффективных парсеров веб-страниц
просмотров
5 мин чтение
#Питон

Обычно, когда вы начинаете разрабатывать парсер для извлечения большого количества записей, ваш первый шаг обычно заключается в том, чтобы перейти на страницу, где доступны все объявления. Вы переходите с страницы на страницу, извлекаете отдельные URL-адреса, сохраняете их в базе данных или в файле, а затем начинаете разбирать. Ничего плохого в этом нет. Единственная проблема - это расточительство ресурсов. Предположим, что в определенной категории есть 100 записей. На каждой странице находится 10 записей. Идеально было бы написать парсер, который будет переходить с страницы на страницу и извлекать все ссылки. Затем вы перейдете к следующей категории и повторите процесс. Представьте себе, что на веб-сайте есть 10 категорий, и в каждой категории есть 100 записей. Тогда расчет будет следующим:

Общее количество записей = количество категорий x количество записей в категории = 10 x 100 = 1000

Общее количество запросов для извлечения записей в категории = количество страниц x 10 = 10 запросов

Запросы в 2 категориях = 10 x 2 = 20

Если один запрос занимает в среднем 500 мс, то для указанных чисел это займет 10 секунд.

Таким образом, с заданными числами вы всегда будете делать 20 лишних запросов. Если у вас есть n категорий, то 10n дополнительных запросов.

То, что я пытаюсь сказать, заключается в том, что вы тратите время и пропускную способность здесь, даже если избегаете блокировки с помощью прокси-серверов. Что же делать? Есть ли у нас вариант? Да, мы можем воспользоваться картами сайта.

Что такое Sitemap

Источник: Google

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

В основном, этот единственный файл содержит всю информацию, необходимую Google для индексации вашего веб-сайта. Хотя Google также запускает своих собственных веб-пауков, и ваш сайт будет проиндексирован даже без sitemap, но эта практика может помочь Google получить информацию, которую вы хотите, чтобы она была доступна в соответствии с вашими потребностями. Обычно URL sitemap выглядит так: http://example.com/sitemap.xml, но это не обязательно. Веб-мастер может изменить URL sitemap по своему усмотрению. Позже мы рассмотрим, как работать с такими ситуациями. Простой файл Sitemap выглядит следующим образом (кредит: https://xmlsitemapgenerator.org/help/xml-sitemap-example.aspx)::)

Самое важное поле для нас - это <loc>, которое фактически содержит URL. При разборе XML-файла мы будем использовать информацию из этого поля. Другое поле, которое может помочь установить частоту обхода нашего парсера, это changefreq. Так, если URL меняется только раз в год, то нет необходимости запрашивать его ежедневно. Возможно, вы задаетесь вопросом о ситуации, когда вы создаете систему мониторинга цен, где вам нужно проверять, когда изменяется цена. Например, на сайте электронной коммерции, который продает одежду и обувь, есть вероятность того, что цены на обувь меняются еженедельно, а цены на одежду - ежемесячно. Вы можете сохранить эту информацию и настроить свой парсер соответствующим образом.

Хорошо, теперь давайте поработаем. Ранее я уже собрал информацию с веб-сайта Airbnb. Теперь мы будем обрабатывать ее по-другому. Наша первая цель - найти URL sitemap. К сожалению, это не URL по умолчанию sitemap.xml. Так как же мы его найдем, перебором? Нет. Я просто проверю файл robots.txt. Этот файл предназначен для поисковых систем и содержит все инструкции о том, что нужно обходить или не обходить. Как и файл sitemap, этот файл также находится в корне домена. К счастью, этот файл всегда будет файлом robots.txt, поэтому вы всегда можете обратиться к нему, чтобы найти sitemap. Если вы посетите файл robots.txt Airbnb (https://www.airbnb.com/robots.txt), вы найдете в нем запись о sitemap.

Sitemap: [https://www.airbnb.com/sitemap-master-index.xml.gz](https://www.airbnb.com/sitemap-master-index.xml.gz)

Это своего рода синтаксис. Вы указываете Sitemap: и после этого корневой URL вашего файла sitemap. Если вы обратите внимание, это сжатый файл, поэтому его нужно скачать и распаковать. Вы можете скачать его вручную или автоматизировать этот процесс, это не является темой этого сообщения. После распаковки я нахожу в нем файл sitemap-master-index.xml. Если вы его откроете, вы найдете записи, подобные следующим:

Как видите, он содержит дополнительные файлы .gz. Нам нужно исследовать их один за другим или определить и загрузить только тот файл, который нам нужен, и затем разархивировать его.

Если вы откроете и просмотрите файл sitemap-master-index.xml, вы найдете файлы . gz вроде https://www.airbnb.com/sitemap-homes-urls-11.xml.gz, **https://www.airbnb.com/sitemap-homes-urls-12.xml.gz, **и так далее, и таких ссылок много. Давайте скачаем sitemap-homes-urls-11.xml.gz и посмотрим, что внутри. Это довольно большой файл в мегабайтах. Давайте напишем код для получения всех URL-адресов в файле.

Этот фрагмент считывает файл sitemap, использует xmltodict для преобразования его в dict, а затем перебирает URL-адреса и сохраняет их в файл. После выполнения этого кода вы обнаружите, что там было 50 тысяч записей. Вы найдете отдельные URL-адреса, такие как https://www.airbnb.com/rooms/39348588. Теперь представьте, что вы получаете все 50 тысяч URL-адресов, переходя по каждой странице. Даже если на странице 100 записей, вам все равно придется сделать 50 запросов. Да, 50 дополнительных запросов! Вот один запрос, и у вас есть все URL-адреса. Круто, не правда ли?

Хорошо, теперь я выберу одну из ссылок и соберу некоторую информацию. Я собираюсь использовать Scraper API. Почему? Потому что, когда я попытался собрать информацию обычным образом, я не получил информацию, так как страница генерировалась динамически с помощью JavaScript. Поэтому лучшим вариантом будет использование онлайн-облачного API для сбора информации, которое также предоставляет удаленный скрытый сбор информации.

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

Заключение

В этой статье вы узнали трюк, который позволяет упростить процесс парсинга ссылок и сделать его более управляемым. Вы можете автоматизировать весь процесс: от доступа к основному URL карты сайта и загрузки и извлечения zip-файлов до сохранения записей в файл.

О, если вы зарегистрируетесь здесь по моей реферальной ссылке или введете промо-код, вы получите 10% скидку. Если вы не получите скидку, просто дайте мне знать по электронной почте на моем сайте, и я обязательно вам помогу.


Оригинальная публикация на сайте http://blog.adnansiddiqi.me от 2 марта 2021 года.