Загрузка данных
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()