Man
Professional
- Messages
- 3,218
- Reaction score
- 787
- Points
- 113
Сначала своими словами:
Софт парсит всех пользователей с форумов на самом популярном движке XenForo. Протестирован на ряде крупных форумов.
Не знаю, на сколько будет этично выложить источник и результаты, но с очень популярного и крупного форума за пару часов в 100 потоков спарсил список всех юзеров. Форум забугор, не наша тематика.
А теперь официальное описание:
Этот скрипт предназначен для автоматизированного парсинга форумов с целью извлечения логинов пользователей. Он реализует многопоточный подход для увеличения производительности и поддерживает работу через прокси-серверы, что делает его полезным для обхода ограничений по IP или увеличения приватности.
Софт парсит всех пользователей с форумов на самом популярном движке XenForo. Протестирован на ряде крупных форумов.
Не знаю, на сколько будет этично выложить источник и результаты, но с очень популярного и крупного форума за пару часов в 100 потоков спарсил список всех юзеров. Форум забугор, не наша тематика.
А теперь официальное описание:
Этот скрипт предназначен для автоматизированного парсинга форумов с целью извлечения логинов пользователей. Он реализует многопоточный подход для увеличения производительности и поддерживает работу через прокси-серверы, что делает его полезным для обхода ограничений по IP или увеличения приватности.
Основные функции:
- Загрузка страниц с поддержкой прокси
Скрипт позволяет загружать страницы форума через указанные прокси-серверы (поддерживаются SOCKS5 прокси). Это полезно для случаев, когда необходимо обходить ограничения на запросы с одного IP-адреса или использовать анонимные соединения. В случае недоступности прокси скрипт автоматически переключается на прямое соединение. - Многопоточность
Для повышения скорости обработки скрипт использует многопоточность с помощью модуля ThreadPoolExecutor. Пользователь может указать максимальное количество потоков, что позволяет параллельно обрабатывать несколько страниц форума одновременно, значительно ускоряя процесс парсинга. - Проверка прокси-соединений
Скрипт выполняет проверку работоспособности прокси перед началом работы. Это гарантирует, что выбранный прокси корректно подключается и отвечает. Если прокси не работает, пользователь может выбрать между продолжением работы без прокси или попыткой подключения другого прокси-сервера. - Извлечение логинов пользователей
Основная задача программы — это поиск и сохранение логинов пользователей, которые могут находиться на различных страницах форума. Логины извлекаются с помощью библиотеки BeautifulSoup, которая анализирует HTML-страницы, находит элементы с классом 'username' и сохраняет их в файл. Это полезно для сбора данных о пользователях форума для дальнейшего анализа. - Обработка и сохранение данных
Все извлечённые логины сохраняются в указанный пользователем файл. Это позволяет собирать и систематизировать данные для дальнейшего использования. Файловая система не перезаписывает данные, а добавляет новые логины, избегая дублирования. - Поиск ссылок на разделы и темы форума
Помимо логинов, скрипт также находит ссылки на разделы и темы форума. Это позволяет перейти к следующему уровню глубины структуры форума и продолжать парсинг новых страниц, расширяя охват данных.
Алгоритм работы:
- Пользователь вводит основные параметры: URL форума, количество потоков и имя файла для сохранения логинов.
- Опционально настраивается использование прокси. Если прокси выбран, скрипт проверяет его работоспособность перед продолжением.
- Программа загружает главную страницу форума и собирает ссылки на разделы и темы.
- Ссылки обрабатываются параллельно, извлекая логины пользователей и новые ссылки на страницы форума.
- Все найденные логины сохраняются в файл, а программа продолжает обработку до тех пор, пока не будут пройдены все доступные ссылки.
Преимущества:
- Гибкость настроек: пользователь может указать количество потоков, что позволяет эффективно использовать системные ресурсы.
- Поддержка прокси: позволяет обходить блокировки или ограничения на уровне сети.
- Многопоточность: существенно ускоряет процесс сбора данных.
- Автоматизация: программа самостоятельно переходит по ссылкам и продолжает парсинг до тех пор, пока не будет обработан весь форум.
Применение:
Скрипт может быть полезен для различных целей, включая мониторинг активности на форумах, сбор данных для анализа пользовательской активности, или для создания собственных баз данных пользователей.
Code:
import requests
from bs4 import BeautifulSoup
from concurrent.futures import ThreadPoolExecutor, as_completed
# Функция для загрузки страницы с поддержкой прокси
def fetch_page(url, proxies=None):
try:
response = requests.get(url, proxies=proxies)
response.raise_for_status() # Проверка на успешный запрос
return response.text
except requests.RequestException as e:
print(f"Ошибка при запросе страницы {url}: {e}")
return None
# Функция для проверки подключения к прокси
def check_proxy(proxies):
test_url = "https://httpbin.org/ip" # URL для проверки соединения
try:
response = requests.get(test_url, proxies=proxies, timeout=5)
response.raise_for_status()
print(f"Подключение к прокси успешно! Ваш IP через прокси: {response.json()['origin']}")
return True
except requests.RequestException as e:
print(f"Не удалось подключиться к прокси: {e}")
return False
def parse_forum_page(html):
soup = BeautifulSoup(html, 'html.parser')
links = set()
# Найти все ссылки на посты и разделы
for a_tag in soup.find_all('a', href=True):
href = a_tag['href']
if 'threads/' in href or 'forums/' in href:
links.add(href)
return links
def extract_usernames(html):
soup = BeautifulSoup(html, 'html.parser')
usernames = set()
# Предполагаем, что логины пользователей находятся в элементах с классом 'username'
for username_tag in soup.find_all(class_='username'):
usernames.add(username_tag.text.strip())
return usernames
def save_usernames(usernames, filename):
with open(filename, 'a', encoding='utf-8') as file:
for username in usernames:
file.write(f"{username}\n")
def process_link(link, base_url, visited_links, filename, proxies):
if link in visited_links:
return
visited_links.add(link)
print(f"Загрузка страницы {link}...")
page_html = fetch_page(base_url + link, proxies)
if not page_html:
return
usernames = extract_usernames(page_html)
if usernames:
print(f"Найдено {len(usernames)} логинов. Сохраняем в файл...")
save_usernames(usernames, filename)
return parse_forum_page(page_html)
def main():
# Запрашиваем параметры у пользователя
base_url = input("Введите URL форума (например, https://forum.info/): ").strip()
max_threads = int(input("Введите количество потоков (например, 100): ").strip())
filename = input("Введите имя файла для сохранения логинов (например, usernames.txt): ").strip()
# Запрашиваем прокси у пользователя
use_proxy = input("Использовать socks5 прокси? (y/n): ").strip().lower()
proxies = None
if use_proxy == 'y':
proxy_address = input("Введите адрес socks5 прокси (например, socks5://127.0.0.1:9050): ").strip()
proxies = {
'http': proxy_address,
'https': proxy_address
}
# Проверка подключения к прокси
if not check_proxy(proxies):
print("Переход на прямое соединение...")
proxies = None
visited_links = set()
print(f"Загрузка главной страницы форума {base_url}...")
main_page_html = fetch_page(base_url, proxies)
if not main_page_html:
return
links_to_visit = parse_forum_page(main_page_html)
with ThreadPoolExecutor(max_workers=max_threads) as executor:
future_to_link = {executor.submit(process_link, link, base_url, visited_links, filename, proxies): link for link in links_to_visit}
while future_to_link:
for future in as_completed(future_to_link):
link = future_to_link.pop(future)
try:
new_links = future.result()
if new_links:
for new_link in new_links:
if new_link not in visited_links:
future_to_link[executor.submit(process_link, new_link, base_url, visited_links, filename, proxies)] = new_link
except Exception as e:
print(f"Ошибка при обработке {link}: {e}")
print("Обработка завершена.")
if __name__ == "__main__":
main()