Noiloo
Непроверенный
- Регистрация
- 17 Дек 2021
- Сообщения
- 10
- Реакции
- 0
Здарова! Нашел скрипт, который позволит автоматизировать сбор бесплатных прокси с различных сайтов. Маст хэв для всех нищеебов.
Короче, если ввести в гугле «бесплатные прокси», то мы получим целую кучу сайтов с халявными проксями. Так вот, с именно с таких ресурсов мы и будем их парсить.
Устанавливаем Python версии 3.13+, накатываем библиотеку
и юзаем код:
Для проверки работоспобности используем этот скрипт:
Для тех кто не понял первый скрипт - парсер прокси. второй скрипт - проверка прокси на валид.
В-С-Ё!
Короче, если ввести в гугле «бесплатные прокси», то мы получим целую кучу сайтов с халявными проксями. Так вот, с именно с таких ресурсов мы и будем их парсить.
Устанавливаем Python версии 3.13+, накатываем библиотеку
Код:
Beautiful Soup pip install requests beautifulsoup4
Код:
import requests
from bs4 import BeautifulSoup
import re
import time
import base64
from concurrent.futures import ThreadPoolExecutor, as_completed
# Настройки
USER_AGENT = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36"
TIMEOUT = 10
OUTPUT_FILE = "proxies.txt"
PROXY_PATTERN = re.compile(r'\b(?:[0-9]{1,3}\.){3}[0-9]{1,3}:[0-9]{1,5}\b')
MAX_PAGES = 50 # Максимальное количество страниц для проверки
MAX_WORKERS = 5 # Количество потоков для параллельного парсинга
# Список сайтов для парсинга
SITES = [
{"url": "https://proxylib.com/free-proxy-list/?proxy_page={page}", "paginated": True},
{"url": "https://github.com/proxifly/free-proxy-list/blob/main/proxies/all/data.txt", "paginated": False},
{"url": "https://geonode.com/free-proxy-list?", "paginated": False},
{"url": "http://free-proxy.cz/ru/proxylist/main/{page}", "paginated": True, "special_parser": "free-proxy-cz"},
{"url": "https://hidxxy.name/proxy-list/?start={start}", "paginated": True, "params": {"start": 0}, "special_parser": "hidxxy"},
# Добавляйте другие сайты здесь
]
def get_page_content(url):
headers = {"User-Agent": USER_AGENT}
try:
response = requests.get(url, headers=headers, timeout=TIMEOUT)
response.raise_for_status()
return response.text
except Exception as e:
print(f" Ошибка при загрузке {url}: {e}")
return None
def parse_free_proxy_cz(content):
"""Специальный парсер для free-proxy.cz"""
soup = BeautifulSoup(content, 'html.parser')
proxies = set()
table = soup.find('table', {'id': 'proxy_list'})
if not table:
return proxies
for row in table.find_all('tr')[1:]: # Пропускаем заголовок
cols = row.find_all('td')
if len(cols) >= 2:
# Парсим IP (может быть в base64)
ip_element = cols[0].find('script')
if ip_element:
ip_encoded = re.search(r'Base64.decode\("([^"]+)"\)', ip_element.text)
if ip_encoded:
try:
ip = base64.b64decode(ip_encoded.group(1)).decode('utf-8')
except:
ip = cols[0].get_text(strip=True)
else:
ip = cols[0].get_text(strip=True)
else:
ip = cols[0].get_text(strip=True)
# Парсим порт
port_element = cols[1].find('span', class_='fport')
port = port_element.get_text(strip=True) if port_element else 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.add(f"{ip}:{port}")
return proxies
def parse_hidxxy(content):
"""Парсер для сайта [URL='https://hidxxy.name/proxy-list/']https://hidxxy.name/proxy-list/"""[/URL]
soup = BeautifulSoup(content, 'html.parser')
proxies = set()
rows = soup.find_all('tr')
for row in rows:
tds = row.find_all('td')
if len(tds) >= 2:
ip = tds[0].get_text(strip=True)
port = tds[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.add(f"{ip}:{port}")
return proxies
def detect_and_parse(content, special_parser=None):
"""Автоматически определяет способ парсинга"""
if special_parser == "free-proxy-cz":
return parse_free_proxy_cz(content)
elif special_parser == "hidxxy":
return parse_hidxxy(content)
soup = BeautifulSoup(content, 'html.parser')
# 1. GitHub-подобные textarea
textarea = soup.find('textarea', {'id': 'read-only-cursor-text-area'})
if textarea:
return set(PROXY_PATTERN.findall(textarea.text))
# 2. Кнопки с copyToClipboard
copy_buttons = soup.find_all(onclick=re.compile(r'copyToClipboard\([\'"](.*?)[\'"]\)'))
if copy_buttons:
proxies = set()
for btn in copy_buttons:
match = re.search(r'copyToClipboard\([\'"](.*?)[\'"]\)', btn['onclick'])
if match and ':' in match.group(1):
proxies.add(match.group(1))
return proxies
# 3. Таблицы с IP и портами
tables = soup.find_all('table')
for table in tables:
proxies = set()
for row in table.find_all('tr'):
cells = [c.get_text(strip=True) for c in row.find_all('td')]
if len(cells) >= 2:
ip_match = re.search(r'\b(?:[0-9]{1,3}\.){3}[0-9]{1,3}\b', cells[0])
port_match = re.search(r'\b[0-9]{1,5}\b', cells[1])
if ip_match and port_match:
proxies.add(f"{ip_match.group(0)}:{port_match.group(0)}")
if proxies:
return proxies
# 4. Универсальный поиск
return set(PROXY_PATTERN.findall(content))
def scrape_page(url, special_parser=None):
"""Парсит одну страницу"""
content = get_page_content(url)
if not content:
return set()
return detect_and_parse(content, special_parser)
def scrape_paginated_site(base_url, special_parser=None, params=None):
"""Парсит сайт с пагинацией с использованием многопоточности"""
all_proxies = set()
def process_page(page_number, param_values):
if param_values:
# Формируем URL с параметрами
url = base_url.format(**param_values)
else:
# Формируем URL с номером страницы
url = base_url.format(page=page_number)
proxies = scrape_page(url, special_parser)
if proxies:
print(f" Страница {page_number}: найдено {len(proxies)} прокси")
return proxies
with ThreadPoolExecutor(max_workers=MAX_WORKERS) as executor:
futures = []
# Для сайтов с параметрами (например, hidxxy)
if params is not None:
for page in range(1, MAX_PAGES + 1):
# Обновляем параметры для каждой страницы
param_values = {}
for key, val in params.items():
if key == 'start':
param_values[key] = val + (page - 1) * 64
else:
param_values[key] = val
futures.append(executor.submit(process_page, page, param_values))
time.sleep(0.1) # Небольшая задержка между запросами
else:
# Для обычных пагинированных сайтов
for page in range(1, MAX_PAGES + 1):
futures.append(executor.submit(process_page, page, None))
time.sleep(0.1) # Небольшая задержка между запросами
for future in as_completed(futures):
try:
proxies = future.result()
if proxies: # Добавляем только если есть прокси
all_proxies.update(proxies)
except Exception as e:
print(f" Ошибка при парсинге страницы: {e}")
continue
return all_proxies
def scrape_single_site(url, special_parser=None):
"""Парсит обычный сайт без пагинации"""
print(f"\n Анализируем {url}...")
return scrape_page(url, special_parser)
def save_proxies(proxies, filename):
"""Сохраняет прокси в файл"""
with open(filename, 'a') as f:
f.write('\n'.join(proxies) + '\n')
print(f" Сохранено {len(proxies)} прокси в {filename}")
def main():
print(" Начинаем парсинг прокси...")
open(OUTPUT_FILE, 'w').close() # Очищаем файл
total_proxies = set()
for site in SITES:
start_time = time.time()
site_proxies = set()
try:
if site.get("paginated", False):
print(f"\n Анализируем пагинированный сайт: {site['url']}")
proxies = scrape_paginated_site(
site["url"],
special_parser=site.get("special_parser"),
params=site.get("params")
)
else:
proxies = scrape_single_site(
site["url"],
special_parser=site.get("special_parser")
)
site_proxies.update(proxies)
total_proxies.update(proxies)
if proxies:
save_proxies(proxies, OUTPUT_FILE)
print(f" Время обработки: {time.time() - start_time:.2f} сек")
print(f" Найдено на этом сайте: {len(proxies)} прокси")
except Exception as e:
print(f" Критическая ошибка при обработке сайта {site['url']}: {e}")
continue
print(f"\n Всего найдено прокси: {len(total_proxies)}")
print(f" Результаты сохранены в {OUTPUT_FILE}")
if __name__ == "__main__":
main()[/CENTER]
Для проверки работоспобности используем этот скрипт:
Код:
import requests
from concurrent.futures import ThreadPoolExecutor
from threading import Lock
import time
# Настройки
TEST_URL = "http://httpbin.org/ip" # заменить на нужный сайт
TIMEOUT = 5 # Таймаут в секундах
MAX_THREADS = 100 # Количество потоков (регулируйте в зависимости от мощности ПК)
INPUT_FILE = "proxies.txt" # Файл с прокси (формат: ip:port)
OUTPUT_FILE = "working_proxies.txt" # Файл для рабочих прокси
# Блокировка для безопасной записи в файл
lock = Lock()
def check_proxy(proxy):
proxy_types = ["http", "https", "socks4", "socks5"]
for proxy_type in proxy_types:
proxies = {
"http": f"{proxy_type}://{proxy}",
"https": f"{proxy_type}://{proxy}"
}
try:
start_time = time.time()
response = requests.get(
TEST_URL,
proxies=proxies,
timeout=TIMEOUT
)
response_time = round((time.time() - start_time) * 1000) # В миллисекундах
if response.status_code == 200:
print(f"[+] Рабочий: {proxy} | Тип: {proxy_type} | Время: {response_time}ms")
with lock:
with open(OUTPUT_FILE, "a") as f:
f.write(f"{proxy}|{proxy_type}|{response_time}ms\n")
return True
except:
continue
print(f"[-] Не рабочий: {proxy}")
return False
def main():
print("Загрузка списка прокси...")
with open(INPUT_FILE, "r") as f:
proxies = [line.strip() for line in f if line.strip()]
print(f"Найдено прокси: {len(proxies)}")
print("Начинаю проверку...")
# Очистка файла перед записью
with open(OUTPUT_FILE, "w") as f:
f.write("")
# Многопоточная проверка
with ThreadPoolExecutor(max_workers=MAX_THREADS) as executor:
executor.map(check_proxy, proxies)
print("\nПроверка завершена!")
with open(OUTPUT_FILE, "r") as f:
working_count = len(f.readlines())
print(f"Рабочих прокси: {working_count} (сохранено в {OUTPUT_FILE})")
if __name__ == "__main__":
main()[/CENTER]
Для тех кто не понял первый скрипт - парсер прокси. второй скрипт - проверка прокси на валид.
В-С-Ё!
Последнее редактирование модератором: