[PYTHON] Geschichte der Synchronsprecher Scraping Wikipedia, um zu sehen, wie viele Jahre Sie zum Synchronsprecher der "Aikatsu!" - Serie wurden

Dieser Artikel ist Aikatsu! Adventskalender 2019 Dies ist der Artikel am 18. Tag. Gestern war ein Artikel von gecko655 "Aikatsu! Lassen Sie sich von Spotify die musikalischen Merkmale des Songs erklären".

Was du machen willst

Ich denke, der Synchronsprecher ist eines der Elemente, die die "Aikatsu!" - Serie unterstützen. Aikatsu! Um ein Synchronsprecher zu werden, werde ich Wikipedia abkratzen, um herauszufinden, wie viele Jahre es für eine Rolle in der "Aikatsu!" - Serie besetzt sein wird.

Die Konfiguration ist grob in zwei Funktionen unterteilt.

  1. Erhalten Sie den Namen des Synchronsprechers, der in den Charakterinformationen des Animes aufgeführt ist.
  2. Erfassen und verarbeiten Sie die Besetzungsinformationen des in 1 erfassten Namens des Synchronsprechers.

Implementierung

1. Holen Sie sich den Namen des Synchronsprechers, der in den Charakterinformationen des Animes aufgeführt ist

import re
import requests
from urllib.request import urlopen
from urllib.parse import urlparse
import urllib.request
from bs4 import BeautifulSoup
from collections import OrderedDict
#Holen Sie sich Sprachschauspieler von der Anime-Seite von Wikipedia
def get_voice_actor(soup):
    list_voice_actors_tmp=[]
    replace_list = ['/Lied-', '\[', '\(', "\n"]
    split_list = ['→', '、']

    for target in [i.text for i in soup.findAll('dd')]:
        if target.startswith("Stimme"):
            #Ausschluss unnötiger Zeichenketten
            voice_actor = target.replace('Stimme- ','')
            voice_actor = voice_actor.replace(" ","")       

            for i in replace_list:
                m = re.search(i, voice_actor)
                if(bool(m)):
                    voice_actor = voice_actor[0:m.start()]

            #Geteilte Verarbeitung mehrerer Casts, z. B. vom Brett steigen
            split_flg = False
            for i in split_list:
                tmp_voice_actor_list = voice_actor.split(i)
                if len(tmp_voice_actor_list) > 1:
                    #Da es erweitert ist, wird es dupliziert, aber da es zum Zeitpunkt des Scrapings dupliziert wird, wird das doppelte Löschen sofort durchgeführt
                    list_voice_actors_tmp.extend(tmp_voice_actor_list)
                    split_flg = True
            if split_flg:
                continue

            list_voice_actors_tmp.append(voice_actor)
    return list_voice_actors_tmp
#Holen Sie sich eine Liste der Aikatsu-Sprecher
target_work_characters = ['Aikatsu!Zeichenliste von','Aikatsuスターズ!', 'Aikatsuフレンズ!']

list_voice_actors = []
for character in target_work_characters:
    html = requests.get(r'https://ja.wikipedia.org/wiki/{}'.format(urllib.parse.quote_plus(character, encoding='utf-8')))
    list_voice_actors.extend(get_voice_actor(BeautifulSoup(html.text, "lxml")))

Ich mache den Namen des Synchronsprechers in den Charakteren der "Aikatsu!" - Serie. Es ist ein Prozess zum Ausschließen von Suffixen usw., die an den Namen des Sprachschauspielers angehängt sind.

Infolgedessen wird die folgende Liste ausgegeben.

['Sumire Moroboshi',
 'Azusa Tadokoro',
 'Ayaka Ohashi',
 'Tomoyo Kurosawa',
 'Manami Numakura',
 'Kiyono Yasuno',
 'Yuna Mimura',
 'Asami Seto',
 'Satomi Moriya',
 'Grundlagen Shino',
   :
   :
 'Yu Wakui',
 'Misako Tomioka',
 'Nami Tanaka',
 'Yuri Yamaoka',
 'Mitsuki Saiga',
 'Sakamoto-Kun',
 'Shinya Takahashi',
 'Takashi Onozuka',
 'Nanako Mori']

Die gleichnamige Besetzung wird im Ausgabeergebnis dupliziert. Dies liegt daran, dass es Leute wie Sumire Moroboshi gibt, die in Bezug auf die Implementierung mehrere Werke übergreifen. Eine doppelte Löschung wird hier nicht durchgeführt, sondern in der nachfolgenden Verarbeitung gelöscht.

Da es für jede Rolle mehrere Personen gibt, z. B. Entlassung, besetze ich sie und erweitere sie auf List.

2. Erfassen und verarbeiten Sie die Besetzungsinformationen des in 1 erfassten Namens des Synchronsprechers.

