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