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


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

# Базовый URL и заголовки для имитации браузера
BASE_URL = "https://hidemy.name/ru/proxy-list/"
HEADERS = {
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/117.0.0.0 Safari/537.36",
    "Accept-Language": "ru-RU,ru;q=0.9,en-US;q=0.8,en;q=0.7"
}

def get_countries():
    """Парсит список стран с главной страницы и возвращает словарь {название: код}."""
    try:
        response = requests.get(BASE_URL, headers=HEADERS, timeout=10)
        response.raise_for_status()
        soup = BeautifulSoup(response.text, 'lxml')
        
        # Ищем выпадающий список стран (обычно внутри select с name="country")
        country_select = soup.find('select', {'name': 'country'})
        if not country_select:
            print("Не удалось найти список стран на странице.")
            return {}

        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
        return countries
    except Exception as e:
        print(f"Ошибка при получении списка стран: {e}")
        return {}

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, который равен (номер_страницы - 1) * 64
            start_param = re.search(r'start=(\d+)', last_page_link['href'])
            if start_param:
                start_value = int(start_param.group(1))
                # Количество записей на странице обычно 64
                return (start_value // 64) + 1
    return 1

def parse_proxies_from_page(html):
    """Извлекает IP и порт прокси из HTML-таблицы."""
    soup = BeautifulSoup(html, 'lxml')
    proxies = []
    
    # Находим таблицу с прокси. Обычно это таблица внутри div с классом table_block
    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)
            # Простая проверка, что это похоже на IP и порт
            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 = get_countries()
    if not countries:
        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]
    
    # Определяем домен страны через pycountry
    try:
        # Ищем страну по названию (pycountry может не знать точное русское название, поэтому используем поиск)
        # Для надежности можно использовать код страны как alpha_2, но hidemy использует свои коды.
        # Попробуем найти по названию, если не выйдет - используем код как есть.
        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 с фильтром по стране
    # Параметр country в hidemy.name обычно соответствует двухбуквенному коду
    url_with_filter = f"{BASE_URL}?country={country_code}"
    
    all_proxies = []
    
    # Сначала получаем первую страницу, чтобы узнать количество страниц
    print("Загружаю первую страницу...")
    try:
        first_response = requests.get(url_with_filter, headers=HEADERS, timeout=10)
        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 вычисляется как (номер_страницы - 1) * 64
        start = (page - 1) * 64
        page_url = f"{url_with_filter}&start={start}"
        print(f"Загружаю страницу {page} из {last_page}...")
        try:
            response = requests.get(page_url, headers=HEADERS, timeout=10)
            response.raise_for_status()
            all_proxies.extend(parse_proxies_from_page(response.text))
            # Небольшая пауза, чтобы не нагружать сервер
            time.sleep(0.5)
        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()