Веб-скрейпинг с помощью Python и BeautifulSoup
Предварительные условия
Прежде чем воспользоваться самим руководством, важно иметь базовое представление о концепциях программирования на языке 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. Владея этими навыками, вы можете приступить к извлечению с сайтов любых данных, от цен на товары до новостных статей.
Но помните, что веб-скрейпинг — это мощный инструмент, который следует использовать ответственно и этично. Всегда соблюдайте условия сайта и помните о том, какое влияние скрейпинг может оказать на его работу.
Теперь, когда вы освоили основы, пора приступить к изучению более продвинутых методов веб-скрейпинга и испытать навыки на практике.
Перевод статьи SPX: Web Scraping with Python and BeautifulSoup