CoderCastrov logo
CoderCastrov
Парсер

Извлеченные уроки при парсинге данных о книгах

Извлеченные уроки при парсинге данных о книгах
просмотров
4 мин чтение
#Парсер

В сегодняшнем мире есть множество способов и мест, где можно получить книги. Когда я выбираю следующую книгу, у меня возникает множество вопросов. Собираюсь ли я в путешествие, чтобы использовать кредит Audible? Или, может быть, местная библиотека имеет ее в своем аккаунте Overdrive, и я могу получить ее сразу и бесплатно. Или, возможно, я могу подождать немного и просто встать в список ожидания в моей библиотеке.

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

Это привело к естественному проекту: взять список желаний, который я составлял в Google Books, извлечь статус этих книг на Amazon и Overdrive, а затем объединить все в одном месте.

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

Примечание: код проекта находится по адресу https://github.com/smonaco47/book-finder. В этой статье не будет полного руководства по тому, что я сделал, но скорее общих тем, которые я обнаружил. Существует множество руководств по BeautifulSoup и API Google._



Обзор проекта

Этот проект состоял из нескольких частей.

  1. Затем я написал скрипт, который ищет на Amazon каждую книгу по названию и автору, которые мы получили из Google. С помощью BeautifulSoup я собрал некоторую ключевую информацию со страницы поиска, такую как название, рейтинг, количество пользователей, оценивших книгу, цена аудиокниги, цена бумажной книги и ссылка.

  2. Для каждой книги я также собрал информацию с Overdrive. Я обнаружил, что результаты поиска на самом деле не отображаются при использовании обычного BeautifulSoup. Поэтому мне пришлось использовать AsyncHTMLScraper из requests-HTML для загрузки веб-страницы и отображения JSON. Поиск был также отличается. Мне пришлось просмотреть каждый элемент в списке результатов поиска и объединить результаты, чтобы получить полную картину. Как вы можете видеть на скриншоте ниже, аудиокниги и электронные книги представлены в двух отдельных результатах поиска.

Затем я собрал все вместе с помощью Pandas, чтобы я мог исследовать собранную информацию.



Детекторы роботов

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

  1. robots.txt: У каждого крупного веб-сайта есть URL, оканчивающийся на robots.txt, который предоставляет информацию о том, как парсеры могут использовать сайт, например amazon.com/robots.txt или overdrive.com/robots.txt. На момент написания этого текста ни на одном из этих сайтов не было информации о времени, когда можно выполнять парсинг, или о конкретных парсерах, которым это разрешено. Я решил, что мой игрушечный пример будет в порядке, но я, конечно же, столкнулся с противороботными возможностями Amazon.

  2. Повторные попытки: Даже когда я попадал на страницу и мне отказывали в нужных результатах, повторная попытка решала проблему. Я решил заснуть на несколько секунд перед повторной попыткой, иначе это могло выглядеть как атака отказа в обслуживании (потому что... это и есть), и мой IP-адрес мог быть заблокирован. Я даже пошел дальше и попытался каждую книгу в своем списке, затем переместил те, которые продолжали блокироваться, в очередь "мертвых писем". Затем я засыпал на 15 минут перед повторной попыткой обработки этих заблокированных запросов. Я также реализовал кэширование ответов, чтобы повторный запуск скрипта был более умным. Это позволило мне собрать все данные со временем.

Обработка ошибок

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

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

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

Например, когда заголовок недоступен в Overdrive, появляется текст "Мы не смогли найти совпадений для ...". Это очень полезная информация, потому что нет смысла пытаться, нужные нам данные недоступны. В таких случаях я вызывал LookupError.

Для других случаев ошибка, скорее всего, является временной (например, блокировка робота), которую можно повторить после некоторого времени ожидания. В таких случаях я вызывал другое исключение. На скриншоте ниже показан случай, когда Amazon заблокировал запрос, а затем предоставил ссылку на API маркетплейса в ответе😅. Однако собачка очень милая! Я обнаружил, что немного подождав и повторив запрос, все получилось.

Chromium

Последней задачей, над которой я работал, было использование AsyncHTMLSession. Эта сессия фактически запускает сеанс Chromium в фоновом режиме. При запуске скрипта на большом объеме данных я обнаружил, что множество этих задач Chromium не закрываются. Все эти открытые сеансы в конечном итоге приводят к замедлению и падению моего компьютера. Команда await session.close() является необходимой для закрытия этих процессов. Я установил общий блок try/except, который гарантировал закрытие сеанса, если он все еще существовал.


Будущие улучшения

Существует множество способов улучшить разработанное решение для парсинга книг в этом проекте. Я мог бы сделать его более устойчивым к ошибкам, чтобы мы имели более ясное представление о причинах сбоев различных запросов. Я также могу лучше обрабатывать изменения на хостинговых веб-сайтах. Во время написания этого поста Amazon изменил некоторые стили и, вероятно, будет делать это и в будущем.

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

Уроки, которые я усвоил здесь, помогут мне в будущих задачах по парсингу веб-страниц, и, надеюсь, они помогут и вам тоже!