No. | Nom | La description |
---|---|---|
1 | Program List API | Spécifiez la région, le service, la date |
2 | Program Genre API | Spécifiez la région, le genre, la date |
3 | Program Info API | Spécifiez l'ID du programme |
4 | Now On Air API | Spécifiez la région et le service |
https://api.nhk.or.jp/v2/pg/list/{area}/{service}/{date}.json?key={apikey}
Paramètres | La description | valeur |
---|---|---|
area | ID de la région(3byte) | 130:Tokyo,46 autres régions |
service | ID de service(2byte) | g1: synthèse NHK,e1:E-télé,s1:BS,s3:BSP |
date | Date(YYYY-MM-Format DD) | Exemple:2020-04-07 |
apikey | Clé API(32byte) | Obtenu par l'enregistrement de l'applicationClé API |
json
, et la ** limite d'utilisation est de 300 fois / jour **.{
"list": {
"g1": [
{
"id": "2020040704706",
"event_id": "04706",
"start_time": "2020-04-07T04:02:00+09:00",
"end_time": "2020-04-07T04:30:00+09:00",
"area": {
"id": "130",
"name": "Tokyo"
},
"service": {
"id": "g1",
"name": "Synthèse NHK 1",
"logo_s": {
"url": "//www.nhk.or.jp/common/img/media/gtv-100x50.png ",
"width": "100",
"height": "50"
},
"logo_m": {
"url": "//www.nhk.or.jp/common/img/media/gtv-200x100.png ",
"width": "200",
"height": "100"
},
"logo_l": {
"url": "//www.nhk.or.jp/common/img/media/gtv-200x200.png ",
"width": "200",
"height": "200"
}
},
"title": "Darwin est là! "Infiltrez la turbulente Académie du Lion! Entraînez le roi des bêtes !!"",
"subtitle": "Les enfants lions en croissance apprennent les techniques de chasse et les techniques d'élevage des enfants d'adultes qui jouent le rôle d'enseignants dans un troupeau. Les étudiants peu scrupuleux seront renvoyés! ?? Adhérez aux jours turbulents du drame scolaire!",
"content": "Dans la première nouvelle année, nous présenterons "l'école" du Lion. Les enfants lions en pleine croissance apprennent tout, des enseignants adultes à la chasse et à l'éducation des enfants en passant par la répulsion des rivaux dans un troupeau. Cependant, ma rivale Hyena était complètement irritée et quand je chassais, je pouvais facilement m'échapper vers la proie parce que je pouvais voir toute la silhouette, et tout le monde était fou de la classe pratique. Des élèves encore plus sans scrupules seront renvoyés de l'école! ?? Infiltrez une classe turbulente qui est aussi bonne qu'un drame scolaire! Chanson: MISIA",
"act": "[Discussion] Mayuko Wakuda, Naoki Tatsuda, Machiko Toyoshima, Takayuki Yamada, Inori Minase",
"genres": [
"0802",
"1000"
]
},
{Omis ci-dessous}
json_normalize ()
pour convertir le format json en une trame de données.import pandas as pd
import json
import requests
import datetime
#Définissez la clé API obtenue
apikey = 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'
# 130:Tokyo
area = '130'
# g1:NHK Complet 1,e1:E-télé,s1:BS,s3:BSP
service = ['g1','e1','s1','s3']
#Date et l'heure
date = datetime.date.today()
all_results = pd.DataFrame(index=None, columns=[])
for i in range(len(service)):
url = 'https://api.nhk.or.jp/v2/pg/list/{0}/{1}/{2}.json?key={3}'.format(area,service[i],date,apikey)
request_get = requests.get(url)
if request_get.status_code != 200:
print('Je ne parviens pas à obtenir les données de l'API du guide des programmes NHK.')
break
result = pd.json_normalize(request_get.json(), ['list',[service[i]]])
all_results = pd.concat([all_results, result])
all_results = all_results[~all_results['title'].str.contains('Suspension de diffusion')]
Résumé des données acquises:
<class 'pandas.core.frame.DataFrame'>
Int64Index: 235 entries, 0 to 37
Data columns (total 22 columns):
# Column Non-Null Count Dtype
--- ------ -------------- -----
0 id 235 non-null object
1 event_id 235 non-null object
2 start_time 235 non-null object
3 end_time 235 non-null object
4 title 235 non-null object
5 subtitle 235 non-null object
6 content 235 non-null object
7 act 235 non-null object
8 genres 235 non-null object
9 area.id 235 non-null object
10 area.name 235 non-null object
11 service.id 235 non-null object
12 service.name 235 non-null object
13 service.logo_s.url 235 non-null object
14 service.logo_s.width 235 non-null object
15 service.logo_s.height 235 non-null object
16 service.logo_m.url 235 non-null object
17 service.logo_m.width 235 non-null object
18 service.logo_m.height 235 non-null object
19 service.logo_l.url 235 non-null object
20 service.logo_l.width 235 non-null object
21 service.logo_l.height 235 non-null object
dtypes: object(22)
memory usage: 42.2+ KB
#Convertir au format de date, calculer l'heure de diffusion
all_results['start_time'] = pd.to_datetime(all_results['start_time'], format='%Y/%m/%d %H:%M')
all_results['end_time'] = pd.to_datetime(all_results['end_time'], format='%Y/%m/%d %H:%M')
all_results['airtime'] = all_results['end_time'] - all_results['start_time']
all_results['link'] = all_results['id']
#Création d'informations sur les liens dans la page
func = lambda x: x.replace(x, f'<div id="{x}">Détails du programme</div>')
all_results['link'] = all_results['link'].apply(func)
#temps. Obtenez des heures et des minutes. De plus, ajoutez le nom de la chronologie du guide des programmes
tmp = pd.concat([all_results['start_time'].dt.month ,all_results['start_time'].dt.day,
all_results['start_time'].dt.hour, all_results['start_time'].dt.minute,
(all_results['start_time'].dt.day.astype(str)+all_results['start_time'].dt.strftime('%H'))], axis=1)
tmp.columns = ['month', 'day', 'hour', 'minute','time_bins']
#Combinez les données récupérées avec la nouvelle colonne
all_results = pd.concat([all_results, tmp], axis=1)
#Agrégation pour les listes de programmes
data = all_results.iloc[:,[23,0,1,2,3,4,5,6,7,8,9,10,11,12,22,24,25,26,27,28]]
#Création d'un bloc de données pour le guide des programmes final
tv_index = data.time_bins.sort_values().unique()
tv_table = pd.DataFrame(index=tv_index, columns=['H', 'g1', 'e1', 's1', 's3']).fillna('')
#Combinez le contenu et insérez dans le fuseau horaire.
cell = ''
for s in range(len(service)):
for i in range(len(tv_table.index)):
tmp = data[(data['time_bins'] == tv_table.index[i]) & (data['service.id'] == service[s])]
for c in range(len(tmp)):
cell += '[' + str(tmp['minute'].iloc[c]) + '~]'
cell += tmp['title'].iloc[c]
cell += f'<a href="#{tmp["id"].iloc[c]}">▼</a><br>'
tv_table[service[s]].iloc[i] = cell
cell = ''
#Ajouter un fuseau horaire
for h in range(len(tv_index)):
tv_table['H'].iloc[h] = int(tv_index[h][-2:])
tv_table.columns = ['H', 'Synthèse NHK', 'E-télé', 'BS', 'BSP']
detail_table = data.stack().reset_index()
detail_table.drop(columns='level_0', inplace=True)
detail_table.columns = ['Type', 'valeur']
detail_table.set_index('Type', drop=True, inplace=True)
Créez un fichier html en utilisant pandas'to_html`.
Informations de définition du fichier html
html_template = '''
<!doctype html>
<html lang="ja">
<head>
<!-- Required meta tags -->
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
<!-- Bootstrap CSS -->
<link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.4.1/css/bootstrap.min.css" integrity="sha384-Vkoo8x4CGsO3+Hhxv8T/Q5PaXtkKtu6ug5TOeNV6gBiFeWPGFN9MuhOf23Q9Ifjh" crossorigin="anonymous">
<title>Horaire du programme privé</title> <!-- #1 -->
</head>
<body>
<h2> J'ai créé un guide de programme original en utilisant l'API de guide de programme NHK.{date}Édition</h2> <!-- #2 -->
<!-- Optional JavaScript -->
<!-- jQuery first, then Popper.js, then Bootstrap JS -->
<script src="https://code.jquery.com/jquery-3.4.1.slim.min.js" integrity="sha384-J6qa4849blE2+poT4WnyKhv5vZF5SrPo0iEjwBvKU7imGFAV0wwj1yYfoRSJoZ+n" crossorigin="anonymous"></script>
<script src="https://cdn.jsdelivr.net/npm/[email protected]/dist/umd/popper.min.js" integrity="sha384-Q6E9RHvbIyZFJoft+2mJbHaEWldlvI9IOYy5n3zV9zzTtmI3UksdQRVvoxMfooAo" crossorigin="anonymous"></script>
<script src="https://stackpath.bootstrapcdn.com/bootstrap/4.4.1/js/bootstrap.min.js" integrity="sha384-wfSDF2E50Y2D1uUdj0O3uMBJnjuUD4Ih7YwaYd1iqfktj0Uod8GCExl3Og8ifwB6" crossorigin="anonymous"></script>
<style type="text/css"> th {{ text-align: center; background-color: #f5f5f5}}</style>
<div class="container-fluid"> <!-- #3 -->
{table}
</div>
<div class="container-fluid"> <!-- #4 -->
{table1}
</div>
<div>Fourniture d'informations:NHK</div> <!-- #5 -->
</body>
</html>
Le contenu suivant a été ajouté aux informations de définition.
table = tv_table.to_html(classes=['table', 'table-bordered', 'table-hover'],escape=False)
table1 = detail_table.to_html(classes=['table', 'table-bordered', 'table-hover'],escape=False)
html = html_template.format(table=table, table1=table1, date=date)
with open('g1_table_' + str(date) + '.html', 'w') as f:
f.write(html)
Cliquez sur ▼ pour faire défiler les données détaillées du programme avec le lien sur la page.
pandas.read_json
et pandas.to_html
pouvaient être utilisés, c'était donc une bonne pratique.pandas.read_json
s'est retrouvé dans une entrée claire, je vais donc chercher à nouveau du matériel.pandas.to_html
en premier lieu.Bootstrap
, ma ** puissance Web ** était faible, donc c'était un résultat décevant **.Recommended Posts