Гайд Парсер донатеров Minecraft

Барыга на минималках
Пользователь
Статус
Оффлайн
Регистрация
10 Фев 2019
Сообщения
182
Реакции[?]
57
Поинты[?]
2K
Язык: python3 (проверял на 3.6 и 3.8) с модулями requests и lxml
Все ссылки являются примерами

Сайт, который мы будем парсить, должен иметь
блок последних покупок (
Пожалуйста, авторизуйтесь для просмотра ссылки.
)
Иногда этот блок просто скрыт и его можно найти через код страницы/запросы
(
Пожалуйста, авторизуйтесь для просмотра ссылки.
)


Обычно сайты бывают двух типов:
  • Рендер на сервере
  • Ajax рендер
Для примера возьму популярный сервер JetMine.
Для начала нам надо открыть меню DevTools ctrl+shift+i (в chrome) и открыть сайт
во вкладке Network мы ищем запросы которы содержат json код последних покупок
1609957165327.png
во вкладке Headers смотрим URL (в данном случае это
Пожалуйста, авторизуйтесь для просмотра ссылки.
)
приступим к написанию кода
Python:
import requests
def main():
    # Выполняем запрос к сайту
    data = requests.get("https://jetmine.ru/api/page/main/load")
    # Проверяем статус выполнения запроса
    if data.status_code != 200:
        return
    # Преобразование ответа сервера в словарь
    data = data.json()
    # Проверка просто так (сервер же нам дал такое поле)
    if not data['success']:
        return
    # Нас интересуют только последние покупки значит будем проходить по этому списку
    for i in data['latestTransactions']:
        # Сервер дает информацию по типу покупки
        # И содержит более подробное описание к примеру тип case и описание money
        # Но если тип unban описания уже не будет
        # Чтобы избежать исключения проверяем на соответствие типам case и group
        if i['donateType'] in ['group', 'case']:
            # Если необходимо описание то просто добавим его к типу
            i['donateType'] = i['donateType'] + ' '+ i['donateValue']
        # Теперь выведем нужную информацию
        print(i['donateType'], i['username'])
if __name__ == '__main__':
    main()
в ответ мы получаем это:
1609958012970.png
Эти данные мы можем сохранить и продолжать парсить, проверяя на совпадения.
Тут будет сложнее, но начало такое же как и с Ajax'ом
Проверив запросы, мы понимаем, что страница приходит нам сразу с готовыми донатерами.
И мы вынуждены разобрать страницу
Как пример возьму SunMine
Выделю текст последней покупки нажму лкм и просмотреть код и скопирую full xpath нужных мне элементов, а именно ник и сам донат
/html/body/main/section[8]/div/div/div[2]/div[1]/div[2]/span - Ник
/html/body/main/section[8]/div/div/div[2]/div[1]/div[3]/span - Донат
Выделяя другие элементы из списка последних покупок пойму что
/html/body/main/section[8]/div/div/div[2]/div[1]/div[3]/span изменяется от 1 до 3
Далее можно приступить к написанию кода
Python:
import requests
# Библиотека для удобного парса страниц
from lxml import html
def main():
    # Выполняем запрос к сайту
    data = requests.get("https://sunmine.su/")
    # Проверяем статус выполнения запроса
    if data.status_code != 200:
        return
    # Преобразование ответа сервера в объект верстки
    tree = html.fromstring(data.content)
    for i in range(1, 4):
        # Получить ник через xpath
        nick = tree.xpath(f'/html/body/main/section[8]/div/div/div[2]/div[{str(i)}]/div[2]/span')[0].text
        # Получаем строку по типу "[Создатель], в 17:27"
        group = tree.xpath(f'/html/body/main/section[8]/div/div/div[2]/div[{str(i)}]/div[3]/span')[0].text
        # Из этой строки нам нужна только сама группа поэтому используем
        group = group.split(',')[0]
        print(group, nick)

  
if __name__ == '__main__':
    main()
И теперь нас встречают знакомые
1609959503486.png

Для ленивых я создал мини-проект (осторожно говнокод)
Пожалуйста, авторизуйтесь для просмотра ссылки.
Распаковываем в любую папку.
Запускаем main.py и смотрим на результат, так же все найденые ники он сохраняет в sqlite базу по пути /parsers/nicks.db (
Пожалуйста, авторизуйтесь для просмотра ссылки.
)
Создаем файл по такому шаблону
Python:
import requests
import basechecker


def main():
    # Инициализация класса для базы данных
    db = basechecker.DataBase()
    data = requests.get("https://jetmine.ru/api/page/main/load")
    if data.status_code != 200:
        return
    data = data.json()
    if not data['success']:
        return
    for i in data['latestTransactions']:
        if i['donateType'] in ['group', 'case']:
            i['donateType'] = i['donateType'] + ' '+ i['donateValue']
        # Проверка есть ли этот пользователь в базе
        # Обязательно указывайте разные имена для серверов
        # Чтобы их можно было отличить
        if not db.inBase('jetmine', i['username'], i['donateType']):
            # Если его там нет, то добавляем
            db.add(server='jetmine', nick=i['username'], donate=i['donateType'])


if __name__ == '__main__':
    main()
и переносим его в папку /parsers/
main.py перезапускать не обязательно
Советую сначала запарсить отдельным приложением с выводом в консоль, а потом уже добавлять в общее приложение
Пишите какие сервера добавить в общий парсер ( или присылайте уже готовые парсеры ) на данный момент есть:
  • JetMine
  • FaweMc
  • BearMc
  • SunMine
  • WellMore
  • MinePirate
 
Последнее редактирование:
если я токийский гуль, я съем твою пизду
Начинающий
Статус
Оффлайн
Регистрация
27 Мар 2020
Сообщения
109
Реакции[?]
19
Поинты[?]
0
Товары в продаже
1
Я один не пойму что с ним делать?
И как это работает
 
Участник
Статус
Оффлайн
Регистрация
27 Дек 2018
Сообщения
1,428
Реакции[?]
376
Поинты[?]
0
Барыга на минималках
Пользователь
Статус
Оффлайн
Регистрация
10 Фев 2019
Сообщения
182
Реакции[?]
57
Поинты[?]
2K
Забаненный
Статус
Оффлайн
Регистрация
26 Дек 2020
Сообщения
4
Реакции[?]
0
Поинты[?]
0
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
nexus grief
 
Сверху Снизу