Obtenez des informations équivalentes à l'onglet Réseau des outils de développement Chrome avec Python + Selenium

Chose que tu veux faire

L'onglet Réseau de l'outil de développement de Chrome (celui qui s'ouvre avec Ctl + Shift + i sous Windows) est un outil intéressant qui vous permet de voir la chronologie des données acquises par le navigateur et de simuler la vitesse de la ligne.

Cette fois, j'obtiendrai simplement la liste des URL des fichiers affichés sur cet onglet Réseau avec Python + Selenium.

environnement

Chrome 79.0.3945.45 beta Python 3.7.3 selenium 3.141.0 chromedriver-binary 79.0.3945.36.0

Debian GNU/Linux 9 (Docker container)

la mise en oeuvre

Jusqu'à ce que la page soit acquise par Selenium, c'est comme suit. Définissez les options de manière appropriée, comme le mode sans tête. J'obtiens la page avec driver.get (), mais cet excellent article a été très utile pour la connaissance de base de cela.

netlogs.py


caps = DesiredCapabilities.CHROME
caps["goog:loggingPrefs"] = {"performance": "ALL"} 
# caps["loggingPrefs"] = {"performance": "ALL"} 

# options
options = ChromeOptions()
options.add_argument('--headless')
options.add_argument('--no-sandbox')
options.add_argument('--disable-dev-shm-usage')
options.add_argument('--disable-gpu')
options.add_argument('--ignore-certificate-errors')
options.add_argument('--user-agent='+_headers["User-Agent"])

# get driver
driver = Chrome(options=options, desired_capabilities=caps)
driver.implicitly_wait(5)
driver.get("https://qiita.com/")

Le journal contenant l'URL est nommé performance, alors définissezDesiredCapabilities pour obtenir le journal [^ 1] Je vous donnerai ceci lorsque vous aurez le pilote [^ 2].

Le nom du paramètre «DesiredCapabilities» dépend de l'environnement. Dans certains cas, cela ne fonctionnerait pas à moins que ce ne soit "logging Prefs" au lieu de "goog: logging Prefs". Est-ce différent selon la version de Chrome ...?

netlogs.py


time.sleep(2)

J'attendrai que la page se charge. Il semble que la théorie soit d'attendre avec driver.implicitly_wait (), J'ai mis un sommeil parce que je ne pouvais pas bien obtenir les données souhaitées. S'il vous plaît laissez-moi savoir s'il existe un moyen plus intelligent ...

netlogs.py


netLog = driver.get_log("performance")

Le journal acquis par driver.get_log (" performance ") est au format JSON et ressemble à ce qui suit.

performance


[
    {'level': 'INFO', 'message': '{
            "message": {
                "method": "Page.frameResized",
                "params": {}
            },
            "webview": "***"
        }', 'timestamp': ***
    },
    {'level': 'INFO', 'message': '{

    ...

Je vais extraire uniquement la partie nécessaire du journal des performances acquis.

netlogs.py


def process_browser_log_entry(entry):
    response = json.loads(entry['message'])['message']
    return response

events = [process_browser_log_entry(entry) for entry in netLog]
events = [event for event in events if 'Network.response' in event['method']]

detected_url = []
for item in events:
    if "response" in item["params"]:
        if "url" in item["params"]["response"]:
            detected_url.append(item["params"]["response"]["url"])

Parmi les propriétés «message», celles qui incluent en outre «Network.responseReceived» dans le nom «méthode» «sont extraites de manière sélective. Ensuite, les «événements» extraits seront un ensemble d'éléments comme suit. Après cela, trouvez l'élément contenant " url " dans "params" => "response", extrayez-le et stockez-le dans found_url.

network.response


[
    {
        "method": "Network.responseReceivedExtraInfo",
        "params": {
            "blockedCookies": [],
            "headers": {
                "cache-control": "max-age=0, private, must-revalidate",
                "content-encoding": "gzip",
                "content-type": "text/html; charset=utf-8",
                "date": "Sat, 23 Nov 2019 07:41:40 GMT",
                "etag": "W/\"***\"",
                "referrer-policy": "strict-origin-when-cross-origin",
                "server": "nginx",
                "set-cookie": "***",
                "status": "200",
                "strict-transport-security": "max-age=2592000",
                "x-content-type-options": "nosniff",
                "x-download-options": "noopen",
                "x-frame-options": "SAMEORIGIN",
                "x-permitted-cross-domain-policies": "none",
                "x-request-id": "***",
                "x-runtime": "***",
                "x-xss-protection": "1; mode=block"
            },
            "requestId": "***"
        }
    },
    {
    ...

Code entier

netlogs.py


caps = DesiredCapabilities.CHROME
caps["goog:loggingPrefs"] = {"performance": "ALL"}

options = ChromeOptions()
options.add_argument('--headless')
options.add_argument('--no-sandbox')
options.add_argument('--disable-dev-shm-usage')
options.add_argument('--disable-gpu')
options.add_argument('--ignore-certificate-errors')
options.add_argument('--user-agent='+_headers["User-Agent"])

driver = Chrome(options=options, desired_capabilities=caps)
driver.implicitly_wait(5)
driver.get("https://qiita.com/")

time.sleep(2)

netLog = driver.get_log("performance")

def process_browser_log_entry(entry):
    response = json.loads(entry['message'])['message']
    return response
events = [process_browser_log_entry(entry) for entry in netLog]
events = [event for event in events if 'Network.response' in event['method']]

detected_url = []
for item in events:
    if "response" in item["params"]:
        if "url" in item["params"]["response"]:
            detected_url.append(item["params"]["response"]["url"])

Autre méthode

Il semble que vous puissiez également exécuter un script pour obtenir les informations ci-dessus [^ 3].

netlogs_js.py


scriptToExecute = "var performance = window.performance || window.mozPerformance || window.msPerformance || window.webkitPerformance || {}; var network = performance.getEntries() || {}; return JSON.stringify(network);"
netData = driver.execute_script(scriptToExecute)
netJson = json.loads(str(netData))

detected_url = []
for item in netJson:
    detected_url.append(item["name"])

J'ai également pu obtenir les informations de liste de l'URL par cette méthode.

Cependant, parfois, le fichier souhaité n'est pas inclus, et je pense que ce n'est pas une méthode stable. (Non vérifié correctement)

Veuillez indiquer s'il existe un meilleur moyen!

[^ 1]: J'ai fait référence à ceci (presque une copie) - [Selenium --python. Comment capturer la réponse du trafic réseau [duplicate]](https://stackoverflow.com/questions/52633697/selenium-python-how- pour-capturer-la-réponse-trafic-réseau)

Recommended Posts

Obtenez des informations équivalentes à l'onglet Réseau des outils de développement Chrome avec Python + Selenium
PhytoMine-I a essayé d'obtenir les informations génétiques de la plante avec Python
J'ai essayé d'obtenir les informations sur le film de l'API TMDb avec Python
Essayez d'automatiser le fonctionnement des périphériques réseau avec Python
Récupérez la source de la page à charger indéfiniment avec python.
Comment obtenir les informations des organisations, Cost Explorer d'un autre compte AWS avec Lambda (python)
Obtenez la largeur du div côté serveur avec Selenium + PhantomJS + Python
J'ai essayé d'obtenir le code d'authentification de l'API Qiita avec Python.
Fonctionnement automatique de Chrome avec Python + Sélénium + pandas
Obtenez des informations sur le processeur de Raspberry Pi avec Python
Script Python pour obtenir des informations de note avec REAPER
Remarque: Comment obtenir le dernier jour du mois avec python (ajouté le premier jour du mois)
Comment obtenir une liste de fichiers dans le même répertoire avec python
[Introduction à Python] Comment obtenir l'index des données avec l'instruction for
Comment obtenir le nombre de chiffres en Python
Ajoutez des informations au bas de la figure avec Matplotlib
Essayez d'obtenir le contenu de Word avec Golang
Obtenez l'état de fonctionnement de JR West avec Python
Comment passer en mode smartphone avec Python + Selenium + Chrome
Pour faire l'équivalent de Ruby ObjectSpace._id2ref en Python
J'ai essayé d'automatiser la mise à jour de l'article du blog Livedoor avec Python et sélénium.
Obtenez des informations sur l'alambic avec Python
J'ai essayé de trouver l'entropie de l'image avec python
Essayez d'obtenir la liste des fonctions du paquet Python> os
J'ai essayé d'obtenir les informations de localisation du bus Odakyu
Connaissances minimales pour démarrer avec le module de journalisation Python
Obtenez une liste des livres électroniques DMM achetés avec Python + Selenium
Je veux obtenir des informations sur le fonctionnement de Yahoo Route
Comment entrer dans l'environnement de développement Python avec Vagrant
[Introduction à Python] Comment obtenir des données avec la fonction listdir
Essayez d'importer dans la base de données en manipulant ShapeFile d'informations numériques sur les terres nationales avec Python
Comment déterminer l'existence d'un élément sélénium en Python
Lien pour commencer avec python
Comment obtenir l'ID de Type2Tag NXP NTAG213 avec nfcpy
[Python] Comment obtenir le premier et le dernier jour du mois
Obtenez la météo avec les requêtes Python
Obtenez la météo avec les requêtes Python 2
Je veux sortir le début du mois prochain avec Python
Exportez le contenu de ~ .xlsx dans le dossier en HTML avec Python
Comment obtenir la version Python
Comment démarrer avec Python
Obtenez et définissez la valeur du menu déroulant en utilisant Python et Selenium
Comment installer automatiquement le pilote Chrome pour la version Chrome avec Python + Selenium + Chrome
Un mémo d'un programme qui récupère une date à deux chiffres avec javascript, Ruby, Python ou un script shell.
De l'introduction de JUMAN ++ à l'analyse morphologique du japonais avec Python
J'ai essayé d'améliorer l'efficacité du travail quotidien avec Python
Obtenez des informations météorologiques avec Python et le grattage
Le moyen le plus rapide d'obtenir régulièrement des images de caméra avec opencv de python
J'ai essayé d'obtenir et d'analyser les données statistiques de la nouvelle Corona avec Python: données de l'Université John's Hopkins
Python VBA pour obtenir une capture de la page WEB entière avec Selenium
[Yahoo! Weather Replacement Version] Comment obtenir des informations météo avec LINE Notify + Python
Comment obtenir la différence de date et d'heure en secondes avec Python
Essayez d'imaginer les données d'élévation du National Land Research Institute avec Python
Cliquez sur les liens Selenium afin d'obtenir les éléments des pages individuelles
[Introduction à Python] Comment trier efficacement le contenu d'une liste avec le tri par liste
Obtenez le nombre de visites sur chaque page avec ReportingAPI + Cloud Functions
[Python] Comment définir la taille de la fenêtre (cliente) dans le navigateur avec Selenium