정글 입성 후 바로 시작 된 과제를 하며 얻은 정보
- 한글 깨짐 문제 해결 방법 (Requests encoding)
- 동적 웹페이지 크롤링 방법
첫 과제에서 나는 백엔드를 담당했다.
2020 도쿄 올림픽 경기 일정에 대한 정보를 크롤링 후 DB에 데이터를 저장하는게 큰 목표였고,
사실 금방 끝날 줄 알았다. (아름다운 수프가 다 해줄 것이라 생각해서)
각 종목별 담긴 데이터의 공통된 태그를 찾았고 "BeautifulSoup으로 마무리 치면 끝이구나" 라고 생각하며 설레발을 쳤는데, 역시 설레발은 필패였다.
일단 터미널 창을 봤을 때, 깨진 글자들이 보였고 그게 문제인가 싶어서 깨진 한글을 살리는 작업을 진행했다.
예전에 나홀로 링크 메모장을 공부했을 당시 네이버 Map 사이트를 저장했었는데 메타 데이터 한글이 다 깨져서 등록되었던 것이 생각났다.
그 때 기억을 되살려 바로 Requests의 encoding 값을 'utf-8'로 설정해주었다.
req = requests.get('원하는 url')
req.encoding = 'utf-8'
한글은 잘 살아났지만 문제는 따로 있었다.
애당초 내가 원하는 태그에 내용이 없었다. (print 찍어보니 [])
구글링을 통해 찾아보니 정적 웹페이지는 BeautifulSoup으로 크롤링이 가능했지만
동적 웹페이지인 경우에는 다른 방법을 써야 된다고 나와있었다.
- 참고
정적 웹페이지와 동적 웹페이지의 내용은 하기 링크에서 확인해보자!
https://blog.naver.com/insaweb/221650456057
결국 BeautiifulSoup을 대체할 친구 Selenium을 찾았고, 언능 적용해서 결과를 보고싶었다.
- 참고
Selenium 내용은 하기 링크에서 확인해보자!
https://beomi.github.io/2017/02/27/HowToMakeWebCrawler-With-Selenium/
Selenium을 사용하기 위해서는 WebDriver가 필요하여 ChromeDriver를 설치해주었다.
(반드시 Chrome Version과 일치하는 Version의 ChromeDriver를 설치해준다!)
또 유의할 점은 Selenium 실행 후 기다려주어야(wait) 한다.
- 참고
Selenium wait 개념에 대해서 박살 내주신다는 분의 링크를 확인해보자!
https://pythondocs.net/selenium/%EC%85%80%EB%A0%88%EB%8B%88%EC%9B%80-wait-%EA%B0%9C%EB%85%90-%EC%9D%B4%ED%95%B4%ED%95%98%EA%B8%B0-implicitly-wait-vs-explicitly-wait/
하기에 Selenium 관련하여 사용한 주요 Code를 넣어보았다.
- Import
from selenium import webdriver- 옵션 생성
options = webdriver.ChromeOptions()- 창 숨기는 옵션 추가
options.add_argument("headless")- WebDriver 경로 설정
driver = webdriver.Chrome('D:\Project\chromedriver_win32\chromedriver', options=options)- 받아올 Url 설정
driver.get('원하는 url')- 원활하게 웹페이지 정보를 받아오기 위한 Wait
driver.implicitly_wait(2) # 2초 대기- Div Class Name으로 데이터 가져오기
divs = driver.find_elements_by_class_name("Class Name")- 가져온 데이터 HTML형식으로 가져오기
divHtml = divs[index].get_attribute('innerHTML')
이런 식으로 동적 웹페이지의 원하는 HTML을 가져온 뒤 BeautiifulSoup을 이용해 마무리를 지었다.
(뷰태식이 돌아왔구나..)
처음에는 막막했었는데 막상 해결하고나니 속이 시원했고 재밌는 경험이었다.
그리고 역시 구글링이 최고다. (구글형 고마워 ^~^)
솔로몬님의 지혜가 저를 이끌고 있습니다.