Headless chrome 으로 크롤링(crawling)하기

Chrome 59 부터는 명령행에서 옵션으로 실행할 수 있는 헤드리스 모드가 추가되었습니다. 즉 별도의 GUI 창이 뜨지 않고 사이트에 접속해서 페이지를 받는등의 작업을 실행할 수 있습니다.

헤드리스 크롬을 사용하면 정확히 페이지를 렌더링할 수 있으므로 크롤러 제작이나 업무 자동화시 유용합니다.

크롬 버전과 설치 정보는 URL 에 chrome://version/ 를 입력하면 확인할 수 있습니다.


설치

사용하는 운영체제에 맞는 chrome 을 설치하면 헤드리스 모드를 사용할 수 있으며 리눅스에 설치할 경우 Linux 에 크롬(Chrome) 브라우저 설치하기 를 참고하세요.


alias 등록

설치가 끝났으면 사용하기 쉽도록 초기화 파일에 alias 로 등록해 줍니다.


Linux/OS X 에서는 .bash_profile 이나 .zshrc 에 다음 alias 추가합니다.

alias chrome='google-chrome' 
alias hchrome='chrome --headless'


Windows 는 PowerShell 에서 다음 function 을 설정해 주면 편리하게 사용할 수 있습니다.

기본 파라미터 설정하는 방법을 몰라서 chrome 만 alias 해서 사용하고 있습니다. 아래 예시에서 hchrome  명령어는 chrome --headless 로 바꿔서 실행하면 됩니다.

cmder alias
Set-Alias chrome "C:\Program Files (x86)\Google\Chrome\Application\chrome.exe"
function  hchrome { 
	chrome --headless $args 
}


사용


pdf 로 저장

--print-to-pdf 옵션을 사용하면 웹 사이트를 PDF 로 저장할 수 있습니다.

hchrome --print-to-pdf=d:\naver.pdf http://naver.com

Windows 에서는 --print-to-pdf 옵션 뒤에 저장할 파일을 절대 경로로 지정해야 정상 동작합니다.

Windows 에서 headless 모드로 실행시 아무 결과가 안나오면 --enable-logging  옵션을 추가해서 실행해 보면 실행 결과를 알수 있습니다.

hchrome --screenshot https://www.chromestatus.com/ --enable-logging

C:\Users\lesstif\ [0420/100443.104:WARNING:headless_browser_main_parts.cc(83)] Cannot create Pref Service with no user data dir.
[0420/100445.050:ERROR:headless_shell.cc(592)] Writing to file screenshot.png was unsuccessful, could not open file: FILE_ERROR_ACCESS_DENIED


dom 출력

--dump-dom 옵션을 사용하면 document.body.innerHTML 를 표준 출력(stdout) 에 프린트합니다.

hchrome --dump-dom https://naver.com


screen shot

--screenshot 옵션 뒤에 저장할 파일명을 주면 웹 사이트를 스트린샷으로 만들어서 저장합니다.

hchrome --screenshot https://www.chromestatus.com/


저장된 스크린샷 해상도를 수정할 경우 --window-size 옵션을 지정할 수 있습니다.

# Size of a standard letterhead.
hchrome --screenshot=c:/users/lesstif/scr-letter.png --window-size=1280,1696 https://www.chromestatus.com/
# Nexus 5x
hchrome --screenshot=c:/users/lesstif/scr-next.png --window-size=412,732 https://www.chromestatus.com/


REPL mode (read-eval-print loop)

run with --repl flag

$ chrome --headless --disable-gpu --repl --crash-dumps-dir=./tmp https://www.chromestatus.com/


Ref