테스트 사이트 - 개발 중인 베타 버전입니다

[Selenium] proxy를 사용하지 않고 개발자도구에서 Network 탭의 로그를 얻기

· 4년 전 · 2624

image.png.jpg

 

안녕하세요?

 

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

 

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

 

하지만 proxy를 사용하지 않고서도 Geckodriver(Firefox) 및 javascript를 적절히 활용하여

 

네트워크 탭의 로그를 얻을 수 있는 방법이 있어요!

 

[code]

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 in logs] # 네트워크 탭에서 name만 추출합니다.

print(names)

[/code]

 

 

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

 

[code]

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

[/code]

 

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

 

 

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

 

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

 

제 추측으로는 페이지 로딩 후의 async/ajax call에 대해서는 누락이 되는 것 같아요~ ㅠㅠ

 

 

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

 

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

 

참고로 위 방법을 활용하여 EBS FM 온에어를 다운로드하는 스크립트가 잘 작동하는 것을 확인했네요.

 

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

 

댓글 작성

댓글을 작성하시려면 로그인이 필요합니다.

로그인하기

게시글 목록

번호 제목
17591
17590
17589
17588
17587
17584
17583
17582
17581
17579
17577
17575
17574
17573
17572
17569
17564
17560
17559
17555
17554
17553
17552
17549
17548
17547
17542
17533
17531
17524