Flashscore — парсим статистику с помощью Python

Flashscore — парсим статистику с помощью Python

В этой статье будет разобран пример парсинга сайта Flashscore на python. Соберём статистику игр по футболу за вчерашний матч.

Для начала перейдём на сайт и откроем панель разработчика. Здесь мы можем увидеть следующий запрос: https://d.flashscore.com/x/feed/f_1_0_3_en_1

По этому запросу идёт получение данных. Часть которая идёт после feed по сути и передаёт всю информацию. Разберём более подробно кусок f_1_0_3_en_1:
1 — которая стоит после f означает вид спорта. Например, если выбрать хоккей, то 1 меняется на 4.
0 — означает сегодняшнее число. Если выбрать вчерашнее число, то это значение меняется на -1.

Приступим к написанию кода. Импортируем две библиотеки requests, datetime и создаём функцию входа. Создадим переменную response, с помощью которой получим наш ответ из url и распечатаем его.

import requests
from datetime import datetime
 
 
def main(): 
    feed = 'f_1_0_3_en_1'
    url = f'https://d.flashscore.ru.com/x/feed/{feed}'
    response = requests.get(url=url)
    print(response.text)
 
 
if __name__ == '__main__':
    main()

Запустив код мы получим ошибку авторизации: 401 Unauthorized

Сайт блокирует наш запрос и нам нужен ключ для получения данных. Ключ можно взять в разделе Request Headrs в пункте x-fsign. Этот код может изменится, поэтому вы должны знать где он находится.

Значение x-fsign присвоим отдельной переменной перед нашей функции. А внутри функции в requests.get добавим ещё один параметр headers

headers = {"x-fsign": "SW9D1eZo"}  # Присваиваем headers значение x-fsign
response = requests.get(url=url, headers=headers)  # Добавляем параметр headers

После запуска программы получим набор различных символов, в которых будут узнаваемые слова, такие как названия страны лиги и так далее:

В этом тексте можно увидеть, что есть определённые ключи и их значения. Ключ и значение отделяются ÷ а их связка отделяется таким знаком ¬.  Имея такие данные можем перебрать этот текст и поместить его в список. Для этого в переменной data разделим текст по значению ¬ и в цикле for переберём наш текст. Добавим в нашу функцию следующий код:

data = response.text.split('¬')  # Делим наш текст по значению ¬
 
for item in data[:200]:  # Возьмём первые 200 значений
    key = item.split('÷')[0]  # Берём первое значение после разделителя ÷
    value = item.split('÷')[-1]  # Берём последнее значение после разделителя ÷
    print({key: value})  # Распечатаем результат в виде словаря

Запустив программу мы видим уже более понятный текст.

Теперь можно заметить, что каждая игра (блок) разделена знаком ~ и мы уже можем перебрать наши данные в виде списка словарей. Добавим перед нашим предыдущим циклом (for) пустой список с нулевым значением словаря.

data_list = [{}]

К циклу for добавим условия (if), где будем добавлять в список data_list новые блоки в виде словаря

if '~' in key:
    data_list.append({key: value})  # Добавляем новый блок в data_list
else:
    data_list[-1].update({key: value})

Распечатаем каждый элемент отдельно и для этого задействуем библиотеку json (не забываем импортировать её).

for element in data_list:
    print(json.dumps(element, ensure_ascii=False, indent=2))

Теперь мы видим, что по определённым ключам мы можем выводить данные. Удалим предыдущий код и напишем, где будет дата, название команд и счёт

for game in data_list:
    if 'AA' in list(game.keys())[0]:
        date = datetime.fromtimestamp(int(game.get("AD")))  # Дата и время
        team_1 = game.get("AE")  # Название первой команды
        team_2 = game.get("AF")  # Название второй команды
        score = f'{game.get("AG")} : {game.get("AH")}'  # Счёт игры
 
        print(f"Дата: {date} Команды: {team_1} - {team_2} | Счёт {score}")

Полный код программы:

import requests
from datetime import datetime
import json
 
headers = {"x-fsign": "SW9D1eZo"}  # Присаиваем headers значение x-fsign
 
 
def main():
    feed = 'f_1_-1_3_en_1'
    url = f'https://d.flashscore.ru.com/x/feed/{feed}'
    response = requests.get(url=url, headers=headers)
 
    data = response.text.split('¬')  # Делим наш текст по значению ¬
 
    data_list = [{}]
 
    for item in data[:200]:  # Возьмём первые 200 значений, для вывода всех данных убрать [:200]
        key = item.split('÷')[0]  # Берём первое значение после разделителя ÷
        value = item.split('÷')[-1]  # Берём последнее значение после разделителя ÷
 
 
        if '~' in key:
            data_list.append({key: value})  # Добавляем новый блок в data_list
        else:
            data_list[-1].update({key: value})
 
    for game in data_list:
        if 'AA' in list(game.keys())[0]:
            date = datetime.fromtimestamp(int(game.get("AD")))  # Дата и время
            team_1 = game.get("AE")  # Название первой команды
            team_2 = game.get("AF")  # Название второй команды
            score = f'{game.get("AG")} : {game.get("AH")}'  # Счёт игры
 
            print(f"Дата: {date} Команды: {team_1} - {team_2} | Счёт {score}")
 
 
 
if __name__ == '__main__':
    main()
Теги
Комментарии

Пока нет комментариев. Будьте первым!

Оставить комментарий

Чтобы оставить комментарий, пожалуйста, войдите или зарегистрируйтесь.