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
반응형