Python: lecture de données JSON à partir de l'API Web

Tout d'abord, qu'est-ce que JSON?

Il semble que la structure des données soit facile à comprendre pour les humains et les ordinateurs (en gros) [Qu'est-ce que JSON? -Qiita](http://qiita.com/SotaSuzuki/items/c3b46c4e24c1ca9b4d37#%E6%96%87%E5%AD%97%E5%88%97%E3%81%AE%E8%A1 % A8% E7% 8F% BE)


Il semble que vous puissiez lire les données json avec python en important la bibliothèque json.

Il semble que si vous le lisez, vous pouvez le gérer de la même manière que le type de dictionnaire. (Je ne suis pas sûr du type dictinaire, donc je vais étudier ici.)

À propos du type de dictionnaire

--Le type de dictionnaire est un ensemble (élément) de clé et de valeur

Extraire la valeur en spécifiant la clé

test01.py


# -*- coding: utf-8 -*-

dict = {"name": "tamago", "color": "yellow"}

#Spécifiez la clé et récupérez la valeur
print dict["name"]
print dict["color"]

test01.Résultat de sortie de py


tamago
yellow

Si vous essayez de récupérer une clé qui n'existe pas, vous obtiendrez une erreur.

Obtenez une liste de clés et de valeurs

test02.py


# -*- coding: utf-8 -*-

dict = {"name": "tamago", "color", "yellow"}

#Obtenez une liste de clés
keyList = dict.keys()
print keyList

#Obtenez une liste de valeurs
vakList = dict.values()
print valList

#Obtenez une liste de clés et de valeurs
list = dict.items()
print list

test02.Résultat de sortie de py


['color', 'name']
['yellow', 'tamago']
[('color', 'yellow'), ('name', 'tamago')]

Je ne sais pas comment l'obtenir car il n'y a pas d'ordre des éléments dans le type de dictionnaire

J'ai une idée approximative du dictionnaire! !!

Obtenir des données JSON à partir de l'API Web

L'API Web utilisée cette fois est l'API d'acquisition de commentaires de Twicas (API d'acquisition de commentaires --Twicas).

Lors de la récupération de données JSON depuis l'API Web, importez ʻurllibet utilisez la méthode pour l'obtenir. Pour rendre les données récupérées exploitables avec python, importezjson` et utilisez la méthode

test02.py


# -*- coding: utf-8 -*-

import urllib
import json
import sys
import codecs

#Vous pouvez maintenant éliminer les caractères qui ne peuvent pas être convertis en cp932
sys.stdout = codecs.getwriter(sys.stdout.encoding)(sys.stdout, errors='ignore')

#Obtenir le résultat d'une chaîne au format JSON à partir de l'API Web
def dataGet():

    #Schéma d'URI
    url = 'http://api.twitcasting.tv/api/commentlist?'

    #Données de paramètre URI
    param = {
        'user': 'tamago324_pad',    #ID de la personne que vous souhaitez obtenir
        'type': 'json'             #Spécifier les données à acquérir
    }

    #Création d'une chaîne de paramètres URI
    paramStr = urllib.urlencode(param)  # type=json&user=tamago324_En forme de coussin

    #Créer un objet à lire
    readObj = urllib.urlopen(url + paramStr)

    #Obtenez JSON à partir de l'API Web
    response = readObj.read()

    # print type(response)  # >> <type 'str'>

    return response

#Convertir les données obtenues à partir de l'API Web en JSON
def jsonConversion(jsonStr):

    #Convertir les données JSON obtenues à partir de webAPI dans un formulaire pouvant être utilisé avec python
    data = json.loads(jsonStr)
    return data

    #Le japonais est u'\u767d'Parce que ça devient comme, convertir en Unicode
    # return json.dumps(data[0], ensure_ascii=False)

#Heure de publication du commentaire h:mm:Convertir en ss
def getElapsedTime(duration):

    secStr = ""
    minStr = ""

    hourInt = duration / 3600
    minInt = (duration -3600 * hourInt) / 60
    secInt = duration % 60

    if minInt <= 9:
        minStr = "0" + str(minInt)
    else:
        minStr = str(minInt)

    if secInt <= 9:
        secStr = "0" + str(secInt)
    else:
        secStr = str(secInt)

    if hourInt >= 1:
        return str(hourInt) + ":" + minStr + ":" + secStr
    else:
        return minStr + ":" + secStr

if __name__ == '__main__':

    resStr = dataGet()
    res = jsonConversion(resStr)

    #Afficher les données acquises
    for item in res:
        print getElapsedTime(item['duration']) + " " + item['userstatus']['name'] + " " + item['message']

10:14 Il se trouve que c'est un test
09:49 Il se trouve que c'est un commentaire

Obtenir des données JSON à partir de l'API Web

def jsonGet (): obtient des données JSON de webAPI </ strong> Je crée une chaîne de paramètres URI à partir du dictionnaire avec ʻurllib.urlencode () . Si plusieurs chaînes sont renvoyées par cette méthode sous la forme clé = valeur, elles seront combinées avec & (exemple: clé1 = valeur1 & clé2 = valeur2`). Il n'y a pas d'ordre dans le dictionnaire, vous ne pouvez donc pas spécifier l'ordre dans lequel ils sont combinés.

ʻUrllib.urlopen () `crée un objet pour lire les données JSON

Obtention de données JSON depuis l'API Web avec la méthode de l'objet créé (ʻobject.read () ) La valeur de retour semble être de type str`

Convertissez les données acquises en JSON qui peuvent être gérées par Python

Convertissez le JSON obtenu par json.loads () pour qu'il puisse être manipulé par python. Cependant, comme il est renvoyé sous forme d'unicode, le japonais devient comme \ u3063 json.dumps (data, ensure_ascii = False) a pu afficher le japonais fermement! Je pensais que c'était une chaîne ... data was list` ... Est-ce le seul moyen de convertir unicode en str un par un ...

Je m'inquiétais de ce qu'il fallait faire, mais j'ai essayé de n'obtenir qu'un seul commentaire, et quand je l'ai affiché avec prinnt data [0] ['message'], il s'affichait fermement en japonais! !! !! Cependant, le commentaire contenait , et quand j'ai essayé de l'afficher, j'ai eu l'erreur ʻUnicodeEncodeError: le codec 'cp932' ne peut pas encoder le caractère u '\ ua4b3' en position 0: séquence multi-octets illégale`.

Que faire lorsque les caractères ne peuvent pas être affichés sur la console en raison de UnicodeEncodeError </ b> Lorsque vous souhaitez imprimer une chaîne de caractères Unicode qui contient parfois des caractères qui ne peuvent pas être exprimés par cp932 sur la console Windows - Journal Hatena de Yasukazu Nishio sys.stdout = codecs.getwriter (sys.stdout.encoding) (sys.stdout, errors = 'ignore') Quoi qu'il en soit, vous pouvez masquer les caractères qui ne peuvent pas être exprimés par cp932 (le mécanisme est inconnu .. Je pense à le clarifier maintenant)

En ce moment, je le fais sur la console, mais je pense que cela sera meilleur s'il peut être affiché sur les applications Windows, etc.

Dictionnaire-Introduction à Python Bibliothèque: json --Life with Python 20.5. Urllib - Accéder à n'importe quelle ressource par URL - Documentation Python 2.7.x Essayez d'utiliser l'API Yahoo avec le mémorandum Python-BTY Obtenir, publier un mémo de communication en Python --Qiita Obtenez une chaîne JSON Unicode comprenant le japonais. --Qiita 18.2. Json - Encodeur et décodeur JSON - Documentation Python 2.7.x

Recommended Posts