CoderCastrov logo
CoderCastrov
Питон

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

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

Руководство по использованию библиотек 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

Теперь нам нужно разобрать HTML-код, и в этом нам поможет BeautifulSoup:

soup = BeautifulSoup(html, 'html.parser')

Теперь, если мы выведем на печать наш объект soup, мы получим разобранный HTML-код:

Разобранный HTML

Получение данных

Теперь, когда мы собрали html-страницу и разобрали ее, мы можем получить любые данные, которые нам нужны. Это делается с помощью различных методов и атрибутов объекта soup, который мы создали (мы назвали его "soup").

Самый простой способ найти элементы в html - использовать инструменты разработчика в вашем браузере. Вы можете активировать их, открыв веб-страницу и нажав F12.

Открыть инструменты разработчика

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

Таблица фильмов

Получение названий фильмов

Сначала давайте получим название каждого фильма в списке. В нашем коде мы можем сузить HTML, на который мы смотрим, только на часть <tbody></tbody>, так как нам важны только фильмы внутри таблицы.

Table Body

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

Table Row

Мы можем упростить то, что мы смотрим, дальше, попросив нашу "супу" вернуть строки таблицы в виде списка:

rows = soup.tbody.find_all('tr')

Теперь, когда у нас есть список строк, мы можем вывести одну строку и найти нужные данные. Название можно найти в столбце с классом "titleColumn":

Title Column

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

for row in rows:
    column = row.find('td', 'titleColumn')

Если мы выведем текст "column", который мы только что создали, мы увидим дополнительную информацию помимо просто названия фильма:

Title Column Text

Это потому, что BeautifulSoup берет весь текст внутри столбца с названием. Поэтому нам нужно сузить это еще больше.

Название находится в единственном теге <a> в столбце с названием.

Movie Title

Поэтому мы легко можем получить название, сказав BeautifulSoup получить текст из тега <a>:

for row in rows:
    column = row.find('td', 'titleColumn')
    title = column.a.text

Если мы выведем названия, мы получим аккуратный список всех названий в Топ-250 IMDb:

Movie Titles Printed

Получение года выпуска фильма

Мы также можем получить год выпуска фильма, извлекая текст из тега <span>.

Movie Year

Поскольку это находится в той же колонке, что и название, единственное отличие заключается в использовании column.span вместо column.a:

for row in rows:
    column = row.find('td', 'titleColumn')
    title = column.a.text
    year = column.span.text

Теперь мы можем вывести название каждого фильма вместе с годом выпуска:

Movie Titles and Years

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

Заключение

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

  • Запросить веб-страницу (используя библиотеку requests)
  • Разобрать HTML (используя BeautifulSoup)
  • Поиск нужной информации в разобранном HTML

Чтобы углубиться в тему, посмотрите, как вы можете перейти на каждую страницу фильма и получить жанры для каждого фильма, используя те же инструменты, которые мы использовали здесь!


_Если это помогло вам, подумайте о том, чтобы _подписаться на меня в Twitterдля получения ежедневных советов и статей по программированию.