[PYTHON] Ich habe einen Original-Programmführer mit der NHK-Programmführer-API erstellt.

Motivation

Ablauf beim Abrufen des API-Schlüssels

  1. Registrieren Sie Ihr Konto unter NHK Program API.
  2. Registrieren Sie nach der E-Mail-Authentifizierung den Anwendungsnamen: (Favoritenname) und die URL: (nicht registriert).
  3. Nach Abschluss der Registrierung wird ein API-Schlüssel ausgegeben. ** Dies ist für den Erwerb erforderlich. ** ** **

API-Übersicht

No. Name Erläuterung
1 Program List API Geben Sie Region, Service und Datum an
2 Program Genre API Geben Sie Region, Genre und Datum an
3 Program Info API Geben Sie die Programm-ID an
4 Now On Air API Region und Service angeben
https://api.nhk.or.jp/v2/pg/list/{area}/{service}/{date}.json?key={apikey}
Parameter Erläuterung Wert
area Regions-ID(3byte) 130:Tokio,46 andere Regionen
service Service-ID(2byte) g1: NHK-Synthese,e1:E-Tele,s1:BS,s3:BSP
date Datum(YYYY-MM-DD-Format) Beispiel:2020-04-07
apikey API-Schlüssel(32byte) Erhalten durch App-RegistrierungAPI-Schlüssel
{
  "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": "Tokio"
        },
        "service": {
          "id": "g1",
          "name": "NHK-Synthese 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 ist da! "Infiltriere die turbulente Löwenakademie! Trainiere den König der Bestien !!"",
        "subtitle": "Wachsende Löwenkinder lernen Jagdtechniken und Erziehungstechniken von Erwachsenen, die die Rolle von Lehrern in einer Herde spielen. Skrupellose Studenten werden entlassen! ?? Halten Sie sich an die turbulenten Tage des Schuldramas!",
        "content": "Im ersten neuen Jahr werden wir die "Schule" von Lion vorstellen. Wachsende Löwenkinder lernen alles von erwachsenen Lehrern über die Jagd und Kindererziehung bis hin zur Abwehr von Rivalen in einer Herde. Mein Rivale Hyena war jedoch völlig irritiert, und als ich jagte, konnte ich die ganze Gestalt sehen und leicht zur Beute fliehen. Noch skrupellosere Schüler werden von der Schule entlassen! ?? Infiltrieren Sie eine turbulente Klasse, die so gut ist wie ein Schuldrama! Lied: MISIA",
        "act": "[Diskussion] Mayuko Wakuda, Naoki Tatsuda, Machiko Toyoshima, Takayuki Yamada, Inori Minase",
        "genres": [
          "0802",
          "1000"
        ]
      },
{Unten weggelassen}

Datenerfassung

import pandas as pd
import json
import requests
import datetime

#Legen Sie den erhaltenen API-Schlüssel fest
apikey = 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'

# 130:Tokio
area = '130'
# g1:NHK umfassend 1,e1:E-Tele,s1:BS,s3:BSP
service = ['g1','e1','s1','s3']
#Datum (und Uhrzeit
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('Ich kann die Daten der NHK-Programmführer-API nicht abrufen.')
        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('Broadcast-Aussetzung')]

Zusammenfassung der erfassten Daten:

<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

Datenverarbeitung

#In Datumsformat konvertieren, Sendezeit berechnen
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']
#Erstellen von In-Page-Link-Informationen
func = lambda x: x.replace(x, f'<div id="{x}">Programmdetails</div>')
all_results['link'] = all_results['link'].apply(func)

#Zeit. Holen Sie sich Stunden und Minuten. Fügen Sie außerdem den Namen der Zeitleiste des Programmführers hinzu
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']

#Kombinieren Sie die abgerufenen Daten mit der neuen Spalte
all_results = pd.concat([all_results, tmp], axis=1)

#Aggregation für Programmlisten
data = all_results.iloc[:,[23,0,1,2,3,4,5,6,7,8,9,10,11,12,22,24,25,26,27,28]]

Datenformung (1)

#Erstellen eines Datenrahmens für den endgültigen Programmführer
tv_index = data.time_bins.sort_values().unique()
tv_table = pd.DataFrame(index=tv_index, columns=['H', 'g1', 'e1', 's1', 's3']).fillna('')

#Inhalt kombinieren und in Zeitzone einfügen.
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 = ''

#Zeitzone hinzufügen
for h in range(len(tv_index)):
    tv_table['H'].iloc[h] = int(tv_index[h][-2:])
tv_table.columns = ['H', 'NHK-Synthese', 'E-Tele', 'BS', 'BSP']

Datenformung (2)

detail_table = data.stack().reset_index()
detail_table.drop(columns='level_0', inplace=True)
detail_table.columns = ['Art', 'Wert']
detail_table.set_index('Art', drop=True, inplace=True)

Datenformung (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>Privater Programmplan</title> <!-- #1 -->
  </head>
  <body>
    <h2>&nbsp;Ich habe einen Original-Programmführer mit der NHK-Programmführer-API erstellt.{date}Auflage</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>Informationsbereitstellung:NHK</div> <!-- #5 -->
</body>
</html>

Die folgenden Inhalte wurden zu den Definitionsinformationen hinzugefügt.

  1. Titel: Seitentitel
  2. h2: Überschrift + {Datum}
  3. Programmtabelle der 4 Stationen Tabelle {Tabelle} -> Tabelle
  4. Programmdetails Tabelle {Tabelle1} -> Tabelle1
  5. Kreditanzeige
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)

