본문 바로가기

Data Handling/Data Collecting

selenium - 부킹닷컴 객실 가격 크롤링

selenium을 사용하기 이전, beautifulsoup으로 먼저 시도해보았습니다.

하지만 이상하게도 가격 정보에 관해서만 계속 빈리스트로 반환 되었습니다.

 

아무리 공부하고 고민해도 해결이 되지 않아 크롤링 전문가를 찾아 자문을 구하고자 구글링을 했습니다.

정말 감사하게도 한 분이 답장을 주셨고, 실제 오프라인으로 만나 도움을 주셨습니다.

-- '코딩 좀 알려주라(이하 코알라)'의 이** 매니저님 감사합니다 --

 

그 이유를 보자면 가격 정보는 수정이 많고(부킹닷컴 자체 할인/ 특가 등), 어떤 이유에서인지 다른 공간에서 따로 관리하고 있는것 같다고 합니다. 그래서 html을 불러오는 과정에서 가격 정보는 빠지는 것이라고 하는데요, 이럴 때의 솔루션으로 selenium을 알려주셨습니다.

 

selenium은 눈에 보이는 정보를 모두 크롤링 할 수 있다고 하는데, beautifulsoup이 브라우저의 소스에 접근하는 반면, selenium은 우리가 마우스로 클릭해서 홈페이지에 접근하는 것과 같은 방식이기 때문이라고 합니다.

실제로 selenium을 실행시키면 컴퓨터 스스로 홈페이지에 접속하는 현상을 보실 수 있습니다.

한번 시작해 볼까요?

 

 


순서

  1. chrome webdriver 준비
  2. url 준비
  3. webdriver를 이용해 url에 접근
  4. 원하는 정보 지정해서 담기
  5. 문자열만 추출

0. 라이브러리

from selenium import webdriver

 

1. chrome webdriver 다운로드

크롬 버전과 웹드라이버 버전이 같아야 합니다.

https://chromedriver.chromium.org/downloads

 

2. url 준비

원하는 정보가 있는 페이지의 url 을 준비해주세요.

url = '찾고자 하는 정보가 포함된 페이지 url'

 

3. webdriver를 이용해 url에 접근

driver = webdriver.Chrome("드라이버 설치 경로/chromedriver.exe") # webdriver 실행(크롬 창 생성)
driver.get(url) # url로 접속

 

4. 원하는 정보 지정해서 담기

클래스 및 id 값 확인 방법은 'beautifulsoup 포스팅' 참고

# 특정 클래스 혹은 id가 포함된 값들 중 하나만 가져온다 : find_element_by_css_selector
# 특정 클래스 혹은 id가 포함된 값들 모두 가져온다 : find_element_by_css_selector
# 클래스 표시 : . / id 표시 : #
# 예) h2.hp__hotel-name 해석 : h2 태그의 'hp__hotel-name' 클래스

name = driver.find_element_by_css_selector("h2.hp__hotel-name").text
price_b = driver.find_elements_by_css_selector("div.bui-price-display__value")

 

5. 문자열만 추출

price = []
for i in range(len(price_b)):
    price.append(price_b[i].text)
    
print(name)
print(price)

 


 

주의

호텔마다 객실 유형별로 예약이 가능한 것과 불가능한 것이 섞여있는 경우가 있습니다.

그렇게 되면 객실 유형의 수와 가격 정보의 수가 일치하지 않아 오류가 생기게 되는데, 

따라서 container 개념을 잘 활용해야 합니다.

  

예를 들어 A호텔에서 해당 날짜에 2인실, 4인실, 6인실 객실에 대한 정보를 크롤링한다면,

2인실에 대한 container, 4인실에 대한 container, 6인실에 대한 container를 따로 만들어서,

container 하나씩 인원수, 가격정보 등을 파악해야 한다는 말입니다.

 

이걸 하지 않는다면 2인실 객실 가격에 4인실 객실 가격을 넣게 되는등 오류가 발생하기 쉽습니다.

 


 

결과

- 크롤링 결과를 csv파일로 저장한 화면입니다.

 

 

- 7개의 게스트하우스 주중 2인실/ 4인실 한달 평균 가격비교 입니다.

 


끝으로

크롤링을 공부하면서 법적인 이슈가 있다는 것을 알게됐습니다.

아고다에서 부킹닷컴의 모든 호텔 가격을 크롤링하고, 부킹닷컴보다 항상 저렴하게 판매하는 프로그램을 만든다면 부킹닷컴 측에서는 참 골치아픈 일이겠죠.

또한 매일 아고다에서 수백만개의 데이터를 가져간다면 부킹닷컴 사이트 트래픽이 증가하면서 서버가 터지거나 불필요한 자원이 낭비될 수 있습니다.

 

따라서 크롤링을 할 때에 몇가지 주의할 것이 있습니다.

  • 상업적인 목적으로 하지 않을 것
  • 사이트에 무리가 갈 정도로 많은 양을 하지 않을 것
  • 도메인 주소/robots.txt 를 확인하면 크롤링 가능 여부를 파악할 수 있음

더불어 제가 알지 못하는 불법적인 요소가 있을 수 있기 때문에 이번 포스팅의 전체 코드는 공유하지 않겠습니다.

궁금한 점이 있다면 쪽지나 댓글을 달아주시면 답변드리겠습니다.