#Erfassung von Besetzungsinformationen für Sprecher
def get_cast(html):
    soup = BeautifulSoup(html, "lxml")

    list_cast=[]
    #Loop in Einheiten von Anime / Spiel
    for extract_dl in soup.findAll('dl') :
        for extract_dl_child in extract_dl.children :
            #Zeilenumbrüche ausschließen
            if extract_dl_child.string == '\n':
                continue
            #Da das Jahr in der ersten Zeile eingestellt ist, erhalten Sie für die Einstellung
            if extract_dl_child.string is not None:
                year = extract_dl_child.string
            #Holen Sie sich Werke und Besetzung
            else:
                #Schleife für Werke
                for extract_li in extract_dl_child.findAll('li'):
                    extract_a = extract_li.find('a')
                    #Es ist möglich, Nonetype-Daten abzurufen
                    if isinstance(extract_a,type(None)) == False:
                        title = extract_a.text
                        #Holen Sie sich den Charakternamen
                        title_char = str(extract_li.get_text())
                        character = title_char[title_char.find('(')+1:title_char.find(')')]
                        #Jahr,Titel,Machen Sie 1 Daten mit dem Charakternamen.
                        list_cast.append("{},{},{}".format(year, title.replace(" ",""), character))                        
    return list_cast

#Informationen zu Synchronsprechern erhalten Sie bei Wikipedia
def get_html(target):
    
    sufffix_dict = {"Synchronsprecher": "_(%E5%A3%B0%E5%84%AA)","Darsteller": "_(%E4%BF%B3%E5%84%AA)",} 
    
    res = requests.get(r'https://ja.wikipedia.org/wiki/{}'.format(urllib.parse.quote_plus(target, encoding='utf-8')))
    
    if res.status_code == 200:
        return get_cast(res.text)

    #Bedenken Sie, dass es Fälle gibt, in denen die Reihenfolge je nach Python-Version nicht garantiert ist
    for suffix in OrderedDict(sufffix_dict).values():
        print(suffix)
        res = requests.get(r'https://ja.wikipedia.org/wiki/{}{}'.format(urllib.parse.quote_plus(target, encoding='utf-8'),suffix))

        if res.status_code == 200:
            break
            
    return get_cast(res.text)

#Verarbeitung von Sprachdarstellern
def get_target_carrer(target_work, list_voice_actors):
    list_carrer =[]
    for target in set(list_voice_actors):
        #Informationen zu Synchronsprechern erhalten Sie bei Wikipedia
        list_cast = get_html(target)

        #Wenn Sie die Informationen nicht erhalten können, fahren Sie mit dem nächsten Sprecher fort
        if len(list_cast) == 0 :
            continue

        #Erwarb eine Karriere als Synchronsprecher bis zur Zielarbeit
        #Erhalten Sie die Anzahl der Arbeiten und jahrelange Erfahrung bis zur Zielarbeit
        cast_year = None
        debut_year = None
        count_cast_num = 1
        for str_cast in sorted(list_cast):
            #print(str_cast)
            #Holen Sie sich das Debütjahr. Das Alter ist abstrakt, also entfernen Sie es
            if not str_cast.split(',')[0].endswith("Alter") and debut_year is None:
                debut_year = str_cast.split(',')[0]

            #Holen Sie sich das Jahr zum ersten Mal in der Zielarbeit besetzt
            if str_cast.split(',')[1] == target_work:
                cast_year = str_cast.split(',')[0]

            #Wenn das Jahr, in dem das Zielwerk zum ersten Mal besetzt wurde, alt ist, fahren Sie mit dem nächsten Synchronsprecher fort
            if cast_year is not None:
                target_work_carrer = int(cast_year.replace('Jahr',''))  - int(debut_year.replace('Jahr',''))+ 1
                list_carrer.append("{},{},{},{},{},{}".format(target_work,
                                                              target, 
                                                              debut_year, 
                                                              cast_year, 
                                                              str('{}Jahr'.format(target_work_carrer)),
                                                              str('{}die Arbeit'.format(count_cast_num))
                                                             )
                                  )
                break
            count_cast_num = count_cast_num + 1
    return list_carrer
target_works_list = ['Aikatsu!', 'Aikatsuスターズ!', 'Aikatsuフレンズ!']
list_va_carrer = []
for target_work in target_works_list:
    list_va_carrer.extend(get_target_carrer(target_work, list_voice_actors))

Hier wird aus dem Namen des Synchronsprechers die Animations- / Spielarbeit, die von diesem Synchronsprecher ausgeführt wird, erfasst und sortiert. Die Geschichte des Synchronsprechers, als er zum ersten Mal in der Serie "Aikatsu!" Aus seinem Debütwerk besetzt wurde, und die Anzahl der bisher besetzten Werke werden angezeigt.

