Mit Python + Selenium erhalten Sie Informationen, die der Registerkarte "Netzwerk" der Chrome-Entwicklertools entsprechen

Was du machen willst

Die Registerkarte "Netzwerk" des Chrome-Entwicklertools (das unter Windows mit Strg + Umschalt + i geöffnet wird) ist ein interessantes Tool, mit dem Sie die Zeitleiste der vom Browser erfassten Daten anzeigen und die Liniengeschwindigkeit simulieren können.

Dieses Mal erhalte ich einfach die URL-Liste der Dateien, die auf dieser Registerkarte Netzwerk mit Python + Selen angezeigt werden.

Umgebung

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)

Implementierung

Bis die Seite von Selenium erworben wurde, ist dies wie folgt. Stellen Sie Optionen wie den Headless-Modus entsprechend ein. Ich bekomme die Seite mit driver.get (), aber dieser ausgezeichnete Artikel war sehr hilfreich für das Grundwissen darüber.

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/")

Das Protokoll, das die URL enthält, heißt "Leistung". Setzen Sie daher "Gewünschte Fähigkeiten", um das Protokoll [^ 1] abzurufen. Ich gebe dir das, wenn du den Treiber bekommst [^ 2].

Der Einstellungsname von "DesiredCapabilities" hängt von der Umgebung ab. In einigen Fällen würde es nicht funktionieren, wenn nicht "Einstellungen protokollieren" anstelle von "goog: Einstellungen protokollieren". Unterscheidet es sich je nach Chrome-Version ...?

netlogs.py


time.sleep(2)

Ich werde warten, bis die Seite geladen ist. Es scheint, dass die Theorie darin besteht, mit driver.implicitly_wait () zu warten. Ich habe geschlafen, weil ich die gewünschten Daten nicht gut bekommen konnte. Bitte lassen Sie mich wissen, ob es einen intelligenteren Weg gibt ...

netlogs.py


netLog = driver.get_log("performance")

Das von "driver.get_log (" performance ")" erfasste Protokoll hat ein JSON-ähnliches Format und sieht wie folgt aus.

performance


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

    ...

Ich werde nur den erforderlichen Teil aus dem erfassten Leistungsprotokoll extrahieren.

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"])

