셀레니움(selenium)

셀레니움에서 네트워크 로그 추출 (with 파이썬)

유니네 라이브러리 2024. 5. 7. 21:24

셀레니움(Selenium)에서 네트워크 로그 가져오기

이미지 로드 실패(404, 502 오류) 추적하기

네트워크 로그 자동 저장 및 분석 코드 제공

 

📌 1. 셀레니움에서 네트워크 로그 추출하기

 

📌 네트워크 로그를 가져오기 위해 performance 로그 사용

📌 셀레니움(Selenium)의 LogTypeperformance 필드 활용

driver = webdriver.Chrome(options=chrome_options)
# 네트워크 로그 가져오기
network_logs = driver.get_log("performance")

출력된 네트워크 로그를 JSON 파일로 저장하여 자동 분석 가능

웹페이지에서 이미지 요청이 실패한 경우(404, 502 오류) 확인 가능

 

📌 2. 네트워크 로그 자동 저장 코드

 

📌 로그에서 특정 정보만 추출하여 파일로 저장

📌 JPG, JPEG 이미지 로드 실패(404, 502 오류)만 추출 가능

import json

# 네트워크 로그 저장 함수
def networklogwrite(filename):    
    # 네트워크 로그 가져오기
    network_logs = driver.get_log("performance")
    
    with open(filename, "w", encoding="utf-8") as f: 
        f.write("[") 
        
        for log in network_logs:
            # JSON 데이터에서 필요한 부분만 추출
            network_log = json.loads(log["message"])["message"]  
            
            if("Network.response" in network_log["method"] 
                    or "Network.request" in network_log["method"] 
                    or "Network.webSocket" in network_log["method"]):                 
                
                if("response" in network_log["params"] ): 
                    # .jpg, .jpeg 이미지 또는 404, 502 오류 발생 시 저장
                    if ("/jpg" in json.dumps(network_log)
                        or "/jpeg" in json.dumps(network_log)                        
                        or '"status": 404' in json.dumps(network_log)
                        or '"status": 502' in json.dumps(network_log)):
                        
                        f.write(json.dumps(network_log, indent=2, ensure_ascii=False) + "\n\n")
        
        f.write("]")

실제 웹페이지에서 불러온 이미지 중 실패한 요청(404, 502 오류)만 저장 가능

자동화가 필요한 경우 유용

 

📌 3. 풀 코드: 자동 스크롤 + 네트워크 로그 분석

 

📌 시나리오:

1️⃣ 지정한 URL 기준 하단까지 스크롤

2️⃣ 인피니티 스크롤인 경우 30,000 길이까지만 스크롤

3️⃣ 네트워크 응답로그중 jpg, jpeg, 404 not found, 502 bad gateway 발생인 경우, 파일 발췌하여 file 로 저장

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys
import time
import json

# 모바일환경설정 (iPhone 12 Pro)
mobile_emulation = { "deviceName": "iPhone 12 Pro" }

chrome_options = webdriver.ChromeOptions()
chrome_options.add_argument("--incognito") #시크릿모드
chrome_options.add_experimental_option("detach", True)
chrome_options.add_argument("--auto-open-devtools-for-tabs")
chrome_options.add_experimental_option("mobileEmulation", mobile_emulation)

#network log 추출에 필요
chrome_options.add_argument("--enable-logging")
chrome_options.add_argument("--v=1")
#크롬 드라이버 있는 폴더를 지정한다.
chrome_options.add_argument("--user-data-dir=C:/크롬 드라이버 있는 폴더 지정")
chrome_options.set_capability('goog:loggingPrefs',{'performance': 'ALL'})

#크롬 드라이버 실행
driver=webdriver.Chrome(options=chrome_options)

# 대상 URL 설정 
url = 'https://shopping.naver.com/home'
driver.get(url)
# 인피니티 스크롤 대처 변수 설정
endScroll = 10000

#네이버 쇼핑 초기 레이어팝업 닫기 클릭하기
driver.find_element(By.XPATH,'//*[@id="gnb-header"]/div[4]/div/div/button[2]').send_keys(Keys.ENTER)

time.sleep(1)