Klicken Sie auf ▼, um zu den detaillierten Programmdaten mit dem Link auf der Seite zu blättern. スクリーンショット 2020-04-07 16.08.21.png スクリーンショット 2020-04-07 16.08.48.png

Referenzseite

Zusammenfassung

Recommended Posts

Ich habe einen Original-Programmführer mit der NHK-Programmführer-API erstellt.
Verwendung der NHK-Programmführer-API
Ich habe versucht, die checkio-API zu verwenden
Erstellen Sie eine Anwendung mit der Spotify-API
Ich habe versucht, die BigQuery-Speicher-API zu verwenden
Ich habe mein eigenes Recherchetool mit der Gesetzes-API [Smart Roppo] erstellt.
Ich habe in der Bibliothek nach der Verwendung der Gracenote-API gesucht
Ich habe versucht, die Google Cloud Vision-API zu verwenden
Ich habe einen LINE BOT erstellt, der mithilfe der Flickr-API ein Bild von Reis-Terroristen zurückgibt
Ich habe einen Ansible-Installer gemacht
Ich habe versucht, die API von Sakenowa Data Project zu verwenden
Ich habe mit Lambda eine App erstellt, die LINE über die Qiita-API über "Likes" informiert.
Versuchen Sie es mit der Twitter-API
Ich habe einen Xubuntu-Server erstellt.
Ich habe versucht, die Qiita-API zu berühren
Versuchen Sie es mit der Twitter-API
Ich habe mit Docker eine API erstellt, die den vorhergesagten Wert des maschinellen Lernmodells zurückgibt
Ich habe ein VGG16-Modell mit TensorFlow gemacht (unterwegs)
Versuchen Sie es mit der PeeringDB 2.0-API
Ich habe ein automatisiertes Programm zum Einfügen von Squishy in Excel erstellt
[Python] Ich habe versucht, Daten mit der API von Wikipedia zu sammeln
Ich habe Chatbot mit LINE Messaging API und Python erstellt
[Für Anfänger] Ich habe versucht, die Tensorflow-Objekterkennungs-API zu verwenden
Ich habe versucht, ein Programm zu erstellen, um die Fehlersuche von Saiseriya zu lösen (Hinweis)
Ich habe ein Programm erstellt, das die Fehlersuche in Sekunden löst
Ich habe versucht, die COTOHA-API zu verwenden (es gibt auch Code auf GitHub).
Ich habe eine KI erstellt, die ein Bild mit Saliency Map gut zuschneidet
Ich habe Chatbot mit der LINE Messaging API und Python (2) ~ Server ~ erstellt
Ich habe ein Programm erstellt, das den Tierkreis mit tkinter automatisch berechnet
[Kaggle] Ich habe mit dem Titanic-Tutorial eine Sammlung von Problemen erstellt
Ich habe die Naro-Roman-API 2 ausprobiert
Ich habe einen Line-Bot mit Python gemacht!
Ich habe einen Anpanman-Maler diskriminiert
Ich habe ein Angular Starter Kit gemacht
Ich habe die neuartige API von Naruro ausprobiert
Ich habe versucht, verschiedene Sätze mit der automatischen Zusammenfassungs-API "summpy" zusammenzufassen.
Ich habe ein Programm erstellt, um die Größe einer Datei mit Python zu überprüfen
Ich habe den APL-Teil mit der Alexa-Fertigkeit "Industry Term Conversion" erstellt.
Erstellt ein Bildunterscheidungsmodell (cifar10) unter Verwendung eines Faltungs-Neuronalen Netzwerks
Versuchen Sie, die Kraken-API mit Python zu verwenden
Ich habe ein Pay-Management-Programm in Python erstellt!
Ich habe versucht, YOUTUBE Data API V3 zu verwenden
Ich bin auf die Hatena Keyword API gestoßen
Ich habe eine Online-Frequenzanalyse-App erstellt
Ich habe ein alternatives Modul für japandas.DataReader erstellt
Tweet mit der Twitter-API in Python
Ich habe mit Docker eine Anaconda-Umgebung erstellt!
Eine Einführung in die Programmleistungsoptimierung
Anfänger: Ich habe einen Launcher mit dem Wörterbuch erstellt
Ich habe versucht, die UnityCloudBuild-API von Python zu verwenden
Ich habe versucht, die COTOHA-API zu berühren
Ich möchte ein Automatisierungsprogramm erstellen!
Spielen Sie mit Dajare mithilfe der COTOHA-API
Zeichnen Sie benutzerdefinierte Ereignisse mit der Shotgun-API auf
Als ich versuchte, die Computer Vision API von Microsoft zu verwenden, erkannte ich das Galapagos-Zeichen "Stop".
Ich habe einen Appdo-Befehl erstellt, um Befehle im Kontext der App auszuführen
Mit LINEBot habe ich eine Anwendung erstellt, die mich über die "Buszeit" informiert.
Erstellen Sie mithilfe der COTOHA-API eine App, die gut mit Berichten von Personen funktioniert
Ich habe mit Python und BigQuery ein internes Peer-Bonus-Tool (nur Aggregation) erstellt
Ich habe ein Programm erstellt, um Wörter im Fenster nachzuschlagen (vorherige Entwicklung)
Ich habe ein Skript erstellt, das das aktive Fenster mit win32gui von Python aufzeichnet