Von den Eigenschaften "message" werden diejenigen selektiv extrahiert, die "Network.responseReceived" im Namen "method" enthalten. Dann sind die extrahierten "Ereignisse" eine Reihe von Elementen wie folgt. Danach suchen und extrahieren wir Elemente, die "url" in "params" => "response" enthalten, und speichern sie in "detect_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": "***"
        }
    },
    {
    ...

Ganzer Code

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"])

Andere Methode

Es scheint, dass Sie auch ein Skript ausführen können, um die obigen Informationen zu erhalten [^ 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"])

Mit dieser Methode konnte ich auch die Listeninformationen der URL abrufen.

Manchmal ist die gewünschte Datei jedoch nicht enthalten, und ich bin der Meinung, dass dies keine stabile Methode ist. (Nicht richtig verifiziert)

Bitte weisen Sie darauf hin, ob es einen besseren Weg gibt!

[^ 1]: Ich habe darauf verwiesen (fast kopiert) - [Selenium - Python. So erfassen Sie die Antwort des Netzwerkverkehrs [Duplikat]](https://stackoverflow.com/questions/52633697/selenium-python-how- to-Capture-Network-Traffics-Antwort)

Recommended Posts

Mit Python + Selenium erhalten Sie Informationen, die der Registerkarte "Netzwerk" der Chrome-Entwicklertools entsprechen
PhytoMine-I hat versucht, mit Python die genetischen Informationen der Pflanze zu erhalten
Ich habe versucht, die Filminformationen der TMDb-API mit Python abzurufen
Versuchen Sie, den Betrieb von Netzwerkgeräten mit Python zu automatisieren
Holen Sie sich die Quelle der Seite unbegrenzt mit Python zu laden.
So erhalten Sie Informationen von Organisationen, Cost Explorer eines anderen AWS-Kontos bei Lambda (Python)
Ermitteln Sie mit Selenium + PhantomJS + Python die Breite des Div auf der Serverseite
Ich habe versucht, den Authentifizierungscode der Qiita-API mit Python abzurufen.
Automatischer Betrieb von Chrome mit Python + Selen + Pandas
Holen Sie sich CPU-Informationen von Raspberry Pi mit Python
Python-Skript zum Abrufen von Notizinformationen mit REAPER
Hinweis: So erhalten Sie den letzten Tag des Monats mit Python (hinzugefügt am ersten Tag des Monats)
So erhalten Sie mit Python eine Liste der Dateien im selben Verzeichnis
[Einführung in Python] So erhalten Sie den Datenindex mit der for-Anweisung
So ermitteln Sie die Anzahl der Stellen in Python
Fügen Sie mit Matplotlib Informationen am unteren Rand der Abbildung hinzu
Versuchen Sie, den Inhalt von Word mit Golang zu erhalten
Holen Sie sich mit Python den Betriebsstatus von JR West
So wechseln Sie mit Python + Selenium + Chrome in den Smartphone-Modus
Um das Äquivalent von Rubys ObjectSpace._id2ref in Python zu tun
Ich habe versucht, das Artikel-Update des Livedoor-Blogs mit Python und Selen zu automatisieren.
Holen Sie sich Alembic-Informationen mit Python
Ich habe versucht, die Entropie des Bildes mit Python zu finden
Versuchen Sie, die Funktionsliste des Python> os-Pakets abzurufen
Ich habe versucht, die Standortinformationen des Odakyu-Busses zu erhalten
Mindestkenntnisse, um mit dem Python-Protokollierungsmodul zu beginnen
Holen Sie sich eine Liste der mit Python + Selen gekauften DMM-E-Books
Ich möchte Betriebsinformationen über die Yahoo-Route erhalten
So gelangen Sie mit Vagrant in die Python-Entwicklungsumgebung
[Einführung in Python] So erhalten Sie Daten mit der Funktion listdir
Versuchen Sie, in die Datenbank zu importieren, indem Sie ShapeFile mit numerischen Informationen zum nationalen Land mit Python bearbeiten
So bestimmen Sie die Existenz eines Selenelements in Python
Link, um mit Python zu beginnen
So erhalten Sie die ID von Type2Tag NXP NTAG213 mit nfcpy
[Python] So erhalten Sie den ersten und den letzten Tag des Monats
Holen Sie sich das Wetter mit Python-Anfragen
Holen Sie sich das Wetter mit Python-Anfragen 2
Ich möchte den Anfang des nächsten Monats mit Python ausgeben
Geben Sie den Inhalt von ~ .xlsx im Ordner mit Python in HTML aus
So erhalten Sie die Python-Version
Erste Schritte mit Python
Rufen Sie den Wert des Dropdown-Menüs mit Python und Selen ab und legen Sie ihn fest
So installieren Sie Chrome Driver für Chrome automatisch mit Python + Selenium + Chrome
Ein Memo eines Programms, das ein zweistelliges Datum mit Javascript, Ruby, Python oder einem Shell-Skript abruft.
Von der Einführung von JUMAN ++ bis zur morphologischen Analyse von Japanisch mit Python
Ich habe versucht, die Effizienz der täglichen Arbeit mit Python zu verbessern
Holen Sie sich Wetterinformationen mit Python & Scraping
Der schnellste Weg, um regelmäßig Kamerabilder mit Pythons OpenCV zu erhalten
Ich habe versucht, die statistischen Daten der neuen Corona mit Python abzurufen und zu analysieren: Daten der Johns Hopkins University
Python VBA, um mit Selenium die gesamte WEB-Seite zu erfassen
[Yahoo! Weather Replacement Version] So erhalten Sie Wetterinformationen mit LINE Notify + Python
So ermitteln Sie mit Python den Unterschied zwischen Datum und Uhrzeit in Sekunden
Versuchen Sie, die Höhendaten des National Land Research Institute mit Python abzubilden
Klicken Sie auf die Selenium-Links, um die Elemente der einzelnen Seiten abzurufen
[Einführung in Python] So sortieren Sie den Inhalt einer Liste effizient mit Listensortierung
Mit ReportingAPI + Cloud-Funktionen können Sie die Anzahl der Besuche auf jeder Seite ermitteln
[Python] So stellen Sie mit Selenium die (Client-) Fenstergröße im Browser ein