Сбор данных с веб‑страниц: парсинг бесплатных материалов на Python

Готовый чек-лист по парсингу на Python: окружение, библиотеки, код и запуск. Собирайте данные с любых сайтов быстро, легально и без боли.

Содержание

  1. Подготовка окружения
  2. Выбор источника данных
  3. Написание скрипта
  4. Пример готового кода
  5. Запуск и тестирование
  6. Возможные улучшения

Сбор данных из открытых веб‑страниц – распространённая задача для автоматизации рутинной работы. Python благодаря своей простоте и богатому набору библиотек идеально подходит для таких целей. В нашем примере мы будем собирать:

  • название бесплатного материала (курса, статьи, видео);
  • краткое описание;
  • ссылку на источник;
  • дата публикации (если доступна).

Подготовка окружения

Прежде чем приступать к коду, необходимо установить Python и требуемые пакеты.

  1. Убедитесь, что у вас установлен Python версии 3.8 или новее. Проверить можно командой:
  2. python --version
  3. Установите библиотеки requests и beautifulsoup4 через pip:
  4. pip install requests beautifulsoup4
  5. Для удобной работы с данными можно также установить pandas (опционально):
  6. pip install pandas

Выбор источника данных

Для демонстрации возьмём условный сайт https://example-free-magic.com, который выводит список бесплатных материалов в виде карточек:

  • Каждая карточка содержит (<h3 >),
  • описание (<p class="desc">),
  • ссылку (<a class="link">),
  • дату (<span class="date">).

Перед написанием парсера рекомендуется открыть страницу в браузере, посмотреть её исходный код (Ctrl+U) и убедиться, что нужные элементы имеют предсказуемые классы или теги.

Написание скрипта

Скрипт будет состоять из следующих логических блоков:

  1. Импорт необходимых модулей.
  2. Функция парсинга одной карточки (parse_card).
  3. Основная функция, которая обходит все карточки на странице и собирает результаты в список словарей.
  4. Сохранение полученных данных (например, в CSV или JSON);

Пример готового кода

import requests
from bs4 import BeautifulSoup
import csv
from datetime import datetime

BASE_URL = "https://example-free-magic.com/free-materials"
OUTPUT_FILE = "free_magic_data.csv"

def fetch_page(url: str) -> str:
 """
 Выполняет GET‑запрос и возвращает текст страницы.
 При ошибке поднимает исключение.
 """
 headers = {
 "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) " "Chrome/124.0 Safari/537.36"
 }
 response = requests.get(url, headers=headers, timeout=10)
 response.raise_for_status # вызовет исключение при плохом статусе
 return response.text

def parse_card(card) -> dict:
 """
 Извлекает данные из одной карточки.
 Ожидается, что card – это объект BeautifulSoup, представляющий
 контейнер с классом 'card'.
 """
 _tag = card.find("h3", class_="")
 desc_tag = card.find("p", class_="desc")
 link_tag = card.find("a", class_="link")
 date_tag = card.find("span", class_="date")

  = _tag.get_text(strip=True) if _tag else ""
 description = desc_tag.get_text(strip=True) if desc_tag else ""
 link = link_tag["href"] if link_tag and link_tag.has_attr("href") else ""
 date_raw = date_tag.get_text(strip=True) if date_tag else ""

 # Попытка привести дату к единому формату (ISO 8601)
 try:
 # Предположим, что на сайте дата вида "08 Jun 2026"
 date_obj = datetime.strptime(date_raw, "%d %b %Y")
 date = date_obj.strftime("%Y-%m-%d")
 except ValueError:
 date = date_raw # оставляем как есть, если формат не совпал

 return {
 "": ,
 "description": description,
 "link": link,
 "date": date
 }

def scrape_free_magic -> list:
 """
 Основная функция: загружает страницу, ищет все карточки
 и возвращает список словарей с данными.
 """ soup = BeautifulSoup(html, "html.parser")

 # Предположим, что все карточки находятся в контейнере с id="cards-list"
 container = soup.find("div", id="cards-list")
 if not container:
 raise ValueError("Не удалось найти контейнер с карточками на странице.")

 cards = container.find_all("div", class_="card")
 results = [parse_card(card) for card in cards]
 return results

def save_to_csv(data: list, filename: str):
 """

 Сохраняет список словарей в CSV‑файл.
 """
 if not data:
 print("Нет данных для сохранения.")
 return

 fieldnames = ["", "description", "link", "date"]
 with open(filename, mode="w", newline="", encoding="utf-8") as csvfile:
 writer = csv.DictWriter(csvfile, fieldnames=fieldnames)
 writer.writeheader
 for row in data:
 writer.writerow(row)

 print(f"Данные успешно сохранены в файл: {filename}")

if __name__ == "__main__":
 try:
 collected_data = scrape_free_magic
 save_to_csv(collected_data, OUTPUT_FILE)
 except Exception as e:
 print(f"Произошла ошибка: {e}")

Запуск и тестирование

  1. Сохраните приведённый выше код в файл, например scrape_free_magic.py.
  2. Откройте терминал (или командную строку) и перейдите в каталог с файлом.
  3. Запустите скрипт:
  4. python scrape_free_magic.py
  5. После выполнения в текущей папке появится файл free_magic_data.csv с собранными данными.
  6. Откройте CSV в любой программе (Excel, LibreOffice Calc) и проверьте корректность извлечения.

Если сайт использует динамическую загрузку контента через JavaScript, обычный requests+BeautifulSoup может не увидеть нужные элементы. В таком случае стоит рассмотреть использование Selenium или Playwright, но это уже выходит за рамки «простого» скрипта.

Возможные улучшения

  • Пагинация: если материалов больше, чем помещается на одной странице, добавить цикл обхода всех страниц (например, изменяя параметр ?page=2).
  • Обработка ошибок: добавить повторные попытки при сетевых сбоях (retrying библиотека или собственный цикл).
  • Экспорт в JSON или базу данных SQLite для более удобного дальнейшего анализа.
  • Фильтрация: например, оставлять только материалы, опубликованные за последние 30 дней.
  • Логирование: вместо print использовать модуль logging для более гибкого вывода информации.
  • Параметры командной строки: через argparse позволять пользователю указывать URL, имя выходного файла и т.д.

Надеемся, эта статья поможет вам быстро начать автоматизировать сбор информации и сэкономить время на рутинных задачах. Удачного кодинга!