[PYTHON] Wenn Sie versuchen, eine Wortwolke mit Kommentaren von WEB-Manga zu erstellen, ist es interessant, visuell zu verstehen, um welche Art von Manga es sich handelt.

Einführung

Ich lese ab und zu WEB-Manga, aber es gibt so viele, dass ich nicht weiß, welche ich lesen soll. Ich dachte darüber nach, ob Kommentare als Index für die Auswahl des zu lesenden Mangas verwendet werden könnten. Beliebte Mangas haben viele Kommentare, und selbst wenn es nur wenige Kommentare gibt, gibt es viele interessante Mangas. Ich denke also darüber nach, die Kommentare auf verschiedene Arten zu analysieren, aber als ersten Schritt, als ich die Kommentare zu einer Wortwolke machte, konnte ich die Kommentare visuell erfassen und intuitiv verstehen, ob es sich um einen faszinierenden Manga handelte. Ich konnte es sehen.

Durch die Auswahl von Manga aus einer neuen Perspektive basierend auf der Wortwolke hoffe ich, der Eingang zu dem Manga zu werden, den der Autor hart geschrieben hat, und zur Wiederbelebung der Manga-Welt beizutragen. Ist es etwas übertrieben?

Umgebung

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

Ziel

Niko Niko Standbild

WEB Manga Word Cloud Referenzseite

Wir haben unten eine Website erstellt, auf der Sie die Ergebnisse sehen können. Klicken Sie auf die Wortwolke, um zu diesem Manga zu gelangen.

WEB Manga Word Cloud

Ergebnis der Word Cloud-Ausgabe

Das Folgende ist das Ausgabeergebnis. Fragen Sie sich, was für ein Manga das ist? Mit Kommentaren wie "schön" und "wie" denke ich, ich möchte ein wenig lesen.

image.png

Überprüfen Sie die Bedingungen

Wir werden kratzen, also überprüfen Sie die Bedingungen.


Auszug aus niconico Nutzungsbedingungen
** 5 Verbote ** Die folgenden Handlungen sind in Bezug auf die Verwendung von "niconico" durch Benutzer verboten.

Achten Sie daher darauf, dass Sie nicht übermäßig belastet werden. Es wird ausgeführt, während es nicht ununterbrochen läuft, den Schlaf einschließt usw.

Prozessablauf

Führen Sie den Prozess gemäß dem folgenden Ablauf aus.

  1. Melden Sie sich bei Nico Nico an
  2. Zeigen Sie Nico Nico-Standbilder in der Aktualisierungsreihenfolge an und rufen Sie die URL-Liste aus der Manga-Liste ab
  3. Übergang zu Cartoon-Details
  4. Holen Sie sich Kommentare
  5. Verarbeiten Sie Kommentare mit WordCloud

Melden Sie sich bei Nico Nico an

Sie müssen sich anmelden, um die lächelnden Standbilder zu sehen. Hier werden wir Selen verwenden, um uns im Hintergrund bei Nico Nico anzumelden.

Es wird davon ausgegangen, dass Selen und Chrome Driver installiert sind. ChromeDriver

Bibliotheksimport

Importieren Sie die erforderlichen Bibliotheken unten.

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

WebDriver-Konstruktion

Stellen Sie die Optionen ein und erstellen Sie den Treiber. Die Option "--headless" wird angegeben, um im Hintergrund zu arbeiten. Außerdem wird das Zeitlimit mit "set_page_load_timeout" auf 30 Sekunden eingestellt.

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)

Einloggen

Greifen Sie zunächst auf "https: //account.nicovideo.jp/login? Site = seiga & next_url =% 2F" zu. Als nächstes erhalte ich die E-Mail-Adresse und das Passwort nach ID und stelle sie ein. Klicken Sie abschließend auf die Schaltfläche Anmelden. Bitte ändern Sie "[E-Mail-Adresse]" und "[Passwort]" in Ihre eigene.

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

e = driver.find_element(By.ID, "input__mailtel")
e.send_keys('[Mail Adresse]')
e = driver.find_element(By.ID, "input__password")
e.send_keys('[Passwort]')

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

