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.
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)
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": "***"
}
},
{
...
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"])
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