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