Блог AST-SoftPro
Python для автоматизации: как сократить рутинные задачи на 80%
Введение в автоматизацию с Python
Автоматизация рутинных задач — важный инструмент повышения эффективности работы. В условиях высокой загрузки сотрудников время на выполнение повторяющихся операций может быть сокращено за счёт использования скриптов и автоматизированных процессов.
Python является одним из наиболее популярных языков для автоматизации благодаря своей простоте, читаемости кода и большому количеству готовых библиотек. Он позволяет быстро реализовать решения как для локальных задач (обработка файлов), так и для взаимодействия с внешними системами (парсинг данных, API).
В этой статье рассмотрены три основных направления: парсинг внешних источников, обработка файлов и настройка планировщика задач на Python.
Парсинг данных — извлечение информации из веб-источников
Часто компании сталкиваются с необходимостью регулярно собирать данные из открытых или закрытых ресурсов (каталоги поставщиков, публичные API, формы заявок). Ручной сбор такой информации занимает много времени и подвержен ошибкам.
Пример: парсинг таблиц на сайте
Предположим, нужно ежедневно извлекать список товаров со страницы https://example.com/products, где информация представлена в виде HTML-таблицы. Цель — сохранить данные в формате CSV для дальнейшего анализа.
import requests
from bs4 import BeautifulSoup
import csv
def parse_products(url):
response = requests.get(url)
soup = BeautifulSoup(response.text, 'html.parser')
table = soup.find('table', {'id': 'products-table'})
rows = []
for row in table.find_all('tr')[1:]: # пропускаем заголовок таблицы
cols = row.find_all('td')
product_name = cols[0].get_text(strip=True)
price = float(cols[1].get_text().replace(',', '.').strip()) if cols[1].text.replace('.', '').isdigit() else None
rows.append({'name': product_name, 'price': price})
return rows
def save_to_csv(data, filename='products.csv'):
with open(filename, mode='w', encoding='utf-8', newline='') as file:
writer = csv.DictWriter(file, fieldnames=['name', 'price'])
writer.writeheader()
writer.writerows(data)
# Использование
url = "https://example.com/products"
products = parse_products(url)
save_to_csv(products)
Этот скрипт:
- отправляет HTTP-запрос к странице,
- парсит HTML с помощью BeautifulSoup,
- извлекает строки из таблицы, исключая заголовок,
- сохраняет данные в CSV-файл.
⚠️ Важно: при работе с сайтами проверяйте наличие robots.txt и условия использования — автоматический сбор данных может нарушать правила владельца ресурса.
Альтернатива: использование pandas для анализа таблиц
Если структура таблицы соответствует табличным данным (например, Excel или HTML-таблица), можно использовать библиотеку pandas, которая упрощает обработку:
import pandas as pd
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.common.by import By
def scrape_with_selenium(url):
options = webdriver.ChromeOptions()
options.add_argument('--headless') # без GUI, только в фоне
driver = webdriver.Chrome(options=options)
try:
driver.get(url)
table_html = driver.find_element(By.ID, "products-table").get_attribute('outerHTML')
return pd.read_html(table_html)[0] # возвращает DataFrame
finally:
driver.quit()
df = scrape_with_selenium("https://example.com/products")
df.to_csv('output.csv', index=False)
Такой подход полезен, когда BeautifulSoup не может корректно обработать динамически подгруженные таблицы (например, через JavaScript). Selenium имитирует поведение браузера и позволяет получить актуальный HTML.
Обработка файлов — автоматизация рутинных операций с локальной информацией
Многие бизнес-процессы связаны с обработкой локальных данных: Excel-файлы, логи, PDF-документы. Ручная обработка таких документов — источник ошибок и замедление работы сотрудников.
Пример 1: преобразование CSV в JSON для интеграции
Допустим, система принимает данные через API в формате JSON, но исходные файлы приходят в виде sales.csv. Необходимо автоматически конвертировать его в структуру, пригодную для отправки.
import pandas as pd
import json
def csv_to_json(csv_filepath, json_output):
df = pd.read_csv(csv_filepath)
# Преобразуем строки с датами к нужному формату (ISO 8601)
if 'date' in df.columns:
try:
df['date'] = pd.to_datetime(df['date']).dt.strftime('%Y-%m-%dT%H:%M:%S')
except ValueError:
pass
data_list = df.to_dict(orient='records')
with open(json_output, 'w', encoding='utf-8') as f:
json.dump(data_list, f, indent=2, ensure_ascii=False)
csv_to_json('sales.csv', 'sales.json')
Код:
- читает CSV-файл,
- конвертирует столбец date в стандартный формат ISO 8601 (требуется для API),
- сохраняет результат как JSON с отступами для читаемости.
Пример 2: обработка Excel-файлов из папки
Если ежедневно поступают файлы report_*.xlsx, нужно автоматизировать извлечение нужных столбцов и сохранение в единый формат.
import os
from openpyxl import load_workbook
def process_xlsx_folder(input_dir, output_file):
all_data = []
for file in os.listdir(input_dir):
if file.endswith('.xlsx'):
try:
wb = load_workbook(os.path.join(input_dir, file))
sheet = wb.active
# Извлекаем строки (кроме заголовка)
rows = []
for row in sheet.iter_rows(min_row=2): # skip header
values = [cell.value for cell in row]
if all(v is not None for v in values[:3]): # проверяем наличие данных в первых трёх колонках
rows.append(values)
all_data.extend(rows)
except Exception as e:
print(f"Ошибка чтения {file}: {e}")
with open(output_file, 'w', encoding='utf-8') as f:
for row in all_data:
f.write('; '.join(map(str, row)) + '
') # разделитель по выбору системы
process_xlsx_folder('reports/', 'aggregated.txt')
Скрипт обрабатывает все .xlsx-файлы в указанной папке и объединяет их строки (кроме заголовков), сохраняя результат в текстовом формате с разделителем ;. Это может использоваться, например, для объединения отчётов разных отделов.
💡 Совет: при работе с большими объёмами файлов добавьте логику повторных запусков (например, через флаг обработанных имён) и обработку исключений — это предотвратит потери данных.
Настройка планировщика задач — автоматизация по расписанию
Даже если скрипт работает корректно, его выполнение зависит от человека. Чтобы обеспечить регулярность, используется планировщик задач: cron на Linux/macOS или Task Scheduler в Windows.
Пример: запуск скрипта парсинга каждый день в 8 утра
Для автоматизации запуска Python-скриптов по расписанию можно использовать schedule — легковесную библиотеку для Python:
import schedule
import time
from datetime import datetime
def job():
print(f"[{datetime.now().strftime('%Y-%m-%d %H:%M')}] Запуск парсинга...", flush=True)
# Вызов функций из предыдущего примера
products = parse_products("https://example.com/products")
save_to_csv(products, 'daily_output.csv')
print(f"[{datetime.now().strftime('%Y-%m-%d %H:%M')}] Парсинг завершён.", flush=True)
# Запланировать выполнение каждые 24 часа в 8:00 утра (UTC+3 — нужно скорректировать)
schedule.every().day.at('08:00').do(job) # время указано локально, schedule работает в UTC
total_time = time.time() + 1 * 60 * 60 # ждём минуту для первого запуска
while True:
schedule.run_pending() # проверяет расписание на текущий момент
if total_time < time.time():
break
time.sleep(5)
⚠️ Важно: schedule работает в локальном времени, но интерпретирует его как UTC. Если нужно работать по местному времени (например, +3 часа), лучше использовать системные планировщики:
- Linux/macOS: /etc/crontab или systemd timer,
- Windows: «Планировщик заданий».
Пример с использованием cron (Linux)
Допустим, скрипт хранится в /home/user/scripts/parser.py. Чтобы запускать его ежедневно в 8 утра:
# Открываем crontab crontab -e # Добавляем строку: выполнить python-скрипт каждый день в 08:00 (UTC) crontab file содержит: 0 8 * * * /usr/bin/python3 /home/user/scripts/parser.py >> /var/log/parser.log 2>&1
🔍 Пояснение:
- 0 — минута,
- 8 — час (в UTC),
- * — любой день месяца, месяц и день недели.
Логирование (>> /var/log/parser.log 2>&1) позволяет отслеживать ошибки. При сбое Python-скрипта лог покажет traceback, что упрощает диагностику.
Автоматизация через системные службы (на примере systemd)
Для более надёжной автоматизации можно зарегистрировать скрипт как сервис:
# /etc/systemd/system/daily-parser.service [Unit] Description=Ежедневный парсинг продуктов After=network.target [Service] Type=simple ExecStart=/usr/bin/python3 /home/user/scripts/parser.py --log-file daily_output.log Restart=on-failure # перезапустить, если скрипт упал User=nobody StandardOutput=append:/var/log/daily-parser.out StandardError=append:/var/log/daily-parser.err [Install] WantedBy=multi-user.target
После этого:
- sudo systemctl daemon-reload — обновить конфигурацию,
- sudo systemctl enable daily-parser.service — включить запуск при старте системы,
- sudo systemctl start daily-parser.service — запустить вручную.
✅ Преимущество systemd: автоматический перезапуск, контроль состояния (systemctl status, journalctl -u daily-parser.service), интеграция с системными логами.
Рекомендации по построению надёжных автоматизированных решений
При создании скриптов для автоматизации следует придерживаться нескольких принципов:
| Принцип | Описание |
|---|---|
| Обработка ошибок | Всегда используйте try-except и логируйте ошибки. Не допускайте падения всего процесса из-за одной неисправной операции. |
| Валидация входных данных | Проверяйте формат, наличие обязательных полей (например, через pandas.DataFrame.isnull().sum()). |
| Логирование действий | Фиксируйте время запуска, статус выполнения и ошибки в отдельный лог-файл или систему мониторинга. |
| Тестирование на малых объёмах | Перед запуском на реальных данных протестируйте скрипт на 1–2 файлах вручную. |
| Контроль версий | Храните скрипты в системе контроля (Git), чтобы отслеживать изменения и быстро восстанавливать версию при сбое. |
Пример простой системы логирования:
import logging
def setup_logger(name, log_file):
logger = logging.getLogger(name)
logger.setLevel(logging.INFO)
handler = logging.FileHandler(log_file, encoding='utf-8')
formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
handler.setFormatter(formatter)
logger.addHandler(handler)
return logger
logger = setup_logger('parser', 'logs/parser.log')
try:
# основная логика
except Exception as e:
logger.error(f"Ошибка: {e}") # будет записано в файл
Заключение
Автоматизация рутинных задач с помощью Python позволяет сократить время на выполнение операций, снизить количество ошибок и освободить сотрудников для более стратегических задач.
Рассмотренные примеры показывают:
- как парсить веб-сайты,
- обрабатывать локальные файлы (CSV, Excel),
- запускать скрипты по расписанию через системные планировщики или cron/systemd.
Главное — подходить к автоматизации с учётом надёжности: добавлять обработку ошибок, логирование и тестирование. Это обеспечивает стабильность работы даже при изменении входных данных или внешних условий.
Python предоставляет гибкие инструменты для таких задач без необходимости глубокого знания сложных систем управления процессами.