[Python] J'ai créé une application qui télécharge automatiquement le fichier audio de chaque mot utilisé pour l'application d'étude d'anglais.

Synopsis

L'application d'étude d'anglais créée dans l'article ci-dessous nécessite un fichier vocal en anglais. https://qiita.com/Fuminori_Souma/private/0706716fdebf08572c6c

Le téléchargement manuel du fichier audio prend du temps et est laborieux, donc J'ai décidé de le télécharger automatiquement par web scraping.

Merci d'avoir téléchargé le fichier audio de weblio.

fichier source

get_sound_file.py


import sys
import tkinter
import time
import re
import urllib.request
from tkinter import messagebox
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.common.action_chains import ActionChains

class Frame(tkinter.Frame):

    def __init__(self, master=None):
        tkinter.Frame.__init__(self, master)
        self.master.title('Obtenez le fichier audio')
        self.master.geometry("400x300")

        #Paramètres d'étiquette
        text_1 = tkinter.Label(self, text=u'Entrez le mot pour lequel vous souhaitez obtenir un fichier audio dans la zone de texte ci-dessous.')
        text_1.pack(pady='7')
        text_2 = tkinter.Label(self, text=u'* Lors de la saisie de plusieurs mots, ",Veuillez séparer avec.')
        text_2.pack()

        #Texte (plusieurs vers d'entrées.) paramètres de
        self.ent_words = tkinter.Text(self, height=15)
        self.ent_words.pack(padx='30')

        #Paramètres du bouton poussoir
        bttn_start = tkinter.Button(self, text = u'début', command=self.start_get_file)
        bttn_start.bind("<Button-1>") #(Button-2 pour le clic de roue, 3 pour le clic droit)
        bttn_start.pack(pady='7')

    def checkAlnum(self, word):  #Vérifiez si le mot saisi contient des symboles inutiles, etc.
        alnum = re.compile(r'^[a-zA-Z]+$')  #Compiler des expressions régulières
        result = alnum.match(word) is not None  #SRE si les conditions sont remplies avec match_Match object, sinon Aucun(False)rends le
        return result

    def delete_symbols(self, word):  #Supprimer les symboles, etc. inclus dans la chaîne de caractères
        # return word.replace(',', '').replace('.', '').replace('-', '').replace(' ', '')
        return word.replace(',', '').replace(' ', '')

    def get_mp3(self, word, driver):  #Ouvrez la page weblio et récupérez le fichier mp3

        dir = 'C:/Users/fumin/OneDrive'  #Destination de téléchargement du fichier audio

        #Entrez un mot dans la zone de texte pour la recherche de mots et appuyez sur le bouton de recherche
        driver.find_element_by_xpath("//*[@id=\"searchWord\"]").clear()  #Initialiser la zone de texte
        driver.find_element_by_xpath("//*[@id=\"searchWord\"]").send_keys(word)
        driver.find_element_by_xpath("//*[@id=\"headFixBxTR\"]/input").click()
        time.sleep(5)

        #Le fichier audio existe (=Si "lecture du lecteur" existe)
        if not driver.find_elements_by_xpath("//*[@id=\"audioDownloadPlayUrl\"]/i") == []:

            #Appuyez sur "Play Player" pour ouvrir le fichier mp3 dans une nouvelle fenêtre
            driver.find_element_by_xpath("//*[@id=\"audioDownloadPlayUrl\"]/i").click()
            time.sleep(5)

            #Changer la fenêtre cible en un fichier mp3 nouvellement ouvert
            handles = driver.window_handles
            driver.switch_to.window(handles[1])

            #Télécharger le fichier mp3
            urllib.request.urlretrieve(driver.current_url, (dir + '/' + word + '.mp3'))
            driver.close()

            #Ramène la fenêtre cible à la fenêtre d'origine
            driver.switch_to.window(handles[0])

            return 'OK'

        else:  #Le fichier audio n'existe pas (=Si la "lecture du lecteur" n'existe pas)

            return 'NG'


    def start_get_file(self):

        reslist = {}  #Si un fichier audio Word existe (initialisé avec un type de dictionnaire vide)

        words = self.ent_words.get('1.0', 'end')  #Obtenez la liste de mots entrée dans la zone de texte

        if self.checkAlnum(self.delete_symbols(words)):  #Entré correctement (caractères alphabétiques et "",Si rien d'autre que "n'est entré)

            ww = [x.strip() for x in words.split(',')]  #Stocker la liste de mots d'entrée sous forme de liste séparée par des virgules

            #Navigateur ouvert
            drv = webdriver.Chrome("C:/Users/fumin/pybraries/chromedriver_ver79/chromedriver")
            time.sleep(10)

            #Ouvrez la page (weblio) pour opérer
            drv.get("https://ejje.weblio.jp/")
            time.sleep(10)

            j = 0  #Mot NG(Mots pour lesquels le fichier mp3 n'existe pas)Nombre de

            for i in range(len(ww)):  #Obtenir un fichier mp3
                reslist[ww[i]] = self.get_mp3(ww[i], drv)

                if reslist[ww[i]] == 'NG':  #Ajouter des mots qui n'ont pas de fichier mp3 à la liste NG

                    j += 1  #Ajouter le nombre de mots NG

                    if j <= 1:  #Le premier mot NG est stocké sous forme de chaîne de caractères
                        nglist = ww[i]

                    elif j == 2:  #Le deuxième mot NG est converti en un type de liste en le reliant au premier séparé par une virgule.
                        nglist = (nglist + ',' + ww[i]).split(',')

                    else:  #Le troisième et les suivants sont ajoutés au type de liste dans l'ordre
                        nglist.append(ww[i])

            drv.close()  #Fermez le navigateur lorsque le processus d'acquisition de mots est terminé

            if 'nglist' in locals():  #S'il y a un mot pour lequel le fichier audio n'existait pas

                if j == 1:  #Lorsqu'il n'y a qu'un seul mot NG
                    messagebox.showinfo('', 'J'ai téléchargé les fichiers audio de tous les mots sauf le suivant.\n\n' + nglist)
                else:  #Lorsqu'il y a deux mots NG ou plus
                    messagebox.showinfo('', 'J'ai téléchargé les fichiers audio de tous les mots sauf le suivant.\n\n' + ', '.join(nglist))
            else:
                messagebox.showinfo('', 'J'ai téléchargé le fichier audio de tous les mots saisis.')

        else:   #Non saisi correctement (caractères alphabétiques et "",Si quelque chose autre que "est entré)
            messagebox.showinfo('', 'Alphabet et ",Est saisi. Veuillez réessayer après l'avoir supprimé.')


if __name__ == '__main__':

    #Paramètres du cadre
    root = Frame()
    root.pack()
    root.mainloop()

Remarques

Ce n'est pas bon de mettre un fardeau sur le site weblio, alors je l'ai considérablement ralenti. .. pour cette raison, La vitesse de téléchargement n'est pas très différente du manuel. (Je pense qu'il est important d'automatiser, pas d'accélérer)

Tâche

  1. Lorsque j'ouvre un fichier mp3, le fichier audio est lu à chaque fois. .. pour cette raison, Ajustement du son du fichier mp3 uniquement lors de sa lecture afin que le son ne soit pas lu. .. Mais du fichier mp3 Je n'ai pas pu régler la barre de volume. J'ai pensé à régler le volume du PC lui-même à 0 pendant un moment, mais en écoutant de la musique Si vous l'avez téléchargé, la musique sera également coupée! J'ai pensé, et j'ai abandonné sans m'arrêter.

  2. Pour savoir comment télécharger le fichier mp3, faites d'abord un clic droit -> Enregistrer l'audio sous Je pensais à sélectionner, mais le menu contextuel qui est sorti en faisant un clic droit est dans Selenium Cela semble inaccessible. .. J'ai donc utilisé urllib pour télécharger le fichier mp3. Je suis content d'avoir pu télécharger le fichier mp3 en conséquence, mais lorsque j'ai besoin de faire un clic droit à l'avenir J'ai des problèmes. ..

Autres informations utilisées comme référence

Merci pour toute l'aide que vous m'avez apportée. Merci beaucoup.

Contenu Lier la destination
Comment télécharger des fichiers https://stackoverflow.com/questions/48736437/how-to-download-this-video-using-selenium
Confirmation de l'existence de l'élément https://ja.stackoverflow.com/questions/30895/xpath%E3%81%A7%E8%A6%81%E7%B4%A0%E3%81%AE%E5%AD%98%E5%9C%A8%E3%82%92%E7%A2%BA%E8%AA%8D%E3%81%99%E3%82%8B%E6%96%B9%E6%B3%95
À propos du clic droit sur Selenium https://stackoverflow.com/questions/20316864/how-to-perform-right-click-using-selenium-chromedriver

finalement

Je me trompe ici! Pas ici! Vous devriez le faire ici! Si vous avez des questions, Je serais ravi de verser des larmes si vous pouviez le signaler.

Recommended Posts

[Python] J'ai créé une application qui télécharge automatiquement le fichier audio de chaque mot utilisé pour l'application d'étude d'anglais.
[Python] J'ai créé une application pour pratiquer la délicate distinction vocale des mots anglais.
Redimensionner automatiquement les captures d'écran de l'App Store pour chaque écran en Python
Créez une application de mots anglais avec python
J'ai créé un script pour vérifier si l'anglais est entré dans la position spécifiée du fichier JSON en Python.
Avec LINEBot, j'ai fait une application qui m'informe de "l'heure du bus"
J'ai créé un outil en Python qui clique avec le bouton droit sur un fichier Excel et le divise en fichiers pour chaque feuille.
Sortie de la table spécifiée de la base de données Oracle en Python vers Excel pour chaque fichier
Programme Python qui recherche le même nom de fichier
Analysez l'API Researchmap avec Python et créez automatiquement un fichier Word pour la liste des succès
Vérifiez le fonctionnement de Python pour .NET dans chaque environnement
Prise en compte des décorateurs Python du type qui passe des variables
Notes diverses sur l'utilisation de python pour les projets
Google recherche la chaîne sur la dernière ligne du fichier en Python
J'ai étudié la méthode X-means qui estime automatiquement le nombre de clusters
Créez une application qui informe LINE de la météo tous les matins
python Remarque: map -faire la même chose pour chaque élément de la liste
J'étais fatigué de Python, alors j'ai analysé les données avec nehan (lié à Corona, est-ce que ce mot est maintenant?)
[Examen d'ingénieur d'information de base] J'ai écrit un algorithme pour la valeur maximale d'un tableau en Python.
[Pour les débutants] Je veux obtenir l'index d'un élément qui satisfait une certaine expression conditionnelle
(Python) J'ai créé une application de Trello qui notifie périodiquement le relâchement des tâches sur le point d'expirer.