Sie können sich auch mit dem Anforderungsbeitrag anmelden. In diesem Fall müssen Sie jedoch die "auth_id" vom Anmeldebildschirm abrufen und ebenfalls veröffentlichen. Eine Verarbeitung um dieses herum ist mit Selen nicht erforderlich. Wenn der Bildschirm nach dem Anzeigen des Bildschirms mit JavaScript usw. aktualisiert wird, treten bei Anfragen große Probleme auf. Bei Selen ist es jedoch praktisch, ohne Bedenken darüber arbeiten zu können.

Zeigen Sie Nico Nico-Standbilder in der Aktualisierungsreihenfolge an und rufen Sie die URL-Liste aus der Manga-Liste ab

Holen Sie sich eine Liste der Manga in der Reihenfolge der Aktualisierung

Wir erhalten eine Liste der Standbilder in den folgenden Staaten. image.png Rufen Sie die Manga-URL der Manga-Liste auf jeder Seite in einer Liste ab, während Sie die Seiten wechseln. In Anbetracht der Belastung erhalten wir hier 1 bis 3 Seiten.

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

Speichern Sie die URL zum Manga in der Liste "desc_urls". Stellen Sie die URL zu jeder Seite in target_url ein. Da die Seitensteuerung durch Festlegen einer Nummer in page = von QueryString durchgeführt wird, legen Sie die Nummer der Seite fest, die Sie dort abrufen möchten.

Holen Sie sich die Seite mit driver.get. Nachdem Sie es erhalten haben, rufen Sie den HTML-Code des Inhalts mit "driver.page_source.encode (" utf-8 ") ab und setzen Sie ihn zur einfachen Handhabung auf" BeautifulSoup ". Sie können damit umgehen, ohne es auf "BeautifulSoup" zu setzen, aber ich bin eher an dieses gewöhnt, also habe ich mich für dieses entschieden. WebDriver kann auch XPath verwenden, daher denke ich, dass es in Ordnung ist.

Da das select von BeautifulSoup ein CSS-Selektor ist, erhalten wir das .mg_description und erhalten den .title darin und das href des a Tags dort gesetzt. image.png

Sie haben jetzt eine Liste von Manga-Titeln und URLs auf der Seite.

Übergang zu Cartoon-Details

Seite für URL in Liste abrufen

Holen Sie sich die Seite mit der in "desc_urls" gespeicherten URL. Die Erfassung erfolgt mit "driver.get (desc_url)". Sobald Sie es erhalten haben, rufen Sie den HTML-Code auf die gleiche Weise ab und setzen Sie ihn auf "BeautifulSoup".

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

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

Titel und Autor abrufen und bestätigen

