Загрузка данных
import csv
import urllib.request
import urllib.parse
import os
import re
import time
# --- НАСТРОЙКИ ---
CSV_FILE = 'docs.csv'
DOWNLOAD_DIR = './downloads'
# Вставьте сюда ваш актуальный Cookie полностью
COOKIE = "ВАШ_COOKIE_ИЗ_БРАУЗЕРА"
# Ссылка на конкретную категорию (из левого меню SharePoint)
CATEGORY_URL = "https://main.atb.su/normdocs/Lists/Documents/Методика.aspx"
BASE_DOMAIN = "https://main.atb.su"
os.makedirs(DOWNLOAD_DIR, exist_ok=True)
# Настройка opener для работы с Cookie и заголовками
opener = urllib.request.build_opener()
opener.addheaders = [
('Cookie', COOKIE),
('User-Agent', 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36')
]
urllib.request.install_opener(opener)
def clean_html(text):
"""Удаляет теги и лишние пробелы"""
return re.sub(r'<[^>]+>', '', text).strip()
def download_files():
# Открываем UTF-8-SIG, чтобы Excel-символы в начале файла не мешали
with open(CSV_FILE, mode='r', encoding='utf-8-sig') as f:
# Для "CSV UTF-8 (разделитель — запятая)" используем delimiter=','
reader = csv.DictReader(f, delimiter=',')
for row in reader:
name = row.get('Название', '').strip()
category_from_csv = row.get('Категория', '').strip()
if not name:
continue
print(f"\nИщу: {name[:70]}...")
# Формируем URL с фильтром по названию (Title)
encoded_name = urllib.parse.quote(name)
separator = '&' if '?' in CATEGORY_URL else '?'
search_url = f"{CATEGORY_URL}{separator}FilterField1=Title&FilterValue1={encoded_name}"
try:
with urllib.request.urlopen(search_url) as response:
html = response.read().decode('utf-8')
# Ищем строки таблицы (ms-itmhover) как на скриншоте
rows = re.findall(r'<tr[^>]*class="[^"]*ms-itmhover[^"]*"[^>]*>(.*?)</tr>', html, re.DOTALL | re.IGNORECASE)
if not rows:
print(" [-] Строка не найдена. Проверьте точность названия или фильтр.")
continue
for row_content in rows:
# Извлекаем все ячейки <td>
cells = re.findall(r'<td[^>]*>(.*?)</td>', row_content, re.DOTALL | re.IGNORECASE)
row_text = " ".join([clean_html(c) for c in cells])
# 1. Проверяем статус
if "Отменен" in row_text:
print(" [!] Документ ОТМЕНЕН. Пропускаю.")
continue
if "Действителен" not in row_text:
print(" [?] Статус не определен как 'Действителен'. Пропускаю.")
continue
# 2. Проверяем категорию (если нужно строгое соответствие)
if category_from_csv and category_from_csv.lower() not in row_text.lower():
print(f" [!] Категория в таблице не совпала с '{category_from_csv}'.")
continue
# 3. Ищем ссылку на файл
# На скриншоте это href="Attachments/..."
file_link_match = re.search(r'href="([^"]*?Attachments/[^"]+)"', row_content, re.I)
if file_link_match:
file_url = urllib.parse.urljoin(BASE_DOMAIN, file_link_match.group(1))
# Очищаем имя файла от URL-кодов
file_name = urllib.parse.unquote(file_url.split('/')[-1])
save_path = os.path.join(DOWNLOAD_DIR, file_name)
print(f" [+] СТАТУС ОК. Скачиваю: {file_name}")
with urllib.request.urlopen(file_url) as f_resp, open(save_path, 'wb') as out_f:
out_f.write(f_resp.read())
time.sleep(1) # Защита от блокировки
break
else:
print(" [!] Не удалось найти прямую ссылку на файл в этой строке.")
except Exception as e:
print(f" [!] Ошибка запроса: {e}")
if __name__ == "__main__":
download_files()
print("\nПроцесс завершен.")