[PYTHON] J'ai créé un guide de programme original en utilisant l'API de guide de programme NHK.

Motivation

Flux d'obtention de la clé API

  1. Enregistrez votre compte sur NHK Program API.
  2. Après l'authentification par e-mail, enregistrez le nom de l'application: (nom favori) et l'URL: (non enregistrée).
  3. Une fois l'enregistrement terminé, une «clé API» sera émise. ** Ceci est requis pour l'acquisition. ** **

Présentation de l'API

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
{
  "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}

L'acquisition des 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

Traitement de l'information

#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]]

Mise en forme des données (1)

#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']

Mise en forme des données (2)

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)

Mise en forme des données (3)

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>&nbsp;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.

  1. title: Titre de la page
  2. h2: titre + {date}
  3. Tableau des programmes de 4 stations table {table} -> table
  4. Tableau des détails du programme {table1} -> table1
  5. Affichage du crédit
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. スクリーンショット 2020-04-07 16.08.21.png スクリーンショット 2020-04-07 16.08.48.png

Site de référence

Résumé

Recommended Posts

J'ai créé un guide de programme original en utilisant l'API de guide de programme NHK.
Comment utiliser l'API du guide des programmes NHK
J'ai essayé d'utiliser l'API checkio
Créer une application à l'aide de l'API Spotify
J'ai essayé d'utiliser l'API BigQuery Storage
J'ai créé mon propre outil de recherche à l'aide de l'API Law [Smart Roppo]
J'ai recherché dans la bibliothèque l'utilisation de l'API Gracenote
J'ai essayé d'utiliser l'API Google Cloud Vision
J'ai créé un LINE BOT qui renvoie une image de riz terroriste en utilisant l'API Flickr
J'ai créé un installateur Ansible
J'ai essayé d'utiliser l'API de Sakenowa Data Project
J'ai créé une application avec Lambda qui notifie LINE de "j'aime" à l'aide de l'API Qiita.
Essayez d'utiliser l'API Twitter
J'ai créé un serveur Xubuntu.
J'ai essayé de toucher l'API Qiita
Essayez d'utiliser l'API Twitter
J'ai créé une API avec Docker qui renvoie la valeur prédite du modèle d'apprentissage automatique
J'ai fait un modèle VGG16 en utilisant TensorFlow (en chemin)
Essayez d'utiliser l'API PeeringDB 2.0
J'ai créé un programme automatisé pour coller du squishy dans Excel
[Python] J'ai essayé de collecter des données en utilisant l'API de wikipedia
J'ai créé Chatbot en utilisant l'API LINE Messaging et Python
[Pour les débutants] J'ai essayé d'utiliser l'API Tensorflow Object Detection
J'ai essayé de faire un programme pour résoudre (indice) la recherche d'erreur de Saiseriya
J'ai créé un programme qui résout la recherche d'erreur en quelques secondes
J'ai essayé d'utiliser l'API COTOHA (il y a aussi du code sur GitHub)
J'ai créé une IA qui recadre joliment une image en utilisant Saliency Map
J'ai créé Chatbot en utilisant l'API LINE Messaging et Python (2) ~ Server ~
J'ai fait un programme qui calcule automatiquement le zodiaque avec tkinter
[Kaggle] J'ai fait une collection de problèmes en utilisant le didacticiel Titanic
J'ai essayé le roman Naro API 2
J'ai fait un Line-bot avec Python!
J'ai fait un peintre discriminateur Anpanman
J'ai fait un kit de démarrage angulaire
J'ai essayé l'API du roman Naruro
J'ai essayé de résumer diverses phrases à l'aide de l'API de synthèse automatique "summpy"
J'ai fait un programme pour vérifier la taille d'un fichier avec Python
J'ai créé la partie APL avec la compétence Alexa "Conversion des termes de l'industrie"
Création d'un modèle de discrimination d'image (cifar10) à l'aide d'un réseau neuronal convolutif
Essayez d'utiliser l'API Kraken avec Python
J'ai fait un programme de gestion de la paie en Python!
J'ai essayé d'utiliser l'API de données YOUTUBE V3
Je suis tombé sur l'API Hatena Keyword
J'ai créé une application d'analyse de fréquence en ligne
J'ai créé un module alternatif pour les japandas.
Tweet à l'aide de l'API Twitter en Python
J'ai créé un environnement Anaconda à l'aide de Docker!
Un guide d'introduction à l'optimisation des performances des programmes
Débutant: j'ai créé un lanceur à l'aide d'un dictionnaire
J'ai essayé d'utiliser l'API UnityCloudBuild de Python
J'ai essayé de toucher l'API COTOHA
Je veux faire un programme d'automatisation!
Jouez avec Dajare en utilisant l'API COTOHA
Enregistrez des événements personnalisés à l'aide de l'API Shotgun
Lorsque j'ai essayé d'utiliser l'API Computer Vision de Microsoft, j'ai reconnu le signe Galapagos "Stop"
J'ai créé une commande appdo pour exécuter des commandes dans le contexte de l'application
Avec LINEBot, j'ai fait une application qui m'informe de "l'heure du bus"
Créez une application qui fonctionne bien avec les rapports des utilisateurs à l'aide de l'API COTOHA
J'ai créé un outil de bonus par les pairs en interne (agrégation uniquement) en utilisant Python et BigQuery
J'ai créé un programme pour rechercher des mots sur la fenêtre (développement précédent)
J'ai fait un script pour enregistrer la fenêtre active en utilisant win32gui de Python