본문 바로가기
카테고리 없음

[selenium 셀레니움]특정 시간동안 발생한 network 목록 가져오기

by Mr.noobiest 2023. 9. 20.

selenium을 사용하여 데이터를 크롤링할때, 네트워크에서 생성된 특정 동작들을 크롤링하고 싶을때가 있다.

 

물론 여러 방법이 있겠지만, 아주 간단한 코드로 특정 시간동안 발생한 네트워크들의 목록을 가져올 수 있다.

 

driver.click()이나 driver.execute_script("arguments[0].click();", body_element)를 한뒤

driver.refresh()로 네트워크를 싹 비워주는게 좋다.

 

 

from selenium.webdriver.common.action_chains import ActionChains
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By
import time

.......

driver.refresh()

script_to_execute = """
var performance = window.performance || window.mozPerformance || window.msPerformance || window.webkitPerformance || {};
var network = performance.getEntries() || {};

var filteredData = network.filter(function(entry) {
    return entry.initiatorType === 'fetch' || entry.initiatorType === 'xmlhttprequest';
});

var filteredNames = filteredData.filter(function(entry) {
    var currentTime = new Date().getTime();
    var entryTime = entry.responseEnd + performance.timeOrigin;
    var elapsedTime = currentTime - entryTime;
    return elapsedTime <= 5000;  //driver.refresh()이후 5초 동안의 네트워크 항목만 가져옵니다.
}).map(function(entry) {
    return entry.name;
});

return filteredNames;
"""

time.sleep(2)

net_data = driver.execute_script(script_to_execute)

 

위 코드에 특정이름을 가진 네트워크만 필터링하여 가져올 수 있습니다.


import time

driver.refresh()

script_to_execute = """
var performance = window.performance || window.mozPerformance || window.msPerformance || window.webkitPerformance || {};
var network = performance.getEntries() || {};

var filteredData = network.filter(function(entry) {
    return entry.initiatorType === 'fetch' || entry.initiatorType === 'xmlhttprequest';
});

var filteredNames = filteredData.filter(function(entry) {
    var currentTime = new Date().getTime();
    var entryTime = entry.responseEnd + performance.timeOrigin;
    var elapsedTime = currentTime - entryTime;
    return elapsedTime <= 5000;
}).map(function(entry) {
    return entry.name;
});

var tsFilteredNames = filteredNames.filter(function(name) {
    return name.endsWith('.zip'); //.zip으로 끝나는 네트워크명들만 가져옵니다.
});

return tsFilteredNames;
"""

# Wait for the new network requests to load
time.sleep(2)

net_data = driver.execute_script(script_to_execute)

 

이를 활용하면 분할 전송되는 파일들을 크롤링하고 merge할 수 있다.

 

끝.

728x90
반응형