CoderCastrov logo
CoderCastrov
Data Science

Как парсить блог и собирать его статьи на Python

Как парсить блог и собирать его статьи на Python
просмотров
5 мин чтение
#Data Science

Простая и эффективная парадигма для создания корпуса из статей онлайн-блогов

Создание набора данных - одна из первых и наиболее важных фаз проекта по анализу данных и машинному обучению. Как я уже упоминал в одной из своих статей на Medium, где я объясняю важность создания набора данных с нуля, здесь я сосредоточусь на том, чтобы поделиться с вами, читателями, простым и эффективным методом для создания корпуса текстовых данных с использованием онлайн-блогов в качестве источника данных.

Моим мотивом, побудившим меня написать эту статью, является то, что текстовые данные являются наиболее распространенным форматом данных в Интернете, и умение пользоваться этими данными - безусловно, ценный навык. В этой статье я поделюсь, как это сделать.

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

Кроме того, этот метод подходит для извлечения статей, которые можно найти в HTML - это означает, что если контент генерируется с помощью JavaScript, то этот процесс вам не поможет. В этом случае вам нужно эмулировать браузер с помощью инструмента, такого как Playwright или Selenium.

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

Как работает программное обеспечение?

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

  • Мы получаем список URL-адресов, которые мы хотим парсить
  • Для каждого URL мы делаем GET-запрос, чтобы получить содержимое статьи из HTML
  • Мы сохраняем данные в словаре Python с двумя ключами, URL и статья
  • Мы сохраняем словарь в списке
  • Мы преобразуем список в Pandas DataFrame

Давайте сразу перейдем к пункту 1.

Как получить список URL-адресов, которые мы хотим парсить

Чтобы найти список URL-адресов, мы будем использовать файл sitemap.xml, который присутствует на большинстве веб-сайтов (редакционные веб-сайты, такие как блоги, действительно нуждаются в нем с точки зрения SEO) и предназначен для предоставления информации поисковым системам о наших страницах, таких как частота обновления и категории. Он часто находится по адресу www.website.com/**_sitemap.xml_**. Если его нет, мы можем использовать файл robots.txt, обычно на том же веб-адресе, который скажет нам местоположение карты сайта.

Пример файла robots.txt на моем личном блоге на итальянском языке. Изображение автора.

Sitemap выглядит следующим образом

Пример sitemap.xml на моем личном блоге на итальянском языке. Изображение автора.

То, что мы видим, это файл в формате .xml (расширяемый язык разметки), который в иерархии дерева передает спецификации данного элемента его листьям. Например, узел URL обычно является узлом loc. Это самый важный узел, потому что он сообщает поисковым системам о положении новых URL-адресов на сайте.

Также следует отметить, что часто есть файл с именем sitemap_index.xml, который вместо указания на URL-адреса отдельных статей/страниц содержит список других карт сайта, которые в свою очередь указывают на конкретные URL-адреса. Например, может быть карты сайта, посвященные статическим страницам, категориям и постам.

Почему начинать с карты сайта?

Это вполне легитимный вопрос. Фактически, есть два пути, которые мы можем выбрать:

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

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

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

Инструменты

Мы будем использовать библиотеку под названием Trafilatura, как для получения URL-адресов из карты сайта, так и для сбора наших статей. Это мощная библиотека, которая выполняет несколько задач, включая поиск карты сайта на сайте без явного объявления, переход по каждой внутренней ссылке для составления карты сайта (если карта сайта недоступна), загрузку и извлечение содержимого страницы. Trafilatura делает все это и многое другое, и я рекомендую вам прочитать документацию, чтобы узнать о его полном потенциале.

Вместе с Trafilatura используется Pandas - собранные данные будут вставлены в DataFrame для удобства использования.

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

Алгоритм

Давайте начнем писать некоторый код.

Мы импортируем sitemap_search из Trafilatura и напишем функцию, которая по заданному базовому URL веб-сайта (например, домашней странице) возвращает все URL-адреса, присутствующие в карте сайта.

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

С помощью favor_precision = True мы просим библиотеку использовать более строгие методы в отношении идентификации основного содержимого статьи. Поскольку она применяет ряд эвристик, она иногда может ошибаться и включать контент, не относящийся к основному, например, заголовки, присутствующие в боковой панели. С аргументом favor_precision мы просим большую точность за счет немного более длительного времени обработки.

Теперь давайте объединим все это в функцию, которую мы назовем create_dataset(). Эта функция принимает в качестве аргумента список веб-сайтов, с которых мы хотим получить статьи. Мы будем использовать https://www.diariodiunanalista.it и https://fragrancejourney.it, который является небольшим итальянским блогом в области парфюмерии.

Я использовал time.sleep(0.5), чтобы не нагружать сервер веб-сайта. Попробуйте увеличить этот таймер, если возникают ошибки времени ожидания или что-то подобное.

Давайте запустим функцию и посмотрим, как наш корпус создается с помощью индикатора прогресса. Продолжительность процесса зависит от того, сколько статей мы хотим восстановить.

Давайте экспортируем наш набор данных в формате .csv и мы закончили! У нас есть готовый для предварительной обработки и анализа корпус текстовых данных.

Давайте взглянем на результаты

Вот как выглядит наш набор данных

Example of the corpus. Image by author.

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

Прямое применение может заключаться в использовании TF-IDF для кластеризации наших текстов. Все зависит от нашей цели. Творчество - наш единственный предел.

Шаблон кода

Вот полный код для копирования и вставки, который вы можете использовать. Увидимся в следующей статье! 👋

Как стать писателем на Mlearning.ai

medium.com