Содержание
- Подготовка окружения
- Выбор источника данных
- Написание скрипта
- Пример готового кода
- Запуск и тестирование
- Возможные улучшения
Сбор данных из открытых веб‑страниц – распространённая задача для автоматизации рутинной работы. Python благодаря своей простоте и богатому набору библиотек идеально подходит для таких целей. В нашем примере мы будем собирать:
- название бесплатного материала (курса, статьи, видео);
- краткое описание;
- ссылку на источник;
- дата публикации (если доступна).
Подготовка окружения
Прежде чем приступать к коду, необходимо установить Python и требуемые пакеты.
- Убедитесь, что у вас установлен Python версии 3.8 или новее. Проверить можно командой:
- Установите библиотеки requests и beautifulsoup4 через pip:
- Для удобной работы с данными можно также установить pandas (опционально):
python --version pip install requests beautifulsoup4 pip install pandas Выбор источника данных
Для демонстрации возьмём условный сайт https://example-free-magic.com, который выводит список бесплатных материалов в виде карточек:
- Каждая карточка содержит (
<h3 >), - описание (
<p class="desc">), - ссылку (
<a class="link">), - дату (
<span class="date">).
Перед написанием парсера рекомендуется открыть страницу в браузере, посмотреть её исходный код (Ctrl+U) и убедиться, что нужные элементы имеют предсказуемые классы или теги.
Написание скрипта
Скрипт будет состоять из следующих логических блоков:
- Импорт необходимых модулей.
- Функция парсинга одной карточки (
parse_card). - Основная функция, которая обходит все карточки на странице и собирает результаты в список словарей.
- Сохранение полученных данных (например, в 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}")
Запуск и тестирование
- Сохраните приведённый выше код в файл, например
scrape_free_magic.py. - Откройте терминал (или командную строку) и перейдите в каталог с файлом.
- Запустите скрипт:
- После выполнения в текущей папке появится файл
free_magic_data.csvс собранными данными. - Откройте CSV в любой программе (Excel, LibreOffice Calc) и проверьте корректность извлечения.
python scrape_free_magic.py Если сайт использует динамическую загрузку контента через JavaScript, обычный requests+BeautifulSoup может не увидеть нужные элементы. В таком случае стоит рассмотреть использование Selenium или Playwright, но это уже выходит за рамки «простого» скрипта.
Возможные улучшения
- Пагинация: если материалов больше, чем помещается на одной странице, добавить цикл обхода всех страниц (например, изменяя параметр
?page=2). - Обработка ошибок: добавить повторные попытки при сетевых сбоях (
retryingбиблиотека или собственный цикл). - Экспорт в JSON или базу данных SQLite для более удобного дальнейшего анализа.
- Фильтрация: например, оставлять только материалы, опубликованные за последние 30 дней.
- Логирование: вместо
printиспользовать модульloggingдля более гибкого вывода информации. - Параметры командной строки: через
argparseпозволять пользователю указывать URL, имя выходного файла и т.д.
Надеемся, эта статья поможет вам быстро начать автоматизировать сбор информации и сэкономить время на рутинных задачах. Удачного кодинга!