Парсинг веб-страниц с помощью Python для начинающих
Руководство по использованию библиотек Requests и BeautifulSoup для работы с HTML-страницами
Парсинг данных из интернета может быть одним из самых сложных этапов в проекте разработки. Но это необязательно.
Здесь мы сосредоточимся на парсинге базовых HTML-страниц с использованием двух популярных библиотек Python:
- Requests
- BeautifulSoup
Обе эти библиотеки имеют достаточную документацию и множество решенных проблем на StackOverflow, что делает их легкими в использовании и устранении проблем, если они возникают.
В этом примере мы будем использовать Топ-250 фильмов IMDb. Вы можете следовать за нами в этой записной книжке Kaggle!
Установка библиотек
Эти библиотеки будут установлены с помощью pip, пакетного менеджера для Python. Откройте терминал или командную строку и выполните следующие команды:
pip install requests
pip install bs4
После выполнения этих команд, у вас должно быть все необходимое для начала парсинга.
Импорт библиотек
После установки библиотек, откройте файл Python в любом редакторе, который вам нравится (или откройте Kaggle ноутбук для этой статьи) и выполните следующие импорты:
import requests
from bs4 import BeautifulSoup
Выполнение запросов и создание объекта Soup
Давайте выполним запрос, чтобы получить HTML-код страницы:
html = requests.get('[https://www.imdb.com/chart/top/?ref_=nv_mv_250').content](https://www.imdb.com/chart/top/?ref_=nv_mv_250%27%29.content)
Если мы выведем на печать наш HTML-код, мы увидим неотформатированный HTML без какой-либо разметки. Это происходит потому, что мы получили ответ в виде байтов, используя атрибут "content".
Теперь нам нужно разобрать HTML-код, и в этом нам поможет BeautifulSoup:
soup = BeautifulSoup(html, 'html.parser')
Теперь, если мы выведем на печать наш объект soup, мы получим разобранный HTML-код:
Получение данных
Теперь, когда мы собрали html-страницу и разобрали ее, мы можем получить любые данные, которые нам нужны. Это делается с помощью различных методов и атрибутов объекта soup, который мы создали (мы назвали его "soup").
Самый простой способ найти элементы в html - использовать инструменты разработчика в вашем браузере. Вы можете активировать их, открыв веб-страницу и нажав F12.
Затем вы можете навести указатель мыши на элементы страницы, чтобы быстро найти наиболее полезные. В данном случае мы видим, что список фильмов состоит из одной большой таблицы:
Получение названий фильмов
Сначала давайте получим название каждого фильма в списке. В нашем коде мы можем сузить HTML, на который мы смотрим, только на часть <tbody></tbody>
, так как нам важны только фильмы внутри таблицы.
Теперь, когда мы сузили то, что нам нужно посмотреть, легче определить, где находятся данные, которые мы хотим получить. Каждый фильм имеет свою собственную строку в этой таблице:
Мы можем упростить то, что мы смотрим, дальше, попросив нашу "супу" вернуть строки таблицы в виде списка:
rows = soup.tbody.find_all('tr')
Теперь, когда у нас есть список строк, мы можем вывести одну строку и найти нужные данные. Название можно найти в столбце с классом "titleColumn":
Поэтому нам нужно найти столбец с этим классом для каждой строки. Теперь, когда мы создали список строк, нам нужно будет перебрать этот список:
for row in rows:
column = row.find('td', 'titleColumn')
Если мы выведем текст "column", который мы только что создали, мы увидим дополнительную информацию помимо просто названия фильма:
Это потому, что BeautifulSoup берет весь текст внутри столбца с названием. Поэтому нам нужно сузить это еще больше.
Название находится в единственном теге <a>
в столбце с названием.
Поэтому мы легко можем получить название, сказав BeautifulSoup получить текст из тега <a>
:
for row in rows:
column = row.find('td', 'titleColumn')
title = column.a.text
Если мы выведем названия, мы получим аккуратный список всех названий в Топ-250 IMDb:
Получение года выпуска фильма
Мы также можем получить год выпуска фильма, извлекая текст из тега <span>
.
Поскольку это находится в той же колонке, что и название, единственное отличие заключается в использовании column.span
вместо column.a
:
for row in rows:
column = row.find('td', 'titleColumn')
title = column.a.text
year = column.span.text
Теперь мы можем вывести название каждого фильма вместе с годом выпуска:
Конечно, мы можем сделать гораздо больше с этими инструментами. Оценки пользователей и ранг также легко получить отсюда.
Заключение
Прежде всего, повторим шаги, которые мы предприняли, чтобы получить эту информацию:
- Запросить веб-страницу (используя библиотеку requests)
- Разобрать HTML (используя BeautifulSoup)
- Поиск нужной информации в разобранном HTML
Чтобы углубиться в тему, посмотрите, как вы можете перейти на каждую страницу фильма и получить жанры для каждого фильма, используя те же инструменты, которые мы использовали здесь!
_Если это помогло вам, подумайте о том, чтобы _подписаться на меня в Twitterдля получения ежедневных советов и статей по программированию.