J'ai créé un outil pour parcourir automatiquement plusieurs sites avec Selenium (Python)

introduction

J'ai reçu un fichier texte contenant l'URL que je souhaite parcourir et j'ai créé un outil qui navigue automatiquement. Le point sur lequel j'étais particulier est youtube et yahoo, etc. ** Également sur les pages où le contenu augmente à mesure que vous faites défiler Point correspondant **. Je suis heureux que vous puissiez l'utiliser comme référence.

code

AutoBrowsing.py


import os
import re
import sys
import time
import chromedriver_binary
import requests
from selenium import webdriver

# ***fonction principale(L'exécution est en bas) ***
def main():
    #Réception du fichier de liste d'URL
    input_path = input_urls_file()
    #Obtenir la liste des URL à partir du fichier
    url_list = get_url_list(input_path)
    #Validation des URL dans la liste des URL
    validate_url(url_list)
    #Réception de la confirmation de navigation
    confirm_browsing()
    #navigation
    browsing_urls(url_list)


# ***Fonction qui accepte l'entrée du fichier de liste d'URL***
def input_urls_file():
    print("\n########## Start processing ##########")
    print("Input filepath of urls : ")
    #Accepter l'entrée de fichier(chemin complet)
    input_path = input()
    print("\nCheck input file ...\n")
    #Vérification de l'existence du fichier
    if os.path.exists(input_path):
        print('  [OK]: File exists. : ' + input_path)
    #Quitter si le fichier n'existe pas
    else:
        print("  [ERROR]: File doesn't exist! : " + input_path)
        print("\nSystem Exit.\n")
        sys.exit()
    return input_path


# ***Fonction pour obtenir la liste des URL à partir du fichier***
def get_url_list(input_path):
    #Fichier ouvert
    targetFile = open(input_path)
    #Liste des URL par ligne
    url_list = targetFile.readlines()
    #Fermer le fichier
    targetFile.close()
    return url_list


# ***Fonctions qui valident les schémas d'URL et les codes d'état***
def validate_url(url_list):
    print("\nCheck url scheme and status code ...\n")
    #Indicateur d'erreur
    hasError = False
    for url in url_list:
        # Tips:readlines()Le code de saut de ligne étant attaché à une ligne lue, supprimez-le
        unsafe_url = url.rstrip()
        #Modèle de schéma d'URL
        URL_PTN = re.compile(r"^(http|https)://")
        #Erreur si le motif ne correspond pas
        if not (URL_PTN.match(unsafe_url)):
            print("  [ERROR]: Url isn't valid! : " + unsafe_url)
            hasError = True
            #Ne demandez pas d'URL si le schéma est incorrect
            continue
        #Demande à l'URL si le schéma est correct
        r = requests.get(unsafe_url)
        #Le code d'état est 200(200 même avec redirection)Sinon une erreur
        if (r.status_code != 200):
            print("  [ERROR]: Status code isn't 200! : [" +
                  r.status_code + "]:" + unsafe_url)
            hasError = True
    #Quittez si le schéma est incorrect ou si le code d'état est autre que 200
    if hasError:
        print("\nSystem Exit.\n")
        sys.exit()
    print("  [OK]: All urls are valid and 200.")
    print("  [OK]: Number of urls : " + str(len(url_list)))


# ***Fonction qui accepte l'entrée pour commencer la navigation***
def confirm_browsing():
    # Yes/Boucle infinie sauf Non
    while True:
        print("\nStart browsing?  y/n  (default:y)")
        #Toutes les entrées sont acceptées en minuscules(Facile à comparer)
        confirm_cmd = input().lower()
        #Défaut(Enter)Traiter uniquement comme y
        if ((confirm_cmd == "") or (confirm_cmd == "y")):
            break
        elif ((confirm_cmd == "n")):
            print("\nSystem Exit.\n")
            sys.exit()
        else:
            pass


