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é?
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
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.
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.
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.
Exécutez le processus selon le flux suivant.
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
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
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)
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.
Nous obtiendrons une liste d'images fixes dans les états suivants. 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.
Vous avez maintenant une liste de titres de manga et d'URL sur la page.
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')
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.
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
.
J'obtiens l'écran de détails avec driver.get (eps_url)
.
Une fois obtenu, réglez-le sur «Belle soupe».
La classe récupère les éléments pour .comment_list
et tous les .comment
s 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.
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é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.
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.
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