[PYTHON] C'est pourquoi j'analyserai les commentaires du débat du chef de parti de Nico Nama à la Chambre des représentants.

Contexte

Je pense que l'interdiction des élections en ligne sera levée et que la fourniture d'informations électorales par Internet deviendra plus populaire, et l'utilisation de mauvaises directions est évidente.

Le 29 novembre 2014, un débat des chefs de parti a eu lieu avec les étudiants de Nico avant l'élection de la Chambre des représentants. Je voudrais rendre hommage aux chefs de parti qui sont apparus sur le "site vidéo biaisé" mentionné par le Dr Azumi et qui ont participé à des discussions, et ont également cherché à savoir s'ils étaient réellement biaisés.

Code source https://github.com/mima3/analyze_election

Résultats d'analyse

[Élection à la Chambre des représentants 2014] Débat des chefs de file du net

http://needtec.sakura.ne.jp/analyze_election/page/nicolive/lv200730443

En conclusion, dans les sondages d'opinion des journaux, l'ombre de la «prochaine génération» attire l'attention, il y a des gens féroces qui font des centaines de commentaires à eux seuls, et il y a plus de dirigeants Yoshida du Parti socialiste que de dirigeants Kaieda du parti d'opposition Le résultat était qu'il a été extrait, honnêtement, et aussi un bogue.

Débat des chefs de parti au Japan Press Club (Jiji Press Channel)

http://needtec.sakura.ne.jp/analyze_election/page/nicolive/lv201303080

Comme prévu, le nombre de commentaires est inférieur à celui du samedi soir. Cependant, il y a des gens qui commentent environ 200 seuls. Travail ou école.

Après tout, les mots «Abe» et «next generation» sont souvent extraits. Cependant, il y a une présence de «Kaieda» et de «démocrate» depuis l'époque où Nicosei l'a parrainé.

Aussi, pourquoi y a-t-il autant de mots tels que «Tsubaki» et «Asahi» dans l'affaire Tsubaki dans le débat du chef du parti? (Stick)

Comment obtenir des commentaires de Nico Nico Live Broadcast en Python

Pour recevoir des commentaires sur Nico Nico Live Broadcasting, vous devez d'abord être un membre Premium. Pour les membres réguliers, la limite supérieure est d'environ 1000.

Après cela, vous pouvez l'obtenir en suivant les étapes ci-dessous.

  1. Connectez-vous sur la page de connexion en utilisant votre adresse e-mail et votre mot de passe pour obtenir user_session
  2. Accédez à http://watch.live.nicovideo.jp/api/getplayerstatus pour obtenir l'adresse IP et le port du serveur de messagerie et l'ID utilisateur.
  3. Accédez à http://watch.live.nicovideo.jp/api/getwaybackkey pour obtenir le waybackkey. Vous pouvez obtenir des commentaires passés en combinant cette clé avec votre ID utilisateur.
  4. Connectez-vous au serveur de messagerie pour obtenir des commentaires. À ce stade, vous pouvez vous connecter soit par communication HTTP, soit par communication SOCKET. Pour la communication HTTP, il est nécessaire de se connecter au port obtenu en soustrayant 2725 du numéro de port.
  5. Puisque vous ne pouvez obtenir que 1000 éléments avec un seul GET, obtenez tous les commentaires lors de la configuration lorsque cela est approprié.

Le code spécifique ressemble à ceci:

niconico.py


# coding: utf-8
import sys
import cookielib
import cgi
import urllib
import urllib2
from lxml import etree
import socket
import datetime
import time
import json

