[Selenium] 웹 스크래핑: mixed content 경고 해결하기

Loopy·2022년 3월 19일
0

삽질기록

목록 보기
7/28
post-thumbnail
post-custom-banner

👉인터파크에서 자신이 예매한 공연 내역 데이터를 크롤링해오는 과정속에서 발생한 에러이다.

☁️ 에러 내용

크롬 브라우저를 띄워놓은 상태에서 데이터를 가져오는데까지는 성공했다. 하지만, 이후에 유닉스 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 경고가 뜨고 있는 것을 볼 수 있다.

☁️ 원인

이 에러메시지는 사용자가 하나의 웹 페이지안에 포함된 여러 컨텐츠중 httpshttp를 섞어서 요청하여 가져오는 경우에 발생한다 한다.

왜냐하면, 바로 https 가 가진 보안적 속성때문이다. https 는 자신의 프로토콜을 통해 <브라우저-서버> 간의 암호화된 채널을 만든 후, 그 채널을 거친 안전한 컨텐츠들만을 사용자에게 보여주려고 하기 때문이다.

따라서 그 페이지에 암호화된 채널이 아닌 http 로 컨텐츠를 가져오게 될 경우 안전하지 않는 페이지가 되버려 컨텐츠들의 안전을 보장할 수 없다는 경고 메시지를 띄우게 된다.

☁️ 해결 방안

1. 방법 1

chrome_options.add_argument("--allow-running-insecure-content")

하지만 이 방법으로는 여전히 경고 메시지들이 떴다.

2. 방법 2

다음의 옵션을 추가하여, 경고 메시지들을 안보이게 하는데 성공하였다.

chrome_options.add_argument("--log-level=3")

하지만 처음에는 mixed content가 단순 에러라고 생각하였는데, 자세히 보니 에러가 아닌 '경고' 일뿐이고 진정한 에러의 원인은 아래의 로그인 과정에서 발생했던 것을 발견하였다.

pyautogui 는 화면의 좌표를 통해 접근하여 동작하게 되는데, headless chrome 으로 돌려놓았으니 창이 보이지 않아 로그인이 되지 않는 에러를 뿜고 있었던 것이다.

3. 로그인 문제 해결

pyperclippyautogui 사용했던 이유는, 네이버와 같은 경우 send_keys를 이용하면 너무 속도가 빨라 기계라고 인식해 자동완성방지 문자를 입력하는 창이 뜨게 되었기 때문이다.

인터파크는 다행히 send_keys()를 사용해서 입력해도 문제가 발생하지 않았다.

login = driver.find_element(By.ID, "userId").send_keys("yejin0011")
pw = driver.find_element(By.ID, "userPwd").send_keys("qwer133!")

창 안띄우고 데이터 가져오기 성공하였다! ㅠㅠ

참고
https://caileb.tistory.com/167

profile
개인용으로 공부하는 공간입니다. 잘못된 부분은 피드백 부탁드립니다!
post-custom-banner

0개의 댓글