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


import requests
from bs4 import BeautifulSoup
import pycountry
import re
import time

# Базовый URL (основной и зеркало)
BASE_URLS = [
    "https://hidemy.name/ru/proxy-list/",
    "https://hidemyna.me/ru/proxy-list/"
]

HEADERS = {
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36",
    "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8",
    "Accept-Language": "ru-RU,ru;q=0.9,en-US;q=0.8,en;q=0.7",
    "Accept-Encoding": "gzip, deflate, br",
    "Connection": "keep-alive",
    "Upgrade-Insecure-Requests": "1",
    "Sec-Fetch-Dest": "document",
    "Sec-Fetch-Mode": "navigate",
    "Sec-Fetch-Site": "none",
    "Sec-Fetch-User": "?1",
    "Cache-Control": "max-age=0",
}

def get_countries():
    """Парсит список стран, используя сессию и имитацию браузера."""
    session = requests.Session()
    
    for base_url in BASE_URLS:
        try:
            print(f"Пробую загрузить: {base_url}")
            response = session.get(base_url, headers=HEADERS, timeout=15)
            response.raise_for_status()
            
            # Проверяем на бот-защиту
            if "It seems you are bot" in response.text or "captcha" in response.text.lower():
                print(f"Сайт {base_url} заблокировал запрос.")
                continue
            
            soup = BeautifulSoup(response.text, 'lxml')
            country_select = soup.find('select', {'name': 'country'})
            
            if not country_select:
                print(f"На {base_url} не найден список стран.")
                continue
            
            countries = {}
            for option in country_select.find_all('option'):
                value = option.get('value')
                name = option.get_text(strip=True)
                if value and value != "0" and name:
                    countries[name] = value
            
            if countries:
                print(f"Успешно загружено {len(countries)} стран.")
                return countries, base_url # Возвращаем и URL, с которого получилось
                
        except Exception as e:
            print(f"Ошибка при запросе к {base_url}: {e}")
            continue
    
    print("Не удалось получить список стран ни с одного зеркала.")
    return {}, None

def get_last_page_number(soup):
    """Определяет номер последней страницы из пагинации."""
    pagination = soup.find('div', class_='pagination')
    if not pagination:
        return 1
    
    pages = pagination.find_all('li')
    if len(pages) >= 2:
        last_page_link = pages[-2].find('a')
        if last_page_link and 'start=' in last_page_link.get('href', ''):
            start_param = re.search(r'start=(\d+)', last_page_link['href'])
            if start_param:
                start_value = int(start_param.group(1))
                return (start_value // 64) + 1
    return 1

def parse_proxies_from_page(html):
    """Извлекает IP и порт прокси из HTML-таблицы."""
    soup = BeautifulSoup(html, 'lxml')
    proxies = []
    
    table = soup.find('table')
    if not table:
        return proxies

    for row in table.find_all('tr')[1:]:
        cols = row.find_all('td')
        if len(cols) >= 2:
            ip = cols[0].get_text(strip=True)
            port = cols[1].get_text(strip=True)
            if re.match(r'^\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}$', ip) and port.isdigit():
                proxies.append(f"{ip}:{port}")
    return proxies

def main():
    print("Получаю список стран...")
    countries, active_base_url = get_countries()
    if not countries or not active_base_url:
        return

    country_list = list(countries.items())
    print("\nДоступные страны:")
    for i, (name, code) in enumerate(country_list, 1):
        print(f"{i}. {name} (код: {code})")

    try:
        choice = int(input("\nВведите номер страны: ")) - 1
        if choice < 0 or choice >= len(country_list):
            print("Неверный номер.")
            return
    except ValueError:
        print("Введите число.")
        return

    country_name, country_code = country_list[choice]
    
    try:
        country_obj = pycountry.countries.search_fuzzy(country_name)[0]
        domain = country_obj.alpha_2.lower()
    except LookupError:
        domain = country_code.lower()
    
    print(f"\nВыбрана страна: {country_name}. Домен для файла: {domain}")

    # Используем тот базовый URL, который сработал
    url_with_filter = f"{active_base_url}?country={country_code}"
    
    all_proxies = []
    
    print("Загружаю первую страницу...")
    try:
        session = requests.Session()
        first_response = session.get(url_with_filter, headers=HEADERS, timeout=15)
        first_response.raise_for_status()
    except Exception as e:
        print(f"Ошибка загрузки: {e}")
        return

    last_page = get_last_page_number(BeautifulSoup(first_response.text, 'lxml'))
    print(f"Всего страниц: {last_page}")

    all_proxies.extend(parse_proxies_from_page(first_response.text))
    
    for page in range(2, last_page + 1):
        start = (page - 1) * 64
        page_url = f"{url_with_filter}&start={start}"
        print(f"Загружаю страницу {page} из {last_page}...")
        try:
            response = session.get(page_url, headers=HEADERS, timeout=15)
            response.raise_for_status()
            all_proxies.extend(parse_proxies_from_page(response.text))
            time.sleep(1) # Увеличили паузу для безопасности
        except Exception as e:
            print(f"Ошибка на странице {page}: {e}")

    unique_proxies = list(dict.fromkeys(all_proxies))
    
    if not unique_proxies:
        print("Прокси не найдены.")
        return

    print(f"\nНайдено {len(unique_proxies)} прокси:")
    for proxy in unique_proxies:
        print(proxy)

    filename = f"proxy_{domain}.txt"
    with open(filename, 'w', encoding='utf-8') as f:
        for proxy in unique_proxies:
            f.write(proxy + '\n')
    
    print(f"\nДанные сохранены в файл: {filename}")

if __name__ == "__main__":
    main()