[PYTHON] Si vous essayez de créer un nuage de mots avec des commentaires de mangas WEB, il est intéressant de comprendre visuellement de quel genre de manga il s'agit.

introduction

Je lis des mangas WEB de temps en temps, mais il y en a tellement que je ne sais pas lequel lire. Je me suis demandé si les commentaires pouvaient être utilisés comme index pour choisir le manga à lire. Les mangas populaires ont beaucoup de commentaires, et même s'il y a peu de commentaires, il y a beaucoup de mangas intéressants. Je pense donc analyser les commentaires de différentes manières, mais dans un premier temps, lorsque j'ai fait les commentaires dans un nuage de mots, je pouvais saisir visuellement les commentaires et comprendre intuitivement s'il s'agissait d'un manga intrigant. J'ai pu le voir.

En sélectionnant le manga dans une nouvelle perspective basée sur le nuage de mots, j'espère devenir l'entrée du manga que l'écrivain a durement écrit et contribuer à la revitalisation du monde du manga. Est-ce un peu exagéré?

environnement

python 3.7.6 selenium 3.141.0 ChromeDriver 80.0.3987.16 wordcloud 1.6.0 BeautifulSoup 4.8.2 mecab-python-windows 0.996.3

Cible

Image fixe Niko Niko

Site de référence WEB Manga Word Cloud

Nous avons créé un site ci-dessous où vous pouvez voir les résultats. Cliquez sur le nuage de mots pour accéder à ce manga.

WEB Manga Word Cloud

Résultat de sortie de nuage de mots

Voici le résultat de la sortie. Vous vous demandez quel genre de manga il s'agit? Avec des commentaires tels que «beau» et «j'aime», je pense que je veux lire un peu.

image.png

Vérifiez les termes

Nous allons gratter, alors vérifiez les termes.


Extrait des Conditions d'utilisation de niconico
** 5 interdictions ** Les actes suivants sont interdits concernant l'utilisation de "niconico" par les utilisateurs.

Veillez donc à ne pas lui appliquer une charge excessive. Il est exécuté sans fonctionner en continu, en prenant en sandwich le sommeil, etc.

Flux de processus

Exécutez le processus selon le flux suivant.

  1. Connectez-vous à Nico Nico
  2. Affichez les images fixes Nico Nico dans l'ordre de mise à jour et obtenez la liste des URL à partir de la liste des mangas
  3. Transition vers les détails du dessin animé
  4. Obtenez des commentaires
  5. Traitez les commentaires avec WordCloud

Connectez-vous à Nico Nico

Vous devez vous connecter pour voir les images fixes souriantes. Ici, nous utiliserons le sélénium pour nous connecter à Nico Nico en arrière-plan.

On suppose que le sélénium et le pilote Chrome sont installés. ChromeDriver

Import de bibliothèque

Importez les bibliothèques requises ci-dessous.

from selenium import webdriver
from selenium.webdriver.common.by import By
from bs4 import BeautifulSoup
import urllib.parse

Construction de WebDriver

Définissez les options et créez le pilote. L'option --headless est spécifiée pour fonctionner en arrière-plan. De plus, le timeout est fixé à 30 secondes avec set_page_load_timeout.

options = webdriver.ChromeOptions()
options.add_argument('--headless')
options.add_argument('--disable-gpu')
options.add_argument('--window-size=1024,768')

driver = webdriver.Chrome(options=options)
driver.set_page_load_timeout(30)

S'identifier

Tout d'abord, accédez à https: //account.nicovideo.jp/login? Site = seiga & next_url =% 2F. Ensuite, j'obtiens les éléments d'adresse e-mail et de mot de passe par ID et je définis chacun. Enfin, cliquez sur le bouton de connexion. Veuillez remplacer «[adresse e-mail]» et «[mot de passe]» par les vôtres.

driver.get('https://account.nicovideo.jp/login?site=seiga&next_url=%2F')

e = driver.find_element(By.ID, "input__mailtel")
e.send_keys('[adresse mail]')
e = driver.find_element(By.ID, "input__password")
e.send_keys('[mot de passe]')

e = driver.find_element(By.ID, 'login__submit')
e.click()