Holen Sie sich das Element mit der ID ng_main_column im div-Tag. Holen Sie sich darin das Element der `.main_title'-Klasse und den Titel und den Autor. Versuchen Sie zu drucken und prüfen Sie, ob Sie es richtig bekommen können.

        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)

Die Struktur von HTML ist wie folgt. image.png

Holen Sie sich die URL zum Untertitel und Details aus der Episodenliste und dem Übergang

Da sich jede Episode in dem Element befindet, dessen Klasse ".episode_item" ist, rufen Sie die Liste mit dem CSS-Selektor "select" ab. Da mehrere Elemente abgerufen werden, rufen Sie die URL zum Untertitel und die Details der einzelnen Elemente ab.

        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')

Der Titel stammt aus der .title -Klasse und die URL aus dem a tag href. image.png Ich erhalte den Detailbildschirm mit "driver.get (eps_url)". Sobald Sie es erhalten haben, stellen Sie es auf "Schöne Suppe".

Erhalten Sie Kommentare

Holen Sie sich eine Liste mit Kommentaren und setzen Sie den Text darin auf ein Array

Die Klasse erhält die Elemente für .comment_list und alle darin enthaltenen .comments. Ich bekomme die Zeichenfolge mit "c.text" und setze sie in das Array "comment_text". Die Einstellung für das Array verwendet die Listeneinschlussnotation. Die Einschlussnotation von Python scheint vollständig zu sein.

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

Die HTML-Struktur des Kommentarteils ist wie folgt. Es scheint, dass Sie auch mit comment_viewer finden können. Lassen Sie uns diesen Bereich auf nette Weise spezifizieren. image.png

Verarbeiten Sie Kommentare in Word Cloud

Morphologische Analyse mit MeCab

Die erfasste Kommentarzeichenfolge wird von MeCab morphologisch analysiert. Fügen wir den Importbetrag hinzu.

import MeCab

Führen Sie eine morphologische Analyse mit "parse" von MeCab durch.

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

Das Ergebnis der morphologischen Analyse ist wie folgt.

'Wie erwartet\t Substantiv,Adjektiv Verbstamm,*,*,*,*,Wie erwartet,Sasuga,Sasuga\bis n\t Assistent,Adjunct,*,*,*,*,Zu,D.,D.\n nicht\t Adjektiv,Unabhängigkeit,*,*,Apokalypse,Kontinuierliche Verbindung,Abwesend,Naka,Naka\n\t Hilfsverb,*,*,*,Besondere,Grundform,Ta,Ta,Ta\nwww\t Substantiv,Allgemeines,*,*,*,*,*\n。\t Symbol,Phrase,*,*,*,*,。,。,。\n es\t Substantiv,Gleichbedeutend,Allgemeines,*,*,*,Es,Sohle, einzig, alleinig,Sohle, einzig, alleinig\n ist\t Assistent,Hilfe,*,*,*,*,Ist,C.,Beeindruckend\n Schreibgeräte\t Substantiv,Allgemeines,*,*,*,*,Schreibutensilien,Hicking,Hicking\bei n\t Assistent,Fallassistent,Allgemeines,*,*,*,damit,De,De\n ist\t Assistent,Hilfe,*,*,*,*,Ist,C.,Beeindruckend\n Ja\t verb,Unabhängigkeit,*,*,Fünf Schritte, La Linie,Kontinuierlicher Typ,Gibt es,Ali,Ali\n\t Hilfsverb,*,*,*,Spezial / Masse,Unvollkommene Form,Masu,Mase,Mase\n\t Hilfsverb,*,*,*,Unveränderlicher Typ,Grundform,Hmm,Nieder,Nieder\n…\t Symbol,Allgemeines,*,*,*,*,…,…,…\n。\t Symbol,Phrase,*,*,*,*,。,。,。\n Kisigai\t Substantiv,Allgemeines,*,*,*,*,*\n。\t Symbol,...

Da \ n Zeile für Zeile ist, nehmen Sie Zeile für Zeile mit Splitlines heraus und erhalten Sie die Grundform der Morphologie vom 7. auf der rechten Seite, getrennt durch \ t. Dabei schließen wir Hilfswörter und -verben, Synonyme und einige Zeichenfolgen wie "suru" und "teru" aus. Wenn Sie es nicht ausschließen, wird es beim Erstellen einer Wortwolke in großen Buchstaben angezeigt.

                words = ' '.join([x.split('\t')[1].split(',')[6] for x in parsed.splitlines()[:-1] if x.split('\t')[1].split(',')[0] not in ['Partikel', 'Hilfsverb'] and x.split('\t')[1].split(',')[1] not in ['Gleichbedeutend'] and x.split('\t')[1].split(',')[6] not in ['Machen', 'Teru', 'Werden', 'Herr.', 'damit', 'Dies', 'Gibt es']])

Erstellen Sie eine Wortwolke mit Word Cloud

Erstellen Sie eine Wortwolke mit "to_file" in WordCloud. comic_titles``` comic_subtitles``` comic_images comic_urls ist eine in einem Array deklarierte Variable, die später beim Erstellen von HTML verwendet wird. Jedes enthält einen Titel, einen Untertitel, einen Bildnamen und eine URL.

Beim Erstellen von WordCloud werden Schriftart, Hintergrundfarbe und Größe angegeben. Die verwendete Schriftart ist "Ranobe POP", die auf YouTube häufig verwendet wird. Bitte geben Sie diesen Bereich nach Ihren Wünschen an.

Ich gebe in eine Datei mit wordcloud.to_file aus.

                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("[Pfad, den Sie speichern möchten]/wordcloud/%d.png " % (comic_index))
                        comic_index += 1
                    except Exception as e:
                        print(e)

Das Ausgabeergebnis ist das zuerst gezeigte. Erstellen Sie damit HTML und veröffentlichen Sie es auf der Site.

Veröffentlichte Seite

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

Wenn Sie auf die obige URL zugreifen, wird die folgende Liste von Wortwolken angezeigt. Klicken Sie auf die Wortwolke, um den Manga zu öffnen. image.png

abschließend

Viele der Kommentare wie Jump + und Manga One sind ziemlich hart, aber Nico Nico hat viele sanfte Kommentare. Immerhin sind Sie es gewohnt zu kommentieren.

Es wäre großartig, wenn wir nicht nur eine Wortwolke erstellen, sondern auch verschiedene Dinge analysieren und die Tür zu Meisterwerken öffnen könnten, die bisher schwer zu treffen waren.

Recommended Posts

Wenn Sie versuchen, eine Wortwolke mit Kommentaren von WEB-Manga zu erstellen, ist es interessant, visuell zu verstehen, um welche Art von Manga es sich handelt.
WEB Scraping mit Python und versuchen, aus Bewertungen eine Wortwolke zu machen
Wenn Sie Word Cloud erstellen möchten.
[CleanArchitecture mit Python] Wenden Sie CleanArchitecture Schritt für Schritt auf eine einfache API an und versuchen Sie zu verstehen, welche Art von Änderung in der Codebasis stark ist.
Notieren Sie sich, was Sie in Zukunft mit Razpai machen möchten
Erstellen Sie die Word Cloud von Qiita aus Ihrem Browserverlauf
[Python] Was ist ein Slice? Eine leicht verständliche Erklärung zur Verwendung anhand eines konkreten Beispiels
Wenn es schwierig ist, das zu kopieren, was Sie mit vue erstellt haben
Versuchen Sie, einen Web-Service-ähnlichen Typ mit 3D-Markup-Sprache zu erstellen
Was tun, wenn bei der Pip-Installation ein Unicode-Dekodierungsfehler auftritt?
Ist es möglich, ein Pre-Listing-Unternehmen zu gründen und mit Aktienoptionen ein Vermögen zu machen?
Da es der 20. Jahrestag der Gründung ist, habe ich versucht, die Texte von Parfüm mit Word Cloud zu visualisieren
2. Erstellen Sie mit Python einen Entscheidungsbaum von 0 und verstehen Sie ihn (2. Grundlagen des Python-Programms)
Was tun, wenn TypeError in min und max von numpy auftritt?
Machen Sie mit Python einen Entscheidungsbaum von 0 und verstehen Sie ihn (4. Datenstruktur)
Machen wir einen Jupyter-Kernel
Was ist die letzte Programmiersprache, die Sie in Ihrem Leben lernen? (Wenn Sie einen Club mit einem lebenslangen Gehalt von 300 Millionen Yen einholen möchten)
Lassen Sie uns mit Flask eine Webanwendung zur Konvertierung von A nach B erstellen! Von Grund auf neu ...
[OpenCV] Wenn Sie überprüfen möchten, ob es mit imread richtig gelesen wird
Wenn Sie einen Discord-Bot mit Python erstellen möchten, verwenden wir ein Framework
Wenn Sie versuchen, Python2 pip nach der Installation von Python3 pip zu installieren, wird dies abgelehnt
Probieren Sie es mit Word Cloud Japanese Python JupyterLab.
Versuchen Sie, in Python einen "Entschlüsselungs" -Code zu erstellen
Versuchen Sie, mit Python eine Diedergruppe zu bilden
Versuchen Sie, mit matplotlib aus den Daten von "Schedule-kun" eine Kampfaufzeichnungstabelle zu erstellen.
Was tun, wenn beim Konvertieren von PySparkDataFrame in PandasDataFrame ein Speicherfehler auftritt?
Python-Ertrag verstehen Wenn Sie Ertrag in eine Funktion einfügen, wird dieser in einen Generator geändert