Как сделать веб-скрапинг с BeautifulSoup

онлайн тренажер по питону
Онлайн-тренажер Python 3 для начинающих

Теория без воды. Задачи с автоматической проверкой. Подсказки на русском языке. Работает в любом современном браузере.

начать бесплатно

Как сделать веб-скрапинг с BeautifulSoup: Полный гайд для новичков и профи

Современный интернет наполнен огромным количеством данных: новости, отзывы, курсы валют, прогнозы погоды, товары и многое другое. Но как получить эти данные автоматически? Ответ — веб-скрапинг.

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


Что такое веб-скрапинг?

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

Это полезно для:

  • Мониторинга цен в интернет-магазинах;

  • Сбора информации о новостях и событиях;

  • Парсинга вакансий;

  • Извлечения данных для анализа и машинного обучения.

⚠️ Важно: При выполнении веб-скрапинга всегда проверяйте правила сайта (robots.txt) и соблюдайте юридические нормы.


Что такое BeautifulSoup?

BeautifulSoup — это библиотека Python для парсинга HTML и XML-документов. Она позволяет легко находить и извлекать нужные элементы из HTML-структуры.

📦 Установка:

bash
pip install beautifulsoup4 pip install requests

Основные этапы веб-скрапинга

  1. Получение HTML-кода страницы.

  2. Парсинг HTML с помощью BeautifulSoup.

  3. Извлечение нужных данных.

  4. Сохранение или обработка данных.


Простой пример веб-скрапинга

Давайте попробуем собрать заголовки новостей с сайта.

📚 Пример кода:

python
import requests from bs4 import BeautifulSoup url = "https://news.ycombinator.com/" response = requests.get(url) soup = BeautifulSoup(response.text, "html.parser") titles = soup.find_all("a", class_="storylink") for idx, title in enumerate(titles, 1): print(f"{idx}. {title.text}")

Результат:

markdown
1. Python 3.12 Released 2. AI Breakthrough in Healthcare 3. New Startup Raises $100M ...

Разбор кода:

  • requests.get(url) — получаем HTML-контент страницы.

  • BeautifulSoup(response.text, "html.parser") — парсим HTML.

  • find_all() — ищем все элементы, соответствующие тегу <a> с классом storylink.

  • Используем .text для получения текстового содержимого тегов.


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

Рассмотрим пример с таблицей валют с сайта Центрального банка России.

python
import requests from bs4 import BeautifulSoup url = "https://www.cbr.ru/currency_base/daily/" response = requests.get(url) soup = BeautifulSoup(response.text, "html.parser") table = soup.find("table", class_="data") rows = table.find_all("tr") for row in rows[1:]: # Пропускаем заголовок таблицы cols = row.find_all("td") currency = cols[1].text.strip() rate = cols[-1].text.strip() print(f"{currency}: {rate} руб.")

Как работать с атрибутами HTML?

Вы можете получать доступ к атрибутам тегов, например, ссылкам:

python
link = soup.find("a") print(link["href"]) # Получаем значение атрибута href

Использование CSS-селекторов с BeautifulSoup

python
soup.select("div.article h2.title") # Ищем все заголовки статей в блоках div с классом article

Это мощный способ извлечения информации, если структура сайта сложная.


Как обработать пагинацию (переход по страницам)?

Иногда данные находятся на нескольких страницах. В этом случае нужно использовать цикл и менять параметры запроса.

python
for page in range(1, 5): url = f"https://example.com/page={page}" response = requests.get(url) soup = BeautifulSoup(response.text, "html.parser") # Извлекаем нужные данные

Как хранить собранные данные?

Чаще всего данные сохраняются в CSV или JSON для дальнейшей обработки.

📚 Сохранение в CSV:

python
import csv data = [("USD", "90.15"), ("EUR", "98.20")] with open("currencies.csv", "w", newline="") as file: writer = csv.writer(file) writer.writerow(["Валюта", "Курс"]) writer.writerows(data)

Как бороться с ошибками при веб-скрапинге?

Иногда страница может не загрузиться или её структура изменится.

Используйте обработку ошибок:

python
try: response = requests.get(url, timeout=5) response.raise_for_status() except requests.RequestException as e: print(f"Ошибка при загрузке страницы: {e}")

Веб-скрапинг с динамическими сайтами (JavaScript)

Если данные подгружаются через JavaScript, requests и BeautifulSoup не помогут. В этом случае используется Selenium.

bash
pip install selenium

📚 Пример с Selenium:

python
from selenium import webdriver driver = webdriver.Chrome() driver.get("https://example.com") content = driver.page_source soup = BeautifulSoup(content, "html.parser") # Дальнейшая обработка такая же, как раньше driver.quit()

Заключение

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

Но всегда помните о правовых и этических аспектах! Уважайте правила сайтов и не нарушайте их политику использования данных.

Новости