Исходник Парсер префиксов на форуме

uqowivad

Известный
Автор темы
13
4
Этот скрипт предназначен для парсинга профилей пользователей с форума. Он проходит по страницам пользователей, начиная с указанного ID, и собирает данные о никнейме и префиксе пользователя.

То что поддерживается на данный момент:
- Проверенный
- Администратор
- Всефорумный модератор
- BH Team
- Забаненный
- Обычный пользователь
- Друг
- Модератор
- Кастомные префиксы (например, "Няшка :з")
- Данные о пользователях записываются в файл user_data.txt.

Использование:
1. Скачайте или скопируйте код и сохраните его в файл.
2. Перед запуском убедитесь, что у вас установлен Python 3.x и необходимые библиотеки:
- requests
- beautifulsoup4
3. Запустите скрипт. В файле last_processed_id.txt указывается ID пользователя, с которого нужно начать парсинг (по умолчанию это будет 1).
4. Скрипт будет собирать данные и записывать их в файл user_data.txt, а также обновлять статистику по каждому типу префикса.
5. В конце работы будет выведена информация о количестве пользователей с каждым типом префикса.

Код:

Python:
import requests
from bs4 import BeautifulSoup
import time

def get_user_data(member_id):
    url = f'https://www.blast.hk/members/{member_id}'
    try:
        response = requests.get(url)
        response.encoding = 'utf-8'
        if response.status_code == 200:
            soup = BeautifulSoup(response.text, 'html.parser')

            error_message = soup.find('div', class_='blockMessage')
            if error_message and 'Запрашиваемый пользователь не найден' in error_message.text:
                return None, f"Пользователь {member_id} не найден"

            username_tag = soup.find('span', class_='username')
            username = username_tag.get_text(strip=True) if username_tag else 'Не найден'

            prefix = get_user_prefix(soup)

            return username, prefix
        elif response.status_code == 404:
            return None, f"Пользователь {member_id} не существует"
        else:
            return None, f"Ошибка {response.status_code} при запросе к {url}"
    except Exception as e:
        return None, f"Ошибка при запросе {url}: {e}"

def get_user_prefix(soup):
    user_banner_tag = soup.find('em', class_='userBanner')
    if user_banner_tag:
        return user_banner_tag.get_text(strip=True)
    
    user_title_tag = soup.find('span', class_='userTitle')
    return user_title_tag.get_text(strip=True) if user_title_tag else 'Не указан'

def get_last_processed_id():
    try:
        with open('last_processed_id.txt', 'r') as f:
            return int(f.read().strip())
    except FileNotFoundError:
        return 1

def save_last_processed_id(member_id):
    with open('last_processed_id.txt', 'w') as f:
        f.write(str(member_id))

def append_data_to_file(user_data):
    with open('user_data.txt', 'a', encoding='utf-8') as f:
        f.writelines(user_data)

def main():
    last_processed_id = get_last_processed_id()
    user_data = []
    prefix_count = {
        "Проверенный": 0,
        "Администратор": 0,
        "Всефорумный модератор": 0,
        "BH Team": 0,
        "Забаненный": 0,
        "Обычный пользователь": 0,
        "Друг": 0,
        "Модератор": 0,
        "Не указан": 0
    }

    requests_per_second = 15
    delay = 1 / requests_per_second

    print("Запуск парсинга...")

    while last_processed_id <= 573685:
        username, prefix = get_user_data(last_processed_id)

        if username:
            if prefix != 'Не указан':
                print(f"{last_processed_id} | {username} | {prefix}")
                user_data.append(f"{last_processed_id} | {username} | {prefix}\n")
                prefix_count[prefix] = prefix_count.get(prefix, 0) + 1
            else:
                print(f"{last_processed_id} | {username} | {prefix}")

        if len(user_data) >= 50:
            append_data_to_file(user_data)
            user_data = []

        save_last_processed_id(last_processed_id)

        last_processed_id += 1

        time.sleep(delay)

    if user_data:
        append_data_to_file(user_data)

    with open('user_data.txt', 'a', encoding='utf-8') as f:
        f.write("\nОбщее количество пользователей по префиксам:\n")
        for prefix, count in prefix_count.items():
            f.write(f"{prefix} — {count}\n")

    print("Парсинг завершен.")

if __name__ == "__main__":
    main()
 

Вложения

  • bh.py
    3.6 KB · Просмотры: 2