[PYTHON] Je veux les gratter tous ensemble.

introduction

Dernier code de raclage Web J'ai pensé que c'était ennuyeux de ne pouvoir gratter qu'un par un. De plus, je veux conserver l'url que j'ai utilisée une fois, et il est fastidieux de changer le nom du fichier une fois. Alors cette fois, j'ai essayé d'améliorer ce domaine rapidement.

Bibliothèque

Cette fois, j'ai ajouté datetime à la bibliothèque. Ce serait pratique si le nom du classement quotidien, etc. change lorsque vous l'enregistrez.

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

Préparation part1

Suppression de la suppression des caractères alphanumériques et des symboles dans la fonction d'analyse. Puisque l'espace demi-largeur entre les mots anglais disparaît, j'ai pensé qu'il serait bon de traiter les symboles en langage naturel.

# 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(' ', ' ')
    #simple_row = simple_row.replace('\n', ' ')
    
 #Supprimer les caractères alphanumériques (si nécessaire)
    #simple_row = re.sub(r'[a-zA-Z0-9]', '', music_row)
 #Supprimer le symbole (si nécessaire) * La difficulté est que l'espace entre les mots anglais disparaît lorsque vous utilisez ce
 #simple_row = re.sub (r '[<> ♪ `' '" "・… _!?! - /: - @ [-` {- ~]', '', simple_row)
 #Delete avis
 simple_row = re.sub (r'Note:. + ',' ', Simple_row)
    
 # Espace pleine largeur à demi-largeur (pour laisser les paroles interrompues)
    simple_row = simple_row.replace(' ', ' ')
    simple_row = simple_row.replace('\n', '')
    return simple_row

Préparation part2

J'ai un peu changé la fonction create_df.

# 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)
                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
                
    #print(songs_info)
    return songs_info

csv
def create_df(URL):
    file_name = URL[0]
    url = URL[1]
 #Créer un bloc de données
    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

# Installation en vrac
def whole(URL):
    for i in range(len(URL)):
        URLS = URL[i]
        create_df(URLS)
    return

liste

Il fait partie de la liste créée. Placez le nom du fichier à gauche (URL_fre [0] [0]). Mettez l'url à la bonne position (URL_fre [0] [1]). Avec cela, le nom du fichier est décidé arbitrairement et les paroles, etc. sont acquises.

# Classements mis à jour régulièrement
URL_fre = [['{}_daily'.format(datetime.date.today()), 'https://www.uta-net.com/user/ranking/daily.html'],
           ['{}_weekly'.format(datetime.date.today()), 'https://www.uta-net.com/user/ranking/weekly.html'],
           ['{}_monthly'.format(datetime.date.today()), 'https://www.uta-net.com/user/ranking/monthly.html']
          ]

# Une partie de la liste (j'aime ça)
 URL_setting = [['Yorushika', 'https://www.uta-net.com/artist/22653/'],
               ['YOASOBI', 'https://www.uta-net.com/artist/28370/'],
               ['RADWIMPS', 'https://www.uta-net.com/artist/4082/']
              ]

Courir

Renommez la liste (URL) et exécutez-la pour terminer.

whole(URL)

Résumé

Vous pouvez maintenant les rassembler dans une liste et les gratter tous à la fois. Maintenant, je voudrais aborder cette fois le traitement du langage naturel!

Recommended Posts

Je veux les gratter tous ensemble.
Je veux gratter des images et les former
Je veux résoudre SUDOKU
Je veux comprendre à peu près systemd
Je veux faire ○○ avec les Pandas
Je veux copier l'annotation de yolo
Je veux déboguer avec Python
Configuration MacBookPro Après tout, je veux faire une installation propre
Je veux épingler Spyder à la barre des tâches
Je veux détecter des objets avec OpenCV
Je veux sortir froidement sur la console
Je veux imprimer dans la notation d'inclusion
Je veux gérer la rime part1
Je veux savoir comment fonctionne LINUX!
Je veux écrire un blog avec Jupyter Notebook
Je veux gérer la rime part3
Je veux utiliser jar de python
Je veux créer un environnement Python
Je veux utiliser Linux sur mac
Je veux installer Python avec PythonAnywhere
Je veux analyser les journaux avec Python
Je veux jouer avec aws avec python
Je souhaite utiliser la console IPython Qt
Je veux afficher la barre de progression
Je veux faire un programme d'automatisation!
Je veux intégrer Matplotlib dans PySimpleGUI
Je veux gérer la rime part2
Je souhaite développer des applications Android sur Android
Je veux que CAPTCHA dise des mots HIWAI
Je veux gérer la rime part5
Je veux gérer la rime part4
[Question] Je veux gratter une chaîne de caractères entourée de balises uniques!
Je veux faire de matplotlib un thème sombre
Je souhaite me connecter à PostgreSQL à partir de plusieurs langues
Je veux faire le test de Dunnett en Python
Je veux pouvoir penser à la récurrence
Je souhaite créer facilement un modèle de bruit
Je veux utiliser MATLAB feval avec python
Je veux corriger Datetime.now dans le test de Django
Je veux INSÉRER un DataFrame dans MSSQL
Je veux mémoriser, y compris les arguments de mots clés de Python
Je veux créer une fenêtre avec Python
Quoi qu'il en soit, je veux vérifier facilement les données JSON
Je souhaite envoyer un e-mail depuis Gmail en utilisant Python.
[Python] Je veux gérer 7DaysToDie depuis Discord! 1/3
Je veux moquer datetime.datetime.now () même avec pytest!
Je souhaite afficher plusieurs images avec matplotlib.
Je veux frapper 100 sciences des données avec Colaboratory
Je veux faire un jeu avec Python
Je veux visualiser les fichiers csv en utilisant Vega-Lite!
Je veux gérer la rime part7 (BOW)
Je veux être OREMO avec setParam!
Je ne veux pas passer un test de codage
Je souhaite stocker les informations de la base de données dans la liste
Je veux fusionner des dictionnaires imbriqués en Python
Je veux faire des crises de ma tête
Je veux gérer systemd par fuseau horaire! !!