Selenium headless 오류

haazz·2024년 2월 23일

python

목록 보기
1/1

selenium과 python을 이용해 크롤링 프로그램을 작동하는 도중 headless option을 추가하면 에러가 발생하는 문제에 직면했다.

1. deprecated 오류

selenium은 headless 코드를 다음과 같이 업데이트 했다. (셀레니움 공식 문서) 그래서 몇 년 전 코드를 가져왔을 때 오류가 발생했다.

from selenium.webdriver.chrome.options import Options

options = Options()
options.add_argument("--headless=new")

2. headless를 추가한 뒤로 작동하지 않는 문제

멀쩡히 작동하던 코드가 위 headless를 추가한 것만으로 작동하지 않기 시작했다. 디버깅을 통해 driver.find_elements()에서 빈 리스트가 반환되는 것을 확인했다.

원인을 다음과 같이 세 가지 정도로 추려보았다.
1. 설정해둔 대기 시간 보다 웹사이트가 열리는 시간이 더 오래 걸린다.
2. 창이 너무 작게 열려서 작동하지 않고 있다.
3. 백그라운드에서 웹사이트가 열리지 않고 있다.

1번 문제

1번 문제는 WebDriverWait()을 사용하여 해결해 보려고 하였다.
WebDriverWait(WebDriver driver, Duration timeout)에서 timeout을 100까지 늘려서 테스트해봤지만 계속해서 timeout이 발생하였기에 HTML element 자체를 찾지 못하고 있는 것을 알았다.

element = WebDriverWait(driver, 10).until( EC.visibility_of_element_located((By.CSS_SELECTOR, ".card_content .pjax")) )

2번 문제

2번 문제는 구글링을 계속하다 마주친 해결 방법이다. headless를 사용하면 브라우저의 창 사이즈가 너무 작아서 정상 동작을 안 한다는 글이었다. 그래서 바로 창 사이즈를 임의로 설정해 보았다. 하지만 이 문제는 selenium에 click()을 사용하는 경우에만 발생하는 문제로 click()을 사용하지 않는 나와는 상관없는 해결 방법이었다.

options.add_argument("--start-maximized")
options.add_argument("--window-size=1920,1080")

3번 문제

앞선 과정과 더 많은 구글링을 통해 알게 된 것은 일부 사이트에서 chrome headless를 통한 접근을 막아 놓는다는 것이었다. headless로 접근하면 user-agent 내에 자신이 headless를 통한 접근을 하고 있다는 것이 나오기 때문에 user-agent를 임의에 형태로 변경해서 해결할 수 있었다.

userAgent = "user-agent-Mozilla/5.0 ..."

options.add_arguments(userAgent)

user-agent 구조에 대해서는 정리해 놓은 정보들이 많이 있다. (user-agent 참고 블로그)

profile
Developers who create benefit social values

0개의 댓글