[PYTHON] J'ai essayé Web Scraping pour analyser les paroles.

Objectif

Je voulais analyser les paroles, mais j'ai essayé de gratter pour la première fois car il était difficile de rassembler les paroles. Pour être honnête, j'étais un peu inquiet car je n'avais jamais écrit correctement le HTML, mais j'ai pu faire ce que je voulais faire, alors j'aimerais le résumer. Je vous serais reconnaissant si vous pouviez me donner des conseils et des erreurs.

C'est l'article auquel j'ai fait référence cette fois.

[J'ai essayé de savoir "où je veux aller" en utilisant pleinement word2vec et les paroles de "Théorie que je ne peux aller nulle part"](https://qiita.com/k_eita/items/456895942c3dda4dc059#%E6%AD % 8C% E8% A9% 9E% E3% 81% AE% E3% 82% B9% E3% 82% AF% E3% 83% AC% E3% 82% A4% E3% 83% 94% E3% 83% B3 % E3% 82% B0)

Les paroles sont disponibles sous forme de fichiers texte dans cet article. Cette fois, je l'ai réécrit en référence à ce code.

Ce que nous obtiendrons cette fois

  1. Titre de la chanson
  1. Nom de l'artiste
  2. Écrivain
  3. Compositeur
  4. Paroles

Ce sont les cinq ci-dessus. Le format de sortie est csv.

Le site que j'ai gratté cette fois est "Uta Net: service de recherche de paroles".

Bibliothèque

import re
import time
import requests
import pandas as pd
from bs4 import BeautifulSoup

Contenu du code

# Obtenez le site Web et la sortie au format texte
def load(url):
    res = requests.get(url)
 #HTTPError lève HTTPError si la requête HTTP renvoie un code d'état d'échec
    res.raise_for_status()
 #Obtenir le corps de la réponse au format texte
    return res.text

# Obtenir la balise HTML
def get_tag(html, find_tag):
    soup = BeautifulSoup(str(html), 'html.parser')
    tag = soup.find_all(find_tag)
    return tag

# Convertir en une structure de données pouvant être gérée par le programme
def parse(html):
    soup = BeautifulSoup(str(html), 'html.parser')
 Supprimer la balise #html
    simple_row = soup.getText()
    simple_row = simple_row.replace('\n', '')
    simple_row = simple_row.replace(' ', '')
    
 #Supprimer les caractères alphanumériques (si nécessaire)
    #simple_row = re.sub(r'[a-zA-Z0-9]', '', music_row)
 Symbole #Supprimer
 simple_row = re.sub (r '[<> ♪ ``' '"" ・… _!?! - /: - @ [-` {- ~]', '', simple_row)
 #Delete avis
 simple_row = re.sub (r'Note:. + ',' ', Simple_row)
    return simple_row

# Acquisition des informations de chanson pour chacun
def get_info(url):
    base_url = 'https://www.uta-net.com/'
    html = load(url)
 #Store URL pour chaque chanson
    song_url = []
 #Store chanson
    song_info = []
    songs_info = []
    
 #Obtenir l'URL de la chanson
 Enregistre l'URL de #td
    for td in get_tag(html, 'td'):
 Obtenir l'élément #a
        for a in get_tag(td, 'a'):
 Si l'attribut #href contient un morceau
            if 'song' in a.get ('href'):
 Ajouter #url au tableau
                song_url.append(base_url + a.get('href'))
    
 #Obtenir des informations sur la chanson
    for i, page in enumerate(song_url):
 print ('{} chanson: {}'. format (i + 1, page))
        html = load(page)
        song_info = []
        
        #Song_Title
        for h2 in get_tag(html, 'h2'):
 Caster sur str une fois pour effectuer une recherche #id
            h2 = str(h2)
 # Qu'il s'agisse ou non d'un élément de classe qui stocke les paroles
            if r'class="prev_pad"' in h2:
 #Supprimer les données inutiles
                simple_row = parse(h2)
                #print(simple_row, end = '\n')
                song_info.append(simple_row)   
            else:
                for h2 in get_tag(html, 'h2'):
                    h2 = str(h2)
                    simple_row = parse(h2)
                    song_info.append(simple_row)

        #Artist
        for h3 in get_tag(html, 'h3'):
            h3 = str(h3)
            if r'itemprop="byArtist"' in h3:
                simple_row = parse(h3)
                song_info.append(simple_row)

        #Lyricist
        for h4 in get_tag(html, 'h4'):
            h4 = str(h4)
            if r'itemprop="lyricist"' in h4:
                music = parse(h4)
                song_info.append(simple_row)

        #Composer
        for h4 in get_tag(html, 'h4'):
            h4 = str(h4)
            if r'itemprop="composer"' in h4:
                simple_row = parse(h4)
                song_info.append(simple_row)

        #Lyric
        for div in get_tag(html, 'div'):
            div = str(div)
            if r'itemprop="text"' in div:
                simple_row = parse(div)
                song_info.append(simple_row)
                songs_info.append(song_info)
 # 1 seconde d'attente (réduit la charge du serveur)
                time.sleep(1)
                break
    return songs_info

def create_df(file_name, url):
 #Créer un bloc de données
    #df = pd.DataFrame('Song_Title', 'Artist', 'Lyricist', 'Composer', 'Lyric')
    df = pd.DataFrame(get_info(url))
    df = df.rename(columns={0:'Song_Title', 1:'Artist', 2:'Lyricist', 3:'Composer', 4:'Lyric'})
 # Sortie de fichier CSV
    csv = df.to_csv("csv/{}.csv".format(file_name))
    return csv

En exécutant le code ci-dessus, vous êtes prêt pour le scraping. Vous pouvez réellement obtenir les paroles, etc. en exécutant le code ci-dessous. Cette fois, j'ai la chanson de Minami-san. J'ai également essayé de faciliter la modification du nom et de l'URL du fichier.

file_name = 'sample'
url = 'https://www.uta-net.com/artist/26099/'
url = 'https://www.uta-net.com/user/ranking/daily.html'
url = 'https://www.uta-net.com/user/ranking/monthly.html'
create_df(file_name, url)

Résultat de sortie

Voici les données de la chanson acquises cette fois. Vous pouvez désormais analyser autant de chansons que vous le souhaitez. Screen Shot 2020-05-13 at 5.45.19.png

Résumé à part (?)

J'ai trouvé amusant de faire quelque chose qui fonctionne comme je l'avais prévu. L'article a un fort élément d'autosuffisance, je voudrais donc le mettre à jour plus tard. (Puisque l'explication du code n'est que commentée, ...) Je souhaite également unifier le style d'écriture de Qiita. Ensuite, je pense que je vais essayer le traitement du langage naturel.

Recommended Posts

J'ai essayé Web Scraping pour analyser les paroles.
Qiita Job J'ai essayé d'analyser le travail
J'ai essayé de vectoriser les paroles de Hinatazaka 46!
J'ai essayé webScraping avec python.
J'ai essayé de déplacer le ballon
J'ai essayé d'estimer la section.
J'ai essayé d'analyser les émotions de tout le roman "Weather Child" ☔️
J'ai essayé de gratter
J'ai essayé de résumer la commande umask
J'ai essayé de reconnaître le mot de réveil
J'ai essayé de résumer la modélisation graphique.
J'ai essayé d'estimer le rapport de circonférence π de manière probabiliste
J'ai essayé de toucher l'API COTOHA
J'ai créé une API Web
J'ai essayé le web scraping en utilisant python et sélénium
J'ai essayé d'optimiser le séchage du linge
J'ai essayé d'obtenir une image en grattant
J'ai essayé de sauvegarder les données avec discorde
J'ai commencé à analyser
Premiers pas avec le Web Scraping
[Python] J'ai essayé d'analyser le lanceur qui n'a réussi aucun coup, aucune course
J'ai essayé de corriger la forme trapézoïdale de l'image
Le cours de l'action a chuté avec "nouvelle Corona"? J'ai essayé d'obtenir le cours moyen de l'action Nikkei par grattage Web
J'ai essayé de déboguer.
(Python) J'ai essayé d'analyser 1 million de mains ~ J'ai essayé d'estimer le nombre d'AA ~
J'ai essayé de vérifier et d'analyser l'accélération de Python par Cython
J'ai essayé d'analyser la négativité de Nono Morikubo. [Comparer avec Posipa]
LeetCode j'ai essayé de résumer les plus simples
J'ai essayé d'analyser la carte du Nouvel An par moi-même en utilisant python
J'ai essayé de mettre en œuvre le problème du voyageur de commerce
J'ai essayé d'entraîner la fonction péché avec chainer
J'ai essayé de représenter graphiquement les packages installés en Python
J'ai essayé de détecter l'iris à partir de l'image de la caméra
J'ai essayé de résumer la forme de base de GPLVM
J'ai essayé de toucher un fichier CSV avec Python
J'ai essayé de prédire le match de la J League (analyse des données)
J'ai essayé de résoudre Soma Cube avec python
J'ai essayé d'approcher la fonction sin en utilisant le chainer
J'ai essayé de mettre Pytest dans la bataille réelle
[Python] J'ai essayé de représenter graphiquement le top 10 des ombres à paupières
J'ai essayé d'analyser linguistiquement les phrases incompréhensibles de Karen Takizawa.
J'ai essayé de visualiser les informations spacha de VTuber
J'ai essayé d'effacer la partie négative de Meros
J'ai essayé de résoudre le problème avec Python Vol.1
J'ai essayé de gratter la publicité du site de dessin animé piraté
J'ai essayé de simuler la méthode de calcul de la moyenne des coûts en dollars
J'ai essayé de refaire la factorisation matricielle non négative (NMF)
J'ai essayé d'identifier la langue en utilisant CNN + Melspectogram
J'ai essayé de compléter le graphe de connaissances en utilisant OpenKE
J'ai essayé de classer les voix des acteurs de la voix
J'ai essayé de compresser l'image en utilisant l'apprentissage automatique
J'ai essayé de résumer les opérations de chaîne de Python
J'ai essayé de gratter avec Python
J'ai essayé d'apprendre PredNet
J'ai essayé d'organiser SVM.
J'ai essayé d'implémenter PCANet