CoderCastrov logo
CoderCastrov
Анализ данных

Парсинг веб-страниц с помощью Python

Парсинг веб-страниц с помощью Python
просмотров
7 мин чтение
#Анализ данных

Сайд-проект, который может научить вас основам ценного навыка в области науки о данных

Мотивация

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

Введение

В этой статье мы будем собирать информацию о игроках с веб-сайта English Premier League. Их веб-сайт содержит информацию о сотнях игроков, которые играют за текущие 20 клубов АПЛ.

Это введение в парсинг веб-страниц научит вас:

  • получать содержимое веб-страницы
  • перебирать гиперссылки, встроенные в веб-страницу
  • выделять и извлекать нужную информацию
  • очищать ваши данные
  • экспортировать ваши данные в CSV

Библиотеки, пакеты и модули

Requests

Requests - это библиотека Python, которая помогает получать информацию, которую вы хотите из веб-страниц онлайн. Возможность Requests легко отправлять HTTP GET-запросы делает ее неотъемлемой для сбора данных через Интернет.

Документацию по библиотеке Requests можно найти здесь.

BeautifulSoup4

Beautiful Soup - это библиотека Python, которая помогает разбирать HTML- и XML-документы. Разнообразие функций в Beautiful Soup делает ее отличным инструментом для парсинга веб-страниц.

Документацию по пакету BeautifulSoup4 можно найти здесь.

Время

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

Документацию по модулю Время можно найти здесь.

Pandas

Pandas - это библиотека Python, которая помогает в анализе данных. Разнообразие функций в pandas делает ее отличным инструментом для очистки данных.

Документацию по библиотеке Pandas можно найти здесь.

Осмотр окружения

Первое, что вы хотите сделать, это ознакомиться с содержимым страницы, которую вы хотите спарсить. Мы собираемся рассмотреть www.premierleague.com/clubs.

Вы можете получить доступ к HTML-документу веб-страницы, щелкнув правой кнопкой мыши в любом месте страницы, а затем выбрав Просмотреть код элемента (Ctrl+Shift+I в Windows или Command+Option+I в macOS). Вот как выглядит HTML-документ веб-страницы:

Вы можете понять, какие разделы HTML-документа соответствуют разделам веб-страницы, просматривая выпадающие списки и наводя указатель мыши на строки, чтобы увидеть, какая часть веб-страницы подсвечивается.

Получение содержимого

Первое, что вы хотите сделать, это получить доступ и проанализировать содержимое веб-страницы. Благодаря Requests и Beautiful Soup это легко сделать.

Для доступа к содержимому веб-страницы вы можете использовать requests.get(). Эта функция принимает строку, содержащую URL веб-страницы, к которой вы хотите получить доступ, и отправляет GET-запрос на сервер, на котором размещена веб-страница.

Для анализа содержимого веб-страницы вы можете использовать BeautifulSoup(). Эта функция принимает содержимое веб-страницы и использует ‘html.parser’ для его анализа.

Переменная soup теперь содержит HTML-документ в форме, которую можно использовать с библиотекой Beautiful Soup.

Перебор гиперссылок

Теперь, когда вы превратили содержимое страницы в суп, вы можете использовать некоторые другие функции Beautiful Soup, чтобы найти то, что вам нужно.

Затем вам понадобится найти гиперссылки, которые приведут вас на веб-страницы каждого клуба. В HTML гиперссылка на странице определяется тегом <a> и выглядит примерно так:

<a href = ‘/hyperlink’ class = ‘class’>Содержимое</a>

Изучив HTML-документ, вы можете видеть, что все гиперссылки, которые нам нужны, имеют класс indexItem, поэтому вам нужно найти все соответствующие части супа, которые имеют эти атрибуты. Для этого вы можете использовать функцию find_all(). Эта функция ищет в HTML-документе указанные вами атрибуты и возвращает список элементов, содержащих эти атрибуты.

Используя это, вы можете создать список всех содержимых, имеющих тег <a> с классом indexItem. Каждый тег имеет атрибут ‘href’, содержащий гиперссылку, связанную с тегом. Вы можете использовать это, чтобы создать список ссылок на все страницы клубов, перебирая список тегов и добавляя их в конец исходного URL.

Поскольку тег содержит ссылку, которая переносит вас на обзор клуба, вам нужно заменить ‘overview’ на ‘squad’ в каждом отдельном URL, чтобы перейти на страницу, содержащую игроков клуба.

