Python pour les débutants: comment commander le Web

Un voyage dans l'automatisation Web simple



image


Problème: Soumettre mes devoirs nécessite de naviguer dans un labyrinthe de pages Web si complexes que j'ai soumis le devoir au mauvais endroit plusieurs fois. De plus, bien que ce processus ne prenne que 1 à 2 minutes, il semble parfois être un obstacle insurmontable (par exemple, lorsque j'ai terminé une tâche trop tard dans la nuit et que je ne me souviens guère de mon mot de passe).



Solution: utilisez Python pour soumettre automatiquement les devoirs terminés! Dans l'idéal, je pourrais enregistrer le devoir, saisir quelques clés et charger mon travail en quelques secondes. Cela semblait trop beau pour être vrai au début, mais j'ai ensuite découvert Selenium, un outil qui peut être utilisé avec Python pour naviguer sur le Web.



image


Chaque fois que nous répétons des actions fastidieuses sur Internet avec la même séquence d'étapes, c'est une excellente occasion d'écrire un programme pour automatiser le processus. Avec Selenium et Python, nous avons juste besoin d'écrire le script une fois, puis nous pouvons l'exécuter autant de fois que nous le voulons et nous éviter de répéter des tâches répétitives (et dans mon cas, la possibilité d'envoyer le travail au mauvais endroit est exclue)!



Ici, je vais passer en revue une solution que j'ai développée pour soumettre automatiquement (et correctement) mes missions. En cours de route, nous aborderons les bases de l'utilisation de Python et du sélénium pour le contrôle Web par programmation. Bien que ce programme fonctionne (je l'utilise tous les jours!), Il est assez individuel, vous ne pourrez donc pas copier et coller le code de votre application. Cependant, les méthodes générales ici peuvent être appliquées à un nombre illimité de situations. (Si vous souhaitez voir le code complet, il est disponible sur GitHub ).



Une approche



Avant d'entrer dans la partie amusante de l'automatisation, nous devons comprendre la structure globale de notre solution. Commencer à coder sans plan est un excellent moyen de perdre des heures et d'être frustré. Je veux écrire un programme pour envoyer les devoirs de cours terminés au bon endroit dans Canvas ( le «système de gestion de l'apprentissage» de mon université). Premièrement, j'ai besoin d'un moyen de dire au programme le nom du travail à soumettre et la classe. J'ai adopté une approche simple et créé un dossier pour stocker les devoirs terminés avec des dossiers enfants pour chaque classe. Dans les dossiers enfants, j'ai mis un document fini nommé pour un travail spécifique. Le programme peut trouver le nom de la classe par le dossier et le nom de la tâche par le nom du document.

Voici un exemple où le nom de classe est EECS491 et la tâche est Tâche 3 - Sortie dans de grands modèles graphiques. "



image



Structure des fichiers (à gauche) et attribution complète (à droite).



La première partie du programme est une boucle qui parcourt les dossiers pour trouver le travail et la classe que nous stockons dans un tuple Python:



# os for file management
import os
# Build tuple of (class, file) to turn in
submission_dir = 'completed_assignments'
dir_list = list(os.listdir(submission_dir))
for directory in dir_list:
    file_list = list(os.listdir(os.path.join(submission_dir, 
directory)))
    if len(file_list) != 0:
        file_tup = (directory, file_list[0])
    
print(file_tup)


('EECS491', 'Assignment 3 - Inference in Larger Graphical Models.txt')



Cela prend en charge la gestion des fichiers et maintenant le programme connaît la classe et l'affectation à inclure. L'étape suivante consiste à utiliser Selenium pour accéder à la page Web appropriée et charger le travail.



Contrôle Web avec Selenium



Pour démarrer avec Selenium, nous importons la bibliothèque et créons un pilote Web, qui est un navigateur contrôlé par notre programme. Dans ce cas, j'utiliserai Chrome comme navigateur et publierai le pilote sur le site Web Canvas où je soumettrai des travaux.



import selenium
# Using Chrome to access web
driver = webdriver.Chrome()
# Open the website
driver.get('https://canvas.case.edu')


Lorsque nous ouvrons la page Web de Canvas, nous sommes confrontés au premier obstacle: la boîte de connexion! Pour contourner cela, nous devrons entrer l'ID et le mot de passe et appuyer sur le bouton de connexion.



image



