Автоматизация скачивания документов из контрактов с площадки ЕИС при помощи Python
В настоящее время информация о государственных контрактах является важным ресурсом для многих исследований и аналитических работ. Однако сбор этой информации может быть трудоемким процессом, особенно когда речь идет о большом количестве контрактов. В этой статье мы рассмотрим, как можно использовать язык программирования Python и некоторые его библиотеки для автоматизации процесса скачивания документов из государственных закупок, а также как логировать исключения с помощью библиотеки Loguru.
Подготовка окружения
Прежде чем мы начнем, убедитесь, что у вас установлены Python и необходимые библиотеки: requests
, BeautifulSoup
, tqdm
и loguru
. Вы можете установить их с помощью pip:
pip install requests beautifulsoup4 tqdm loguru
Код
Давайте рассмотрим пример кода, который мы будем использовать. Этот код позволяет скачивать документы из государственных закупок по списку номеров контрактов и логировать исключения с использованием библиотеки Loguru.
import os
import requests
from loguru import logger
from bs4 import BeautifulSoup
from tqdm import tqdm
from random import randint
import time
# Задаем список номеров контрактов
contract_number = ['0830500000224001380', '0830500000224001379', .....]
# Задаем заголовки для имитации браузера
headers = {
'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/39.0.2171.95 Safari/537.36'}
# Создаем временный список ссылок
temporary_list_links = []
# Соединяем статическую ссылку с номером контракта
for number in contract_number:
url = 'https://zakupki.gov.ru/epz/order/notice/ok20/view/documents.html?regNumber=' + number
temporary_list_links.append(url)
# Функция для проверки существования папки и создания её при отсутствии
def create_folder_if_not_exists(folder):
if not os.path.exists(folder):
os.makedirs(folder)
try:
for url_in_list in range(len(temporary_list_links)):
response = requests.get(temporary_list_links[url_in_list], headers=headers)
if response.status_code == 200:
time.sleep(randint(4, 12))
soup = BeautifulSoup(response.text, 'html.parser')
time.sleep(randint(6, 18))
links = soup.find_all('a', href=True)
urls = []
titles = []
for link in links:
href = link['href']
if 'file.html' in href:
title = link['title'].strip()
titles.append(title)
href = href.strip()
urls.append(href)
folder = r'указываем локальный путь, по которому будем созадавать папку'
+ contract_number[url_in_list]
# Проверяем существование папки и создаем ее, если она не существует
create_folder_if_not_exists(folder)
with tqdm(total=len(urls), desc="Загрузка файлов") as pbar:
for url in range(len(urls)):
time.sleep(randint(16, 40))
r = requests.get(urls[url], headers=headers)
filename = titles[url]
with open(os.path.join(folder, filename), 'wb') as f:
f.write(r.content)
pbar.update(1)
except Exception as e:
logger.error('Исключение' + str(e))
Как это работает
Этот код начинается с импорта необходимых библиотек и определения начальных переменных, включая список номеров контрактов и заголовки для имитации браузера. Затем создается временный список ссылок на страницы государственных закупок для каждого контракта.
Основной код использует цикл для прохода по каждой ссылке из списка, отправки запросов для получения HTML-кода страниц и парсинга его с помощью BeautifulSoup
. Затем он ищет ссылки на документы в таблицах и создает список URL-адресов для скачивания.
Перед началом загрузки код проверяет, существуют ли уже файлы в папке с контрактом, чтобы избежать повторной загрузки. Затем он использует tqdm
для отображения прогресса загрузки в терминале и скачивает файлы поочередно, сохраняя их в соответствующие папки.
В случае возникновения исключений, таких как ошибки запросов или другие ошибки, код обрабатывает их и логирует в файл для последующего анализа с использованием библиотеки Loguru.
Заключение
Этот код демонстрирует, как можно использовать Python для автоматизации скачивания документов из государственных закупок и логирования исключений с помощью библиотеки Loguru. Он также показывает, как обрабатывать исключения и логировать ошибки для более эффективного управления процессом.
Надеюсь, этот пример будет полезен для таких же менеджеров как я, которым в силу своих обязанностей, нужно скачивать и анализировать документацию к контрактам.
Однако данное решение, не является решением, лучше всего проработать нормальное приложение, которое будет работать именно с официальным ftp госзакупок. Данное решение я создавал для себя как временное, пока пишу полноценное ПО.