본문 바로가기

PYTHON/자동화

selenium headless chrome

728x90

selenium headless

chrome_options = webdriver.ChromeOptions() # 크롬 옵션 객체 생성
chrome_options.add_argument('headless') # headless 모드 설정
chrome_options.add_argument("--disable-gpu" ) # gpu(그래픽 카드 가속) 사용 안하도록 설정
chrome_options.add_argument("lang=ko_KR") # 한국어로 실행되도록 설정
chrome_options.add_argument('window-size=1920x1080') # 일반적인 모니터 사이즈로 설정

driver = webdriver.Chrome("드라이버 경로", chrome_options=chrome_options)

https://beomi.github.io/2017/09/28/HowToMakeWebCrawler-Headless-Chrome/

아래는 (2017년 내용이라서 의미가 있을지 모르겠음.)
user-agent 바꾸는 방법 외에는 모두 javascript를 이용해 값을 추출하고 오버라이딩 하는 방식.
하지만, driver.execute_script 함수는 사이트 로딩이 끝난 후 onload()이후 실행되기 때문에 빈칸으로 나옴
사이트 로딩 전 실행되어야 한다!

# <useragent에 'Headless'라는 단어가 들어가있다.>
# 일반적인 사용자는 headless를 사용하지 않기 때문에 봇으로 추측하고 제재를 가할 수 있다.
#  따라서 UserAgent 값 새로 정하기 
chrome_options.add_argument("일반적인 크롬브라우저의 UserAgent")
# useragent 값 확인하기
user_agent = driver.find_element_by_css_selector('#user-agent').text
print('User-Agent: ', user_agent)


# <플러그인이 0개>
# 플러그인의 갯수 확인
if(navigator.plugins.length === 0) {
    console.log("Headless 크롬이 아닐까??");
}
# 가짜 플러그인 만들기 (url을 get하기 전에 넣어주기)
# JS로 navigator객체의 plugins 속성 자체를 오버라이딩 해 임의의 배열을 반환해 개수를 속임
driver.execute_script("Object.defineProperty(navigator, 'plugins', {get: function() {return[1, 2, 3, 4, 5];},});")
# 단, 사이트가 로딩될 때 이미 저 속성이 들어가있어 plugin length는 여전히 0으로 나올 것임
plugins_length = driver.find_element_by_css_selector('#plugins-length').text


# <언어 설정이 되어있지 않다.>
# 언어설정
driver.execute_script("Object.defineProperty(navigator, 'languages', {get: function() {return ['ko-KR', 'ko']}})")
#단, 사이트가 로딩될 때 이미 저 속성이 들어가있어 language는 빈칸으로 나올 것임
languages = driver.find_element_by_css_selector('#languages').text

# <gpu(그래픽 가속) 꺼져있음>
# WebGL렌더러를 Nvidia회사와 GTX980Ti엔진인 ‘척’
driver.execute_script("const getParameter = WebGLRenderingContext.getParameter;WebGLRenderingContext.prototype.getParameter = function(parameter) {if (parameter === 37445) {return 'NVIDIA Corporation'} if (parameter === 37446) {return 'NVIDIA GeForce GTX 980 Ti OpenGL Engine';}return getParameter(parameter);};")

#스크린샷
driver.get_screenshot_as_file('image.png')