Веб-скрейпинг с помощью Python и BeautifulSoup

Введение

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

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

Предварительные условия

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

Шаг 1. Установка библиотек

Python снабжен несколькими библиотеками для веб-скрейпинга, такими как BeautifulSoup, Scrapy и Requests. В этом руководстве мы будем использовать BeautifulSoup, поскольку она удобна для начинающих и проста в освоении. Чтобы установить BeautifulSoup, можно воспользоваться менеджером пакетов pip, открыв командную строку или терминал и введя следующую команду:

pip install beautifulsoup4

Так вы установите BeautifulSoup на компьютер.

Шаг 2. Изучение веб-страниц

Прежде чем приступить к веб-скрейпингу сайта, необходимо понять его структуру. Это можно сделать, изучив веб-страницу с помощью инструментов разработчика веб-браузера. Чтобы открыть инструменты разработчика в Google Chrome, щелкните правой кнопкой мыши в любом месте веб-страницы и выберите “Inspect”.

Открыв инструменты разработчика, вы можете навести курсор на элементы страницы, чтобы увидеть их HTML-теги и атрибуты. Это поможет определить, из какого элемента нужно извлечь данные.

Шаг 3. Скрейпинг данных с сайта

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

Для начала импортируем необходимые библиотеки:

import requests
from bs4 import BeautifulSoup

Затем отправим GET-запрос на сайт, используя библиотеку requests:

url = "https://en.wikipedia.org/wiki/Main_Page"
response = requests.get(url)

Далее проведем парсинг HTML-содержимого сайта с помощью BeautifulSoup:

soup = BeautifulSoup(response.content, "html.parser")

Теперь можем извлечь название сайта, найдя тег <title>:

title = soup.find("title")

Выводим заголовок в консоль:

print(title.string)

Когда вы запустите этот код, вы увидите название сайта, выведенное в консоль.

Шаг 4. Извлечение данных с нескольких страниц

Теперь, когда мы знаем, как извлекать данные с одной веб-страницы, попробуем получить данные с нескольких страниц. В качестве примера будем использовать IMDB  —  сайт, на котором перечислены 250 лучших фильмов всех времен.

Для начала импортируем необходимые библиотеки:

import requests
from bs4 import BeautifulSoup

Затем отправим GET-запрос на первую страницу сайта, используя библиотеку requests:

url = "https://www.imdb.com/chart/top"
response = requests.get(url)

Далее проведем парсинг HTML-содержимого сайта с помощью BeautifulSoup:

soup = BeautifulSoup(response.content, "html.parser")

Теперь можем извлечь названия фильмов и их рейтинговые места, найдя соответствующие HTML-теги:

titles = soup.select(".titleColumn a")
ratings = soup.select(".imdbRating strong")

Метод select() возвращает список всех элементов, соответствующих селектору CSS. Мы выбираем все теги <a> внутри элементов <td class="titleColumn">, которые содержат названия фильмов, и все теги <strong> внутри элементов <td class="ratingColumn imdbRating">, которые содержат рейтинговые места.

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

for i in range(len(titles)):
print(f"{i+1}. {titles[i].text} - {ratings[i].text}")

Функция range() генерирует последовательность чисел от 0 до значения длины списка titles, которую мы используем для индексации списков titles и ratings. Атрибут text элемента возвращает текстовое содержимое тега.

Код целиком выглядит следующим образом:

import requests
from bs4 import BeautifulSoup

url = "https://www.imdb.com/chart/top"
response = requests.get(url)

soup = BeautifulSoup(response.content, "html.parser")

titles = soup.select(".titleColumn a")
ratings = soup.select(".imdbRating strong")

for i in range(len(titles)):
print(f"{i+1}. {titles[i].text} - {ratings[i].text}")

При запуске этого кода вы увидите список из 250 лучших фильмов всех времен, выведенный в консоль, а также их рейтинговые места.

Заключение

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

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

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

Читайте также:

Читайте нас в TelegramVK и Дзен


Перевод статьи SPX: Web Scraping with Python and BeautifulSoup

Предыдущая статьяПлохие модели машинного обучения? Но их можно откалибровать
Следующая статья4 способа улучшить навыки написания кода