👉인터파크에서 자신이 예매한 공연 내역 데이터를 크롤링해오는 과정속에서 발생한 에러이다.
크롬 브라우저를 띄워놓은 상태에서 데이터를 가져오는데까지는 성공했다. 하지만, 이후에 유닉스 crontab
를 사용해서 백그라운드에서 주기적으로 프로그램을 돌려줘야 하기 때문에 브라우저를 안띄우고 작업할 수 있도록 해야했다.
브라우저를 띄우지 않는것을 Headless Chrome이라 하는데, 옵션 몇개만 추가해주면 쉽게 사용 가능하다.
#브라우저 띄우지 말기
chrome_options = Options()
chrome_options.add_experimental_option("detach", True)
chrome_options.headless = True
chrome_options.add_argument("window-size=1920x1080")
하지만, 다음과 같은 경고가 났다. 분명 브라우저를 띄워놓고 작업했을때는 전혀 보이지 않던 문제였다.
"Mixed Content: The page at'https://ticket.interpark.com/Gate/TPLogin.asp?CPage=B&MN=Y&tid1=main_gnb&tid2=right_top&tid3=login&tid4=login'
was loaded over HTTPS, but requested an insecure element
'http://ticketimage.interpark.com/TicketImage/2015/20150429_main/img/header/blank.png'.
경고 문구를 자세히 보니, https 사이트에서 http 사이트나 자원을 요청하면 발생하는 보안 문제인것 같은데 자세한건 구글링을 통해 찾아보았다. 참고로 위의 링크를 클릭해보면 크롬에서는 정식으로 둘의 호환을 막았다고 나와있다.
인터파크 로그인 사이트에서 F12 => Console
을 통해 확인해보니 Mixed Content 경고가 뜨고 있는 것을 볼 수 있다.
이 에러메시지는 사용자가 하나의 웹 페이지안에 포함된 여러 컨텐츠중 https
와 http
를 섞어서 요청하여 가져오는 경우에 발생한다 한다.
왜냐하면, 바로 https
가 가진 보안적 속성때문이다. https
는 자신의 프로토콜을 통해 <브라우저-서버> 간의 암호화된 채널을 만든 후, 그 채널을 거친 안전한 컨텐츠들만을 사용자에게 보여주려고 하기 때문이다.
따라서 그 페이지에 암호화된 채널이 아닌 http
로 컨텐츠를 가져오게 될 경우 안전하지 않는 페이지가 되버려 컨텐츠들의 안전을 보장할 수 없다는 경고 메시지를 띄우게 된다.
chrome_options.add_argument("--allow-running-insecure-content")
하지만 이 방법으로는 여전히 경고 메시지들이 떴다.
다음의 옵션을 추가하여, 경고 메시지들을 안보이게 하는데 성공하였다.
chrome_options.add_argument("--log-level=3")
하지만 처음에는 mixed content가 단순 에러라고 생각하였는데, 자세히 보니 에러가 아닌 '경고' 일뿐이고 진정한 에러의 원인은 아래의 로그인 과정에서 발생했던 것을 발견하였다.
pyautogui
는 화면의 좌표를 통해 접근하여 동작하게 되는데, headless chrome
으로 돌려놓았으니 창이 보이지 않아 로그인이 되지 않는 에러를 뿜고 있었던 것이다.
pyperclip
과 pyautogui
사용했던 이유는, 네이버와 같은 경우 send_keys
를 이용하면 너무 속도가 빨라 기계라고 인식해 자동완성방지 문자를 입력하는 창이 뜨게 되었기 때문이다.
인터파크는 다행히 send_keys()
를 사용해서 입력해도 문제가 발생하지 않았다.
login = driver.find_element(By.ID, "userId").send_keys("yejin0011")
pw = driver.find_element(By.ID, "userPwd").send_keys("qwer133!")
창 안띄우고 데이터 가져오기 성공하였다! ㅠㅠ