Imaginez qu'un pilote Web soit quelqu'un qui n'a jamais vu de page Web auparavant: nous devons dire exactement où cliquer, quoi imprimer et sur quels boutons cliquer. Il existe plusieurs façons d'indiquer à notre pilote Web les éléments à rechercher, et ils utilisent tous des sélecteurs. Un sélecteur est un identifiant unique pour un élément sur une page Web. Pour trouver un sélecteur pour un élément spécifique, disons le champ «CWRU ID», nous devons regarder le code de la page Web. Dans Chrome, cela peut être fait en appuyant sur Ctrl + Maj + I ou en cliquant avec le bouton droit sur n'importe quel élément et en choisissant Afficher le code. Cela ouvreChrome Developer Tools , une application extrêmement utile qui affiche le code HTML sous-jacent à toute page Web .



Pour trouver le sélecteur pour le champ "CWRU ID", j'ai fait un clic droit dans le champ, cliqué sur Afficher le code et vu ce qui suit dans les outils de développement. La ligne en surbrillance correspond à l'élément id_box (cette ligne s'appelle la balise HTML).



image



Ce HTML peut sembler écrasant, mais nous pouvons ignorer la plupart des informations et nous concentrer sur les parties id = "username"et name = "username". (ils sont connus sous le nom d'attributs de balises HTML).

Pour sélectionner un champ à l' idaide de notre pilote Web, nous pouvons utiliser l'attribut idou nameque nous avons trouvé dans les outils de développement. Les pilotes Web Selenium ont de nombreuses façons différentes de sélectionner des éléments sur une page Web, et il existe souvent plusieurs façons de sélectionner le même élément:



# Select the id box
id_box = driver.find_element_by_name('username')
# Equivalent Outcome! 
id_box = driver.find_element_by_id('username')


Notre programme a maintenant accès à id_box, et nous pouvons interagir avec lui de différentes manières, telles que la saisie de touches ou en appuyant sur (si nous avons sélectionné un bouton).



# Send id information
id_box.send_keys('my_username')


Nous suivons le même processus pour le champ de saisie du mot de passe et le bouton de connexion, en choisissant chacun en fonction de ce que nous voyons dans les outils de développement Chrome. Nous envoyons ensuite des informations aux articles ou cliquons dessus au besoin.



# Find password box
pass_box = driver.find_element_by_name('password')
# Send password
pass_box.send_keys('my_password')
# Find login button
login_button = driver.find_element_by_name('submit')
# Click login
login_button.click()


Dès que nous sommes connectés, nous sommes accueillis par cette barre d'outils légèrement intimidante:



image



nous devons à nouveau naviguer dans le programme à travers la page Web, en spécifiant les éléments exacts sur lesquels cliquer et les informations à saisir. Dans ce cas, je dis au programme de sélectionner les cours dans le menu de gauche, puis la classe correspondant au devoir que je dois réussir:



# Find and click on list of courses
courses_button = driver.find_element_by_id('global_nav_courses_link')
courses_button.click()
# Get the name of the folder
folder = file_tup[0]
    
# Class to select depends on folder
if folder == 'EECS491':
    class_select = driver.find_element_by_link_text('Artificial Intelligence: Probabilistic Graphical Models (100/10039)')
elif folder == 'EECS531':
    class_select = driver.find_element_by_link_text('Computer Vision (100/10040)')
# Click on the specific class
class_select.click()


Le programme trouve la classe correcte en utilisant le nom du dossier que nous avons enregistré dans la première étape. Dans ce cas, j'utilise la méthode select find_element_by_link_textpour trouver une classe spécifique. Le "texte du lien" pour un élément n'est qu'un autre sélecteur que nous pouvons trouver en regardant la page:



image



Ce flux de travail peut sembler un peu fastidieux, mais rappelez-vous que nous n'avons à le faire qu'une seule fois lorsque nous écrivons notre programme! Après cela, nous pouvons cliquer sur "Exécuter" autant de fois que nous le voulons, et le programme ira à toutes ces pages pour nous.

Nous utilisons le même processus pour valider une page - sélectionner un élément - interagir avec un élément pour passer par quelques écrans supplémentaires. Enfin, nous atteignons la page de soumission des travaux:



image



À ce stade, je pouvais voir la ligne d'arrivée, mais au début, cet écran m'a intrigué. J'aurais pu cliquer assez facilement sur le champ Sélectionner un fichier, mais comment étais-je censé sélectionner le fichier que je souhaite télécharger? La réponse s'avère incroyablement simple! Nous trouvons le champ à l' Choose Fileaide d'un sélecteur et utilisons une méthode send_keyspour passer le chemin exact du fichier (nommé file_locationdans le code ci-dessous) au bloc:



# Choose File button
choose_file = driver.find_element_by_name('attachments[0][uploaded_data]')
# Complete path of the file
file_location = os.path.join(submission_dir, folder, file_name)
# Send the file location to the button
choose_file.send_keys(file_location)


En soumettant le chemin exact du fichier, nous pouvons ignorer tout le processus de navigation dans les dossiers pour trouver le fichier souhaité. Après avoir soumis le chemin, nous obtenons l'écran suivant montrant que notre fichier est chargé et prêt à être envoyé.



image



Maintenant, nous sélectionnons le bouton «Soumettre la tâche», cliquez, et notre tâche est envoyée!



# Locate submit button and click
submit_assignment = driver.find_element_by_id('submit_file_button')
submit_assignent.click()


image


Nettoyage



La gestion des fichiers est toujours une étape critique et je veux m'assurer de ne pas soumettre à nouveau ou de perdre d'anciens travaux. J'ai pensé que la meilleure solution serait de sauvegarder le fichier à placer dans un dossier completed_assignmentset de déplacer les fichiers dans le dossier submitted_assignmentsdès qu'ils sont téléchargés. Le dernier bit de code utilise le module os pour déplacer le travail terminé vers l'emplacement correct.



# Location of files after submission
submitted_file_location = os.path.join(submitted_dir, submitted_file_name)
# Rename essentially copies and pastes files
os.rename(file_location, submitted_file_location)


Tout le code source est emballé dans un script que je peux exécuter à partir de la ligne de commande. Pour limiter la possibilité d'erreurs, je ne soumets qu'un seul travail à la fois, ce qui n'est pas grave étant donné qu'il ne faut qu'environ 5 secondes pour démarrer le programme!



Voici à quoi cela ressemble lorsque j'exécute le programme:



image



Le programme me donne l'opportunité de m'assurer que c'est le bon travail avant le chargement. Une fois le programme terminé, j'obtiens le résultat suivant:



image



Pendant que le programme est en cours d'exécution, je peux observer Python en cours d'exécution pour moi:



image



conclusions



Les techniques d'automatisation avec Python sont parfaites pour de nombreuses tâches, à la fois générales et dans mon domaine de la science des données. Par exemple, nous pourrions utiliser Selenium pour télécharger automatiquement de nouveaux fichiers de données chaque jour (en supposant que le site Web ne dispose pas d' API ). Si les scripts peuvent sembler fastidieux à première vue, l'avantage est que nous pouvons faire répéter cette séquence à l'ordinateur autant de fois que nous le souhaitons, exactement de la même manière. Le programme ne perdra jamais sa concentration et ira sur Twitter. Il suivra les étapes exactement dans un ordre parfait (l'algorithme fonctionnera bien jusqu'à ce que le site change).



Je dois mentionner que vous devez être prudent avant d'automatiser des tâches critiques. Cet exemple présente un risque relativement faible car je peux toujours revenir en arrière et soumettre à nouveau des tâches, et je vérifie généralement que le programme fonctionne. Les sites Web changent, et si vous ne changez pas le programme en retour, vous pourriez vous retrouver avec un script qui fait quelque chose de complètement différent de ce que vous aviez initialement prévu!



En termes de ROI, ce programme me fait gagner environ 30 secondes par tâche et prend 2 heures à écrire. Donc, si je l'utilise pour réaliser 240 missions, j'aurai un plus à temps! Cependant, le gain de ce programme réside dans le développement d'une solution cool au problème et en apprend beaucoup dans le processus. Bien que mon temps aurait pu être consacré plus efficacement à terminer les devoirs plutôt qu'à trouver comment les rendre automatiquement, j'ai vraiment apprécié le défi. Il y a quelques choses aussi satisfaisantes que la résolution de problèmes, et Python s'avère être un très bon outil pour cela. ...



image



Apprenez comment obtenir une profession recherchée à partir de zéro ou augmenter vos compétences et votre salaire en suivant des cours en ligne payés par SkillFactory:











All Articles