В этой статье будет разобран пример парсинга сайта 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()
Пока нет комментариев. Будьте первым!