#네트워크 로그 쓰기
def networklogwrite(filename):    
    # 네트워크 로그 가져오기
    network_logs = driver.get_log("performance")
    img_size = 0
    with open(filename, "w", encoding="utf-8") as f: 
        f.write("[") 
        # 네트워크 로그에서 json 구조에서 원하는 부분만 추출하여 parsing 처리
        for log in network_logs:
            # json의 message key 부분 발췌
            network_log = json.loads(log["message"])["message"] 
            # json의 method key 부분 발췌
            if("Network.response" in network_log["method"] 
                    or "Network.request" in network_log["method"] 
                    or "Network.webSocket" in network_log["method"]):                 
                #response 부분 발췌
                if("response" in network_log["params"] ): 
                    #.jpg, jpeg, 상태코드 404, 502 부분 있으면 파일에 write
                    if ("/jpg" in json.dumps(network_log)
                        or "/jpeg" in json.dumps(network_log)                        
                        or '"status": 404' in json.dumps(network_log)
                        or '"status": 502' in json.dumps(network_log)):
                        f.write(json.dumps(network_log, indent=2, ensure_ascii=False)+"\n\n")
                
        f.write("]")        

#스크롤 함수
def webScroll(i_present_location, i_filename):
    print("#####Start Scroll#####")
    time.sleep(1)
    #스크롤 시작지점 초기화
    from_scroll_height = 0
    #스크롤 종료지점 초기화
    to_scroll_height = 500
    last_height = driver.execute_script("return document.body.scrollHeight")    
    
    while True:
        #scroll 진행
        driver.execute_script("window.scrollTo("+ str(from_scroll_height) + "," + str(to_scroll_height) + ")")
        time.sleep(1)
        #현재 스크롤 위치
        present_location = driver.execute_script("return window.pageYOffset")
        #페이지 하단에 위치하면 종료
        if last_height == present_location:
            #하단 메뉴 보이고 나가기
            driver.execute_script("window.scrollTo("+ str(to_scroll_height) + "," + str(from_scroll_height) + ")")
            networklogwrite(i_filename)
            break
        #현 위치값이 인수로 넘어온 값보다 커지면 종료
        elif present_location > i_present_location:
            driver.execute_script("window.scrollTo("+ str(to_scroll_height) + "," + str(from_scroll_height) + ")")
            networklogwrite(i_filename)
            break
        else:
            #이동여부 판단 기준이 되는 이전 위치 값 수정
            last_height = driver.execute_script("return window.pageYOffset")
            #하단 위치 +500 씩 이동
            from_scroll_height = to_scroll_height + 1
            to_scroll_height = to_scroll_height + 500
    print("#####End Scroll#####")

#스크롤 함수 호출 : 함수에 넘기는 인수는 무한스크롤에 대처하기 위해 현 스크롤 위치가 인수값을 넘기면 종료시키기 위해 전달
webScroll(endScroll, "logfile.json")

time.sleep(5)    
driver.quit()

네트워크 로그를 추출하면서 자동으로 스크롤 가능

모든 요청 로그 중 이미지 로드 실패(404, 502 오류) 필터링하여 저장

 

📌 4. Windows 환경에서 발생하는 오류 해결

 

📌 Windows 10에서 실행 시 log type 'performance' not found 오류 발생 가능

📌 해결 방법: user-data-dir 설정 및 bat 파일 실행

 

🔹 크롬 옵션 설정

chrome_options.add_argument("--user-data-dir=C:/크롬 드라이버 있는 폴더")

 

🔹 bat 파일 생성 (예: userdatabatch.bat)

cmd > C:\Program Files (x86)\Google\Chrome\Application\chrome.exe --remote-debugging-port=9222 --user-data-dir="C:/크롬드라이버 있는 폴더"

🔹 bat 파일 실행 후 파이썬 코드 실행

1️⃣ userdatabatch.bat 실행

2️⃣ Python 코드 실행

 

Windows 환경에서도 performance 로그 정상적으로 가져올 수 있다.

 

✅ 정리 & 마무리

 

셀레니움에서 네트워크 로그(performance 필드) 추출 가능

자동 스크롤과 함께 로그를 저장하여 분석 가능

JPG, JPEG 이미지 요청 실패(404, 502 오류) 자동 탐색 가능

Windows 환경에서는 user-data-dir 설정으로 오류 해결 가능

 

📚 셀레니움 개발문서 참고

 

LogType

This log type pertains to logs relating to performance timings.

www.selenium.dev

 

📚 log type "performance not found" 에러 발생 시 도움받은 블로그

 

[selenium]log type 'performance' not found[Solve] 해결하기

굳이 bs4나 requests를 안쓰고 selenium을 사용하는 이유는 다양하겠지만, 보통 API가 없어서 "반드시 로그인이 필요한 경우"에 로그인 과정을 인위적으로 구현하기 위해서 사용하는 경우가 많다. 이때

mrnoobiest.tistory.com