Теперь у вас есть список, который содержит URL-адреса для каждого клуба. Поскольку вам нужна информация о каждом игроке, вам нужно перебрать каждый клуб и создать список URL-адресов для каждого игрока.

Вы должны перебирать каждый URL в списке clubs и превращать содержимое каждой страницы в удобный суп, как вы делали раньше. Изучив HTML-документ, вы можете видеть, что все гиперссылки, которые нам нужны, имеют класс playerOverviewCard, поэтому вам нужно использовать это, чтобы найти все соответствующие гиперссылки.

Теперь, поскольку серверы имеют ограничения на количество HTTP GET-запросов, которые можно отправить за короткий промежуток времени, вам следует поместить все в блок try-except. Этот блок должен сначала попытаться получить доступ к содержимому страницы, и если возникает исключение, то он должен подождать 5 секунд (произвольно) перед следующей попыткой. Это можно сделать с помощью time.sleep(5).

Извлечение данных

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

Извлекаемые данные будут общей информацией об игроках, представленной в следующем блоке кода. Эти данные не обязательно полезны, но они выполняют свою функцию в демонстрации парсинга веб-страниц.

Список validPositions будет использоваться для проверки функции позиций позже.

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

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

Атрибуты, которые вы ищете, могут не быть уникальными для функций, которые вам нужны, и find_all может вернуть список, содержащий много нежелательных функций. В этом случае вам придется просмотреть список, чтобы найти порядок, в котором они появляются.

Функции, которые вам нужны, могут не существовать для каждого игрока в списке. Чтобы справиться с этим, вам снова понадобится использовать блок try-except. Блок должен сначала попытаться извлечь данные и добавить их в правильный список, и если возникает исключение, он должен добавить пустое значение, None.

Теперь, когда у вас есть вся необходимая информация в виде коллекции списков, вы можете преобразовать эти списки в словарь, а затем преобразовать этот словарь в DataFrame Pandas для удобного анализа.

И вот ваш DataFrame:

Очистка данных

Теперь, когда у вас есть DataFrame, если вы просмотрите данные, вы обнаружите некоторые вещи, которые вы можете захотеть изменить, такие как:

  • Есть некоторые значения N/A.
  • Столбец "Клуб" указывает, является ли игрок арендованным. Возможно, вы захотите указать это в отдельном столбце.
  • В столбцах "Рост" и "Вес" содержатся единицы измерения в виде суффиксов в строках. Их следует удалить и указать в заголовках столбцов.
  • Столбцы "Возраст", "Рост" и "Вес" являются просто строками. Если вы хотите что-то сделать с этими числами, вам может потребоваться преобразовать их в целые числа.

Первое, что вы можете сделать, это удалить любые строки, содержащие значения N/A. Pandas делает это легко с помощью функции dropna(). Параметр axis = 0 указывает, что будут удалены строки, а не столбцы. Параметр inplace = True указывает, что старый DataFrame будет заменен обновленным DataFrame. Функция reset_index устанавливает новый индекс для обновленного DataFrame.

Затем вы можете разделить столбец "Клуб" на два отдельных столбца: "Клуб" и "Аренда". Столбец "Клуб" должен указывать клуб, за который играет игрок, а столбец "Аренда" должен указывать, находится ли он на аренде с помощью логического значения.

Затем вы можете удалить суффиксы из столбцов "Рост" и "Вес", пройдя через значения и удалив каждый символ, который является буквой, используя isalpha(). Затем вы должны изменить заголовки, чтобы указать единицы измерения данных.

Наконец, вы можете изменить тип столбцов "Возраст", "Рост (см)" и "Вес (кг)" на целые числа с помощью функции astype().

Теперь у вас есть чистый DataFrame со всей нужной информацией.

Экспорт в CSV

Наконец, вы можете экспортировать свой DataFrame в файл .csv, используя to_csv() с параметром, являющимся сырой строкой (строкой, предшествующей букве r) с указанием места, где вы хотите сохранить файл.

Заключение

Основные моменты, которые можно извлечь из этой статьи:

  • Получение содержимого веб-страницы в удобной форме.
  • Исследование гиперссылок, встроенных в веб-страницу.
  • Выделение и извлечение нужных данных.
  • Очистка данных.
  • Экспорт данных в CSV.

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

Если у вас есть вопросы или комментарии, не стесняйтесь написать мне сообщение на LinkedIn.

Спасибо за чтение!

Феликс Шир