XenForo Parser by v2ray

Man

Professional
Messages
3,218
Reaction score
787
Points
113
Сначала своими словами:
Софт парсит всех пользователей с форумов на самом популярном движке XenForo. Протестирован на ряде крупных форумов.

Не знаю, на сколько будет этично выложить источник и результаты, но с очень популярного и крупного форума за пару часов в 100 потоков спарсил список всех юзеров. Форум забугор, не наша тематика.

А теперь официальное описание:

Этот скрипт предназначен для автоматизированного парсинга форумов с целью извлечения логинов пользователей. Он реализует многопоточный подход для увеличения производительности и поддерживает работу через прокси-серверы, что делает его полезным для обхода ограничений по IP или увеличения приватности.

Основные функции:​

  1. Загрузка страниц с поддержкой прокси
    Скрипт позволяет загружать страницы форума через указанные прокси-серверы (поддерживаются SOCKS5 прокси). Это полезно для случаев, когда необходимо обходить ограничения на запросы с одного IP-адреса или использовать анонимные соединения. В случае недоступности прокси скрипт автоматически переключается на прямое соединение.
  2. Многопоточность
    Для повышения скорости обработки скрипт использует многопоточность с помощью модуля ThreadPoolExecutor. Пользователь может указать максимальное количество потоков, что позволяет параллельно обрабатывать несколько страниц форума одновременно, значительно ускоряя процесс парсинга.
  3. Проверка прокси-соединений
    Скрипт выполняет проверку работоспособности прокси перед началом работы. Это гарантирует, что выбранный прокси корректно подключается и отвечает. Если прокси не работает, пользователь может выбрать между продолжением работы без прокси или попыткой подключения другого прокси-сервера.
  4. Извлечение логинов пользователей
    Основная задача программы — это поиск и сохранение логинов пользователей, которые могут находиться на различных страницах форума. Логины извлекаются с помощью библиотеки BeautifulSoup, которая анализирует HTML-страницы, находит элементы с классом 'username' и сохраняет их в файл. Это полезно для сбора данных о пользователях форума для дальнейшего анализа.
  5. Обработка и сохранение данных
    Все извлечённые логины сохраняются в указанный пользователем файл. Это позволяет собирать и систематизировать данные для дальнейшего использования. Файловая система не перезаписывает данные, а добавляет новые логины, избегая дублирования.
  6. Поиск ссылок на разделы и темы форума
    Помимо логинов, скрипт также находит ссылки на разделы и темы форума. Это позволяет перейти к следующему уровню глубины структуры форума и продолжать парсинг новых страниц, расширяя охват данных.

Алгоритм работы:​

  1. Пользователь вводит основные параметры: URL форума, количество потоков и имя файла для сохранения логинов.
  2. Опционально настраивается использование прокси. Если прокси выбран, скрипт проверяет его работоспособность перед продолжением.
  3. Программа загружает главную страницу форума и собирает ссылки на разделы и темы.
  4. Ссылки обрабатываются параллельно, извлекая логины пользователей и новые ссылки на страницы форума.
  5. Все найденные логины сохраняются в файл, а программа продолжает обработку до тех пор, пока не будут пройдены все доступные ссылки.

Преимущества:​

  • Гибкость настроек: пользователь может указать количество потоков, что позволяет эффективно использовать системные ресурсы.
  • Поддержка прокси: позволяет обходить блокировки или ограничения на уровне сети.
  • Многопоточность: существенно ускоряет процесс сбора данных.
  • Автоматизация: программа самостоятельно переходит по ссылкам и продолжает парсинг до тех пор, пока не будет обработан весь форум.

Применение:​

Скрипт может быть полезен для различных целей, включая мониторинг активности на форумах, сбор данных для анализа пользовательской активности, или для создания собственных баз данных пользователей.

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()
 
Top