Загрузка данных


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Процесс завершен.")