• 목록
  • 아래로
  • 위로

image.png.jpg

 

안녕하세요?

 

오래간만에 작성하는 강좌네요 ^-^

 

 

웹 크롤링을 하다보면 때로는 Selenium에서 개발자도구 중 '네트워크' 탭의 로그를 얻어야 하는 경우가 발생합니다.

 

이런 경우에는 BrowserMobProxy와 같은 proxy를 사용하는 방법이 일반적이죠~

 

하지만 proxy를 사용하지 않고서도 Geckodriver(Firefox) 및 javascript를 적절히 활용하여 네트워크 탭의 로그를 얻을 수 있어요!

 

 

from selenium import webdriver
import time

driver = webdriver.Firefox() # 파폭만 가능한 방법입니다.
driver.get('URL을 입력하세요')
time.sleep(2) # 적당한 딜레이를 필요로 합니다.
logs = driver.execute_script("var performance = window.performance || window.mozPerformance || window.msPerformance || window.webkitPerformance || {}; var network = performance.getEntries() || {}; return network;")
names = [x['name'] for x in logs] # 네트워크 탭에서 name만 추출합니다.
print(names)

 

 

만약 네트워크 탭의 name 중에서 특정 확장자만 추출하려면

 

names = [x['name'] for x in test if x['name'].split('.')[-1] == '원하는 확장자']

 

이런 방식으로 추출할 수 있겠네요 :)

 

 

다만 브라우저에서 직접 특정 페이지를 열고 개발자도구에서 requests 개수를 확인한 결과와

 

위와 같은 방법으로 얻어진 dict의 길이를 비교하는 테스트를 해보면 약간의 차이가 발생하는군요 ㅎㄷㄷ

 

아마도 페이지 로딩 후의 async/ajax call에 대해서는 누락이 되는 것 같아요 ㅠㅠ

 

결론적으로 proxy를 사용하는 것만큼 완벽한 로그를 얻을 수는 없지만,

 

경우에 따라서는 proxy의 대안이 되기에 충분할 수도 있겠네요 :)

 

 

허접한 내용인데 읽어주셔서 감사합니다~

 

그럼 즐거운 주말 되세요 ^^

 

포함 3명이 추천

추천인 3

작성자
이니스프리 119 Lv. (2%) 4154510/115200000EXP

Make StudyForUs Great Again!

 

CSVpuymXAAAVVpd.jpg

댓글 0

권한이 없습니다.