# ***Fonction pour effectuer la navigation***
def browsing_urls(url_list):
    options = webdriver.ChromeOptions()
    #Maximisez votre navigateur
    options.add_argument("--start-maximized")
    #Spécification d'une option pour désactiver "Chrome est contrôlé par un logiciel de test automatisé".
    options.add_experimental_option("excludeSwitches", ["enable-automation"])
    options.add_experimental_option('useAutomationExtension', False)
    driver = webdriver.Chrome(options=options)
    print("\n===== start =====")
    #Ouvrez le navigateur ligne par ligne
    for i, url in enumerate(url_list):
        #Sortie du nombre d'URL affichées dans toute la liste d'URL
        print("  " + str(i+1) + "/" + str(len(url_list)))
        #URL d'accès
        driver.get(url)
        #↓ S'il y a un processus que vous voulez faire dans chaque URL, changez la fonction à appeler ici
        #Traitement pour faire défiler chaque URL vers le bas
        scrolle_to_end(driver)
    print("===== end =====\n")
    #Fin
    driver.quit()
    print("Complete.\n")


# ***Une fonction qui défile vers le bas de la page***
def scrolle_to_end(driver):
    #Vitesse de défilement(Spécifiez 1 ou plus)
    SCROLL_SPEED = 3
    while not is_scrolle_end(driver):
        # 0.Attendez 5 secondes(Fondamentalement inutile, mais utilisé lorsque le chargement est lent)
        # time.sleep(0.5)
        #Faire défiler par valeur relative
        driver.execute_script("window.scrollBy(0, "+str(SCROLL_SPEED)+");")
    #Attendez 1 seconde
    time.sleep(1)


# ***Une fonction qui détermine si vous avez ou non défilé vers le bas***
def is_scrolle_end(driver):
    #Obtenez le numéro en faisant défiler vers le bas(window.Minutes de hauteur intérieure(Pour la zone d'affichage de l'écran)Tirez parce qu'il ne défile pas)
    script = "return " + str(get_page_height(driver)) + \
        " - window.innerHeight;"
    page_most_bottom = driver.execute_script(script)
    #Obtenez le montant du défilement(La méthode d'acquisition diffère selon le type et la version du navigateur.)
    script = "return window.pageYOffset || document.documentElement.scrollTop;"
    scroll_top = driver.execute_script(script)
    is_end = scroll_top >= page_most_bottom
    return is_end


# ***Fonction pour obtenir la hauteur de la page***
def get_page_height(driver):
    #Prenez la valeur maximale car elle dépend de la version du navigateur et du site
    # https://ja.javascript.info/size-and-scroll-window#ref-633
    # Tips:Si vous souhaitez écrire une chaîne de caractères sur plusieurs lignes sans saut de ligne()Entourez de
    script = ("return Math.max("
              "document.body.scrollHeight, document.documentElement.scrollHeight,"
              "document.body.offsetHeight, document.documentElement.offsetHeight,"
              "document.body.clientHeight, document.documentElement.clientHeight"
              ");")
    height = driver.execute_script(script)
    return height


#Exécution de la fonction principale
main()

↓ Exemple de fichier d'entrée

test_url_list.txt


https://www.google.com/
https://qiita.com/
https://www.youtube.com/
https://www.yahoo.co.jp/

↓ Console d'exécution

########## Start processing ##########
Input filepath of urls :
c:\Users\hoge\Desktop\work\python\AutoBrowsing\test_url_list.txt

Check input file ...

  [OK]: File exists. : c:\Users\hoge\Desktop\work\python\AutoBrowsing\test_url_list.txt

Check url scheme and status code ...

  [OK]: All urls are valid and 200.
  [OK]: Number of urls : 4

Start browsing?  y/n  (default:y)



===== start =====
  1/4
  2/4
  3/4
  4/4
===== end =====

Complete.

Prêt à courir

Le piège de la version lors de l'installation du pilote Chrome avec pip

Si vous installez avec pip lors de la numérisation de Chrome avec du sélénium, une simple installation avec la commande pip install chromedriver-binary entraînera un problème de version ** et une erreur d'exécution. ** ** Veuillez spécifier la version au moment de l'installation. Même si vous installez sans spécifier la version, si vous installez en spécifiant la version, la précédente sera automatiquement désinstallée.