class NicoCtrl():
    def __init__(self, nicovideo_id, nicovideo_pw):
        self.nicovideo_id = nicovideo_id
        self.nicovideo_pw = nicovideo_pw
        #S'identifier
        cj = cookielib.CookieJar()
        self.opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(cj))
        req = urllib2.Request("https://secure.nicovideo.jp/secure/login")
        req.add_data( urllib.urlencode( {"mail": self.nicovideo_id, "password":self.nicovideo_pw} ))
        res = self.opener.open(req).read()
        if not 'user_session' in cj._cookies['.nicovideo.jp']['/']:
            raise Exception('PermissionError')

    def _getjson(self, url, errorcnt):
        #JSON peut être coupé et revenir en cours, alors réessayez le traitement
        try:
            res = self.opener.open(url, timeout=100).read()
            return json.loads(res)
        except ValueError:
            if errorcnt < 3:
                errorcnt = errorcnt + 1
                return self._getjson(url, errorcnt)
            else:
               raise

    def get_live_comment(self, movie_id):
        self.movie_id = movie_id


        #Obtenir l'emplacement de distribution vidéo(getflv)
        res = self.opener.open("http://watch.live.nicovideo.jp/api/getplayerstatus?v="+self.movie_id).read()
        root = etree.fromstring(res)
        messageServers = root.xpath('//ms')
        if len(messageServers) == 0:
            raise Exception('UnexpectedXML')

        user_ids = root.xpath('//user_id')
        if len(user_ids) == 0:
            raise Exception('NotfoundUserId')
        user_id = user_ids[0].text

        thread_id = messageServers[0].find('thread').text
        addr = messageServers[0].find('addr').text
        port = int(messageServers[0].find('port').text) - 2725
        
        #Obtenez waybackkey
        waybackkeyUrl = ('http://watch.live.nicovideo.jp/api/getwaybackkey?thread=%s' % thread_id)
        req = urllib2.Request(waybackkeyUrl)
        res = self.opener.open(waybackkeyUrl).read()
        waybackkey = cgi.parse_qs(res)['waybackkey'][0]

        msUrl = 'http://%s:%d/api.json/thread?' % (addr, port)
        chats = []
        req = urllib2.Request(msUrl)
        when = '4294967295'
        while True:
            data = {
                'thread' : thread_id, 
                'version' : "20061206",
                'res_from' : '-1000',
                'waybackkey' : waybackkey,
                'user_id' : user_id,
                'when': when,
                'scores' : '1'
            }
            list = self._getjson(msUrl+urllib.urlencode(data), 0)
            chatcnt = 0
            insertdata = []
            for l in list:
                if 'chat' in l:
                    if chatcnt == 0:
                        when = int(l['chat']['date']) - 1
                    if l['chat']['content'] != '/disconnect':
                        insertdata.append(l['chat'])
                    chatcnt += 1
            chats = insertdata + chats
            if chatcnt == 0:
                break
        return chats


nicolive.py


# coding: utf-8
import sys
from niconico_ctrl import NicoCtrl
import json

def main(argvs, argc):
    if len(argvs) != 4:
        print ('python nicolive.py email pass lv142315925')
        return 1
    nicovideo_id = argvs[1]
    nicovideo_pw = argvs[2]
    move_id = argvs[3]

    t = NicoCtrl(nicovideo_id, nicovideo_pw)
    chats = t.get_live_comment(move_id)
    f = open(move_id + '.json', 'w')
    f.write(json.dumps(chats))
    f.close()
    return 0

if __name__ == '__main__':
    argvs = sys.argv
    argc = len(argvs)
    sys.exit(main(argvs, argc))

Ce script générera un fichier JSON contenant des informations de commentaire en l'exécutant comme suit.

 python nicolive.py adresse e-mail mot de passe lv200730443

Après cela, vous pouvez analyser les commentaires de Nico en analysant morphologiquement les commentaires dans le fichier JSON créé, en extrayant des mots, en totalisant pour chaque utilisateur et en faisant autre chose, Tae-chan.

référence

** niconico message (commentaire) Explication des balises de serveur et comment envoyer ** http://blog.goo.ne.jp/hocomodashi/e/3ef374ad09e79ed5c50f3584b3712d61

** Obtenez des commentaires sur les vidéos de Nico Nico ** http://d.hatena.ne.jp/MOOOVe/20120229/1330512626

Recommended Posts

C'est pourquoi j'analyserai les commentaires du débat du chef de parti de Nico Nama à la Chambre des représentants.
C'est pourquoi je vais chercher les tweets de l'élection de la Chambre des représentants
C'est pourquoi j'analyserai la page d'accueil de chaque partie
C'est pourquoi je calcule le nombre de sièges pour le représentant proportionnel à l'élection de la Chambre des représentants