Vous pouvez également vous connecter en utilisant le message des requêtes, mais dans ce cas, vous devez obtenir ʻauth_id` à partir de l'écran de connexion et le publier également. Le traitement autour de cela est inutile avec le sélénium. De plus, si l'écran est mis à jour avec JavaScript, etc. après l'affichage de l'écran, cela prendra beaucoup de problèmes avec les demandes, mais avec le sélénium, il est pratique de pouvoir traiter sans se soucier de cela.

Afficher les images fixes Nico Nico dans l'ordre de mise à jour et obtenir la liste des URL à partir de la liste des mangas

Obtenez une liste de mangas par ordre de mise à jour

Nous obtiendrons une liste d'images fixes dans les états suivants. image.png Obtenez l'URL du manga de la liste des mangas sur chaque page d'une liste tout en changeant de page. Compte tenu de la charge, nous obtiendrons ici 1 à 3 pages.

url_root = 'https://seiga.nicovideo.jp'
desc_urls = []

for n in range(1, 4):
    target_url = urllib.parse.urljoin(url_root, 'manga/list?page=%d&sort=manga_updated' % n)
    try:
        driver.get(target_url)
        html = driver.page_source.encode('utf-8')
        soup = BeautifulSoup(html, 'html.parser')

        # change to loop
        for desc in soup.select('.mg_description'):
            title = desc.select('.title')
            desc_urls.append(urllib.parse.urljoin(url_root, title[0].find('a').get('href')))
    except Exception as e:
        print(e)
        continue

Enregistrez l'URL du manga dans la liste desc_urls. Définissez l'URL de chaque page dans target_url. Étant donné que le contrôle de page est effectué en définissant un nombre dans page = de QueryString, définissez le numéro de la page que vous souhaitez y accéder.

Obtenez la page avec driver.get. Après l'avoir obtenu, récupérez le code HTML du contenu avec driver.page_source.encode ('utf-8') et réglez-le sur BeautifulSoup pour une manipulation facile. Vous pouvez le gérer sans le définir sur BeautifulSoup, mais je suis plus habitué à celui-ci, alors j'ai juste choisi celui-ci. WebDriver peut également utiliser XPath, donc je pense que c'est correct tel quel.

Puisque le select de BeautifulSoup est un sélecteur CSS, nous obtenons le .mg_description et le .title dedans et le href de la balise ʻa` y sont définis. image.png

Vous avez maintenant une liste de titres de manga et d'URL sur la page.

Transition vers les détails du dessin animé

Obtenir la page par URL dans la liste

Récupère la page avec l'URL stockée dans desc_urls. L'acquisition se fait avec driver.get (desc_url). Une fois que vous l'avez obtenu, récupérez le HTML de la même manière et réglez-le sur BeautifulSoup.

for desc_url in desc_urls:
    try:
        driver.get(desc_url)

        html = driver.page_source.encode('utf-8')
        soupdesc =  BeautifulSoup(html, 'html.parser')

Obtenez et confirmez le titre et l'auteur