fin

Cette fois, après avoir lancé le navigateur automatiquement, nous avons effectué le processus de défilement vers le bas. Le processus d'acceptation d'une liste et d'exécution de certains traitements sur cette URL semble être réutilisable, je vais donc essayer de créer autre chose.

Recommended Posts

J'ai créé un outil pour parcourir automatiquement plusieurs sites avec Selenium (Python)
J'ai fait une loterie avec Python.
J'ai créé un démon avec Python
J'ai créé un package pour filtrer les séries chronologiques avec python
Je veux assister automatiquement à des cours en ligne avec Python + Selenium!
J'ai fait un compteur de caractères avec Python
J'ai fait une carte hexadécimale avec Python
J'ai fait un jeu rogue-like avec Python
J'ai fait un simple blackjack avec Python
J'ai créé un fichier de configuration avec Python
J'ai fait un simulateur de neurones avec Python
[5e] J'ai essayé de créer un certain outil de type Authenticator avec python
J'ai créé une bibliothèque qui lit facilement les fichiers de configuration avec Python
[2nd] J'ai essayé de créer un certain outil de type Authenticator avec python
Un mémorandum lors de l'acquisition automatique avec du sélénium
[3ème] J'ai essayé de créer un certain outil de type Authenticator avec python
J'ai essayé de faire un processus d'exécution périodique avec Selenium et Python
[4th] J'ai essayé de créer un certain outil de type Authenticator avec python
[1er] J'ai essayé de créer un certain outil de type Authenticator avec python
J'ai fait une prévision météo de type bot avec Python.
J'ai créé une application graphique avec Python + PyQt5
J'ai essayé de créer un bloqueur de filles pourries sur Twitter avec Python ①
Je veux faire un jeu avec Python
Créez un outil qui secoue automatiquement furigana avec html en utilisant Mecab de Python3
[Python] J'ai créé un téléchargeur Youtube avec Tkinter.
J'ai créé un outil pour compiler nativement Hy
[Outlook] J'ai essayé de créer automatiquement un e-mail de rapport quotidien avec Python
J'ai créé un outil pour convertir Jupyter py en ipynb avec VS Code
J'ai créé un outil qui facilite un peu la décompression avec CLI (Python3)
J'ai créé un outil pour obtenir de nouveaux articles
Je veux écrire dans un fichier avec Python
J'ai fait un jeu de cueillette avec Python
Made Mattermost Bot avec Python (+ Flask)
J'ai essayé de faire un processus périodique avec CentOS7, Selenium, Python et Chrome
J'ai essayé de créer facilement un système de présence entièrement automatique avec Selenium + Python
J'ai créé un outil pour sauvegarder automatiquement les métadonnées de l'organisation Salesforce
Une histoire à laquelle j'étais accro après la communication SFTP avec python
Faisons un outil de veille de commande avec python
J'ai fait un jeu d'éclairage de sapin de Noël avec Python
J'ai créé une application de notification de nouvelles en ligne avec Python
J'ai créé un module Python pour traduire les commentaires
J'ai créé un environnement Python3 sur Ubuntu avec direnv.
J'étais accro au grattage avec Selenium (+ Python) en 2020
Je veux travailler avec un robot en python.
J'ai essayé de faire LINE BOT avec Python et Heroku
J'ai créé une bibliothèque python qui fait rouler le rang
Je veux faire fonctionner un ordinateur quantique avec Python
J'ai fait un blackjack avec du python!
J'ai fait un texte Python
J'ai fait un blackjack avec Python.
J'ai créé wordcloud avec Python.
J'ai créé un système qui décide automatiquement de s'exécuter demain avec Python et l'ajoute à Google Agenda.
J'ai créé un programme pour convertir des images en art ASCII avec Python et OpenCV
J'ai essayé de générer automatiquement la chaîne de caractères à entrer dans M. Adjustment avec Python
[Python] J'ai essayé de créer automatiquement un rapport quotidien de YWT avec la messagerie Outlook
Créez un bot Mastodon avec une fonction pour répondre automatiquement avec Python