Die Ausgabe sieht so aus.

['Aikatsu!,Akemi Kanda,das Jahr 2000,2013,14. Jahr,152 Werke',
 'Aikatsu!,Ayaka Ohashi,Jahr 2012,Jahr 2012,1. Jahr,3 Werke',
 'Aikatsu!,Mamiko Noto,1998,Jahr 2012,15. Jahr,405 funktioniert',
 'Aikatsu!,Hisako Kanemoto,2009,2015,7. Jahr,209 Werke',
 'Aikatsu!,Mari Yokoo,1980,2013,34. Jahr,155 Werke',
 'Aikatsu!,Hiroshi Ienaka,1986,Jahr 2012,27. Jahr,152 Werke',
 'Aikatsu!,Miki Hase,2010,2014,5. Jahr,11 Werke',
 'Aikatsu!,Aya Susaki,2010,2014,5. Jahr,61 Werke',
 'Aikatsu!,Nanako Mori,2013,2015,Drittes Jahr,6 Werke',
 'Aikatsu!,Satomi Moriya,2008,Jahr 2012,5. Jahr,28 Werke',
                    :
                    :
 'Aikatsu Freunde!,Yuri Yamaoka,2009,2018,10. Jahr,66 Werke',
 'Aikatsu Freunde!,Risa Kubota,2015,2018,4. Jahr,26 Werke',
 'Aikatsu Freunde!,Makoto Homura,das Jahr 2000,2018,19. Jahr,206 Werke',
 'Aikatsu Freunde!,Ikumi Hasegawa,2016,2018,Drittes Jahr,27 Werke',
 'Aikatsu Freunde!,Tomokazu Sugita,1999,2019,21. Jahr,672 funktioniert',
 'Aikatsu Freunde!,Nakaeko Schloss,2014,2018,5. Jahr,68 Werke',
 'Aikatsu Freunde!,Yuki Kuwahara,2013,2018,6. Jahr,93 Werke']

Die erste Besetzungsrolle wird als Debütjahr festgelegt und von dem Jahr abgezogen, in dem sie zum ersten Mal in der "Aikatsu!" - Serie besetzt wurde.

Wenn es sich um einen Synchronsprecher handelt, ist es nicht möglich, einen Fall wie "XXXX_ (Name des Synchronsprechers)" aufzunehmen. Wir haben ihn daher so implementiert, dass er aufgegriffen werden kann.

Wenn ein Synchronsprecher wie Rin Arai, der gerade sein Debüt gegeben hat, oder ein Schauspieler wie Kaiko Miyama ebenfalls beliebt ist, unterscheidet er sich vom Fort Mat des allgemeinen Synchronsprechers Wikipedia. Es gibt einen Punkt, den es nicht gibt. Wenn Sie eine Implementierung erstellen, die so viel aufnimmt, scheint es viele Einzelimplementierungen zu geben. Ich dachte, es wäre besser, dies nicht zu tun, aber ich dachte, es wäre besser, eine Implementierung zu erstellen, die erkennen kann, wer sie nicht abholen kann.

Aufführen

Unten finden Sie eine Liste der Ergebnisse, die mit Pandas, Ausgabe und Excel angepasst wurden.

import pandas as pd
abc = pd.Series(list_va_carrer)
df = abc.str.split(',', expand=True)
df.columns = ["Titel der Arbeit", "Name des Synchronsprechers", "Debütjahr", "Casting-Jahr", "Vom Debüt bis zum Casting(Jahre)","Vom Debüt bis zum Casting(役数)"]
df.to_csv("aikatsu.csv")
アイカツ!声優一覧.png

schließlich

Aikatsu! Adventskalender 2019 Es sind noch ein paar Tage frei, also zögern Sie nicht, sich uns anzuschließen!

Recommended Posts

Geschichte der Synchronsprecher Scraping Wikipedia, um zu sehen, wie viele Jahre Sie zum Synchronsprecher der "Aikatsu!" - Serie wurden
Ich musste im Unterricht keinen Dekorateur schreiben. Danke Kontextmanager
Verwendung der Methode __call__ in der Python-Klasse
So importieren Sie Dateien in Python an eine beliebige Stelle
So erhalten Sie den letzten (letzten) Wert in einer Liste in Python
Weg zum Assistenten: Schritt 8 (Interpretieren, wie man ein Hacker wird)
[sh] Das Speichern der Befehlsausführung führt zu Variablen
So bestimmen Sie die Existenz eines Selenelements in Python
So erhalten Sie alle möglichen Werte in einem regulären Ausdruck
So überprüfen Sie die Speichergröße einer Variablen in Python
<Pandas> Umgang mit Zeitreihendaten in der Pivot-Tabelle
So ermitteln Sie die Scheitelpunktkoordinaten eines Features in ArcPy