telebot dotabaff parser
Пишу бота на python с помощью telebot, который парсит сайт dotabuff.com по игре Дота 2. При отправке боту айди аккаунта, он должен отправлять топ 5 героев с самым большим количеством игр. Но по какой-то причине, сортировки не происходит и бот отправляет мне не тот список героев.
Какой вывод нужен:
Герой: Earth Spirit2024-04-20 Сыграно матчей: 394 Выигрышей: 59.14%
Герой: Invoker2024-04-26 Сыграно матчей: 263 Выигрышей: 57.41%
Герой: Io2022-10-12 Сыграно матчей: 44 Выигрышей: 61.36%
Герой: Legion Commander2024-04-20 Сыграно матчей: 40 Выигрышей: 52.50%
Герой: Techies2024-03-11 Сыграно матчей: 39 Выигрышей: 43.59%
Какой вывод сейчас:
Герой: Lina2023-03-18, Сыграно матчей: 9, Выигрышей: 33.33%%
Герой: Phoenix2022-10-20, Сыграно матчей: 8, Выигрышей: 25.00%%
Герой: Storm Spirit2022-05-27, Сыграно матчей: 8, Выигрышей: 50.00%%
Герой: Timbersaw2023-05-07, Сыграно матчей: 8, Выигрышей: 25.00%%
Герой: Axe2024-03-20, Сыграно матчей: 7, Выигрышей: 28.57%%
import telebot
import requests
from bs4 import BeautifulSoup
bot = telebot.TeleBot(token)
header = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:97.0) Gecko/20100101 Firefox/97.0'}
<...>
@bot.message_handler(commands=['get_heroes_list'])
def handle_heroes(message):
bot.send_message(message.chat.id, "Отправь мне айди аккаунта и я дам тебе информацию о нем")
def heroes_list(message):
# URL профиля игрока на Dotabuff
id = str(message.text)
heroes_profile_url = 'https://www.dotabuff.com/players/' + id + '/heroes'
# Отправляем запрос на сайт
response = requests.get(heroes_profile_url, headers=header)
# Проверяем успешность запроса
if response.status_code == 200:
# Используем BeautifulSoup для парсинга HTML
soup = BeautifulSoup(response.text, 'html.parser')
# Находим таблицу со статистикой героев игрока
heroes_table = soup.find('table', class_='sortable')
heroes = []
# Находим строки таблицы со статистикой героев
rows = heroes_table.find_all('tr')
# Проходим по каждой строке и выводим информацию о герое
for row in rows[1:]: # Пропускаем первую строку с заголовками
cols = row.find_all('td')
hero_name = cols[1].text.strip()
matches_played = cols[2].text.strip()
winrate = cols[3].text.strip()
heroes.append((hero_name, matches_played, winrate))
# Сортируем список героев по количеству матчей в порядке убывания
heroes.sort(key=lambda x: x[1], reverse=True)
for i, hero in enumerate(heroes[:5], 1):
bot.send_message(message.chat.id,
f"{i}. Герой: {hero[0]}, \nСыграно матчей: {hero[1]}, \nВыигрышей: {hero[2]}%")
for i in heroes:
print(i)
else:
# Выводим сообщение об ошибке
print('Ошибка при запросе к серверу')
bot.register_next_step_handler(message, heroes_list)