Récupérez l'élément avec l'ID ng_main_column dans la balise div. Récupérez les éléments de la classe `.main_title ', et obtenez le titre et l'auteur. Essayez d'imprimer et voyez si vous pouvez l'obtenir correctement.

        maindesc = soupdesc.find('div', id = 'mg_main_column')

        titlediv = maindesc.select('.main_title')[0]

        title = titlediv.find('h1').text.strip()
        author = titlediv.find('span').text.strip()

        print(title)
        print(author)

La structure du HTML est la suivante. image.png

Obtenez l'URL du sous-titre et les détails de la liste des épisodes et de la transition

Puisque chaque épisode est dans l'élément dont la classe est .episode_item, récupérez la liste avec le sélecteur CSS select. Étant donné que plusieurs éléments sont récupérés, obtenez l'URL du sous-titre et les détails de chaque élément.

        for eps in soupdesc.select('.episode_item'):
            eps_ttl_div = eps.select('.title')
            eps_title = eps_ttl_div[0].find('a')
            eps_url = urllib.parse.urljoin(url_root, eps_title.get('href'))
            eps_t = eps_title.text
            print(eps_t)

            try:
                driver.get(eps_url)
                html = driver.page_source.encode('utf-8')
                soupeps = BeautifulSoup(html, 'html.parser')

Le titre est tiré de la classe .title et l'URL est tirée de la balise a href. image.png J'obtiens l'écran de détails avec driver.get (eps_url). Une fois obtenu, réglez-le sur «Belle soupe».

Obtenez des commentaires

Obtenez une liste de commentaires et définissez le texte qu'il contient sur un tableau

La classe récupère les éléments pour .comment_list et tous les .comments qu'il contient. J'obtiens la chaîne avec c.text et la mets dans le tableau comments_text. Le paramètre du tableau utilise la notation d'inclusion de liste. Il semble que la notation d'inclusion de python soit parfaite pour Turing.

                crlist = soupeps.select('.comment_list')
                comments = crlist[0].select('.comment')
                comments_text = [c.text for c in comments]

La structure HTML de la partie commentaire est la suivante. Il semble que vous puissiez également trouver avec comment_viewer. Spécifions cette zone d'une manière agréable. image.png

Traiter les commentaires dans Word Cloud

Analyse morphologique avec MeCab

La chaîne de caractères de commentaire acquise est analysée morphologiquement par MeCab. Ajoutons le montant de l'importation.

import MeCab

Effectuer une analyse morphologique avec «parse» de MeCab.

                m = MeCab.Tagger('')
                parsed = m.parse('。'.join(comments_text))

Le résultat de l'analyse morphologique est le suivant.

'Comme prévu\t substantif,Racine du verbe adjectif,*,*,*,*,Comme prévu,Sasuga,Sasuga\tonne\t assistant,Auxiliaire,*,*,*,*,À,ré,ré\n pas\t adjectif,Indépendance,*,*,apocalypse,Connexion continue,Absent,Naka,Naka\n\t verbe auxiliaire,*,*,*,Spécial,Forme basique,Ta,Ta,Ta\nwww\t substantif,Général,*,*,*,*,*\n。\symbole t,Phrase,*,*,*,*,。,。,。\n il\t substantif,Synonyme,Général,*,*,*,Il,Unique,Unique\n est\t assistant,Assistance,*,*,*,*,Est,C,sensationnel\n Ustensiles d'écriture\t substantif,Général,*,*,*,*,Ustensiles d'écriture,Hicking,Hicking\à n\t assistant,Assistant de cas,Général,*,*,*,alors,De,De\n est\t assistant,Assistance,*,*,*,*,Est,C,sensationnel\n Oui\t verbe,Indépendance,*,*,Cinq étapes, La ligne,Type continu,y a-t-il,Ali,Ali\n\t verbe auxiliaire,*,*,*,Spécial / masse,Forme imparfaite,Masu,Mase,Mase\n\t verbe auxiliaire,*,*,*,Type immuable,Forme basique,Hmm,Vers le bas,Vers le bas\n…\symbole t,Général,*,*,*,*,…,…,…\n。\symbole t,Phrase,*,*,*,*,。,。,。\n Kisigai\t substantif,Général,*,*,*,*,*\n。\symbole t,...

Puisque \ n est ligne par ligne, sortez ligne par ligne avec splitlines et obtenez la forme de base de la morphologie à partir du 7e côté droit séparé par \ t. Il exclut les verbes et les verbes, les synonymes et certaines chaînes telles que "suru" et "teru". Si vous ne l'excluez pas, lorsque vous créez un nuage de mots, il sera affiché en grosses lettres.

                words = ' '.join([x.split('\t')[1].split(',')[6] for x in parsed.splitlines()[:-1] if x.split('\t')[1].split(',')[0] not in ['Particule', 'Verbe auxiliaire'] and x.split('\t')[1].split(',')[1] not in ['Synonyme'] and x.split('\t')[1].split(',')[6] not in ['Faire', 'Teru', 'Devenir', 'M.', 'alors', 'cette', 'y a-t-il']])

Créer un nuage de mots avec Word Cloud

Créez un nuage de mots avec to_file dans WordCloud. comic_titles``` comic_subtitles``` comic_images comic_urls est une variable déclarée dans un tableau et sera utilisée plus tard lors de la création de HTML. Chacun contient un titre, un sous-titre, un nom d'image et une URL.

Lors de la création de WordCloud, la police, la couleur d'arrière-plan et la taille sont spécifiées. La police utilisée est "Ranobe POP", qui semble être souvent utilisée sur YouTube. Veuillez spécifier cette zone comme vous le souhaitez.

Je produis dans un fichier avec wordcloud.to_file.

                if len(words) > 0:
                    try:
                        comic_titles.append(title)
                        comic_subtitles.append(eps_t)
                        comic_images.append('%d.png' % (comic_index))
                        comic_urls.append(eps_url)
                        wordcloud = WordCloud(font_path=r"C:\\WINDOWS\\Fonts\\Ranobe POP.otf", background_color="white", width=800,height=800).generate(words)
                        wordcloud.to_file("[Chemin que vous souhaitez enregistrer]/wordcloud/%d.png " % (comic_index))
                        comic_index += 1
                    except Exception as e:
                        print(e)

Le résultat de sortie est celui affiché en premier. Créez du HTML avec ces derniers et publiez-le sur le site.

Site publié

https://comic.g-at.net/

Lorsque vous accédez à l'URL ci-dessus, la liste suivante de nuages de mots s'affiche. Cliquez sur le nuage de mots pour ouvrir le manga. image.png

en conclusion

Il y a beaucoup de commentaires tels que Jump + et Manga One qui sont assez durs, mais Nico Nico a beaucoup de commentaires doux. Après tout, vous avez l'habitude de commenter.

Ce serait formidable si nous pouvions non seulement créer un nuage de mots, mais aussi analyser diverses choses et ouvrir la porte à des chefs-d'œuvre difficiles à rencontrer jusqu'à présent.

Recommended Posts

Si vous essayez de créer un nuage de mots avec des commentaires de mangas WEB, il est intéressant de comprendre visuellement de quel genre de manga il s'agit.
WEB grattage avec python et essayez de créer un nuage de mots à partir des critiques
Si vous souhaitez créer Word Cloud.
[CleanArchitecture avec Python] Appliquez CleanArchitecture à une API simple étape par étape, et essayez de comprendre "quel type de changement est fort" dans la base de code.
Notez ce que vous voulez faire à l'avenir avec Razpai
Créez le nuage de mots de Qiita à partir de l'historique de votre navigateur
[Python] Qu'est-ce qu'une tranche? Une explication facile à comprendre de son utilisation avec un exemple concret
Quand il est difficile de copier ce que vous avez construit avec vue
Essayez de créer un type de service Web avec un langage de balisage 3D
Que faire si vous obtenez une erreur de décodage Unicode avec l'installation de pip
Est-il possible de se lancer dans une entreprise de pré-cotation et de faire fortune avec des stock-options?
Comme c'est le 20e anniversaire de la formation, j'ai essayé de visualiser les paroles de Parfum avec Word Cloud
2.Faites un arbre de décision à partir de 0 avec Python et comprenez-le (2. Bases du programme Python)
Que faire lorsque TypeError se produit au minimum et au maximum de numpy
Créez un arbre de décision à partir de 0 avec Python et comprenez-le (4. Structure des données)
Faisons un noyau jupyter
Quel est le dernier langage de programmation que vous apprenez dans votre vie? (Si vous voulez rattraper un club avec un salaire à vie de 300 millions de yens)
Créons une application Web de conversion A vers B avec Flask! De zéro ...
[OpenCV] Lorsque vous voulez vérifier s'il est lu correctement avec imread
Si vous voulez créer un bot discord avec python, utilisons un framework
Si vous essayez d'installer Python2 pip après avoir installé Python3 pip et qu'il est rejeté
Essayez-le avec JupyterLab en Python japonais Word Cloud.
Essayez de créer un code de "décryptage" en Python
Essayez de créer un groupe de dièdre avec Python
Essayez de créer une table d'enregistrement de bataille avec matplotlib à partir des données de "Schedule-kun"
Que faire si vous obtenez une erreur de mémoire lors de la conversion de PySparkDataFrame en PandasDataFrame
Comprendre le rendement Python Si vous mettez le rendement dans une fonction, elle se transforme en générateur