훈훈훈

파이썬 :: 셀레니움(Selenium)을 이용하여 여행 상품 정보 크롤링 본문

파이썬/Python

파이썬 :: 셀레니움(Selenium)을 이용하여 여행 상품 정보 크롤링

훈훈훈 2020. 2. 27. 18:10

파이썬(python) 및 셀레니움을 사용하여 여행 상품 정보를 가져오는 크롤러를 만들어보았다.

크롤러 대상 사이트는 여행 상품을 판매하는 사이트인 마이리얼트립 사이트를 이용하였다.

 

시작하기에 앞서 크롤링에 대한 어느 정도 지식이 있다는 가정하에 설명을 하려고한다.

자세한 설명을 원한다면 아래 링크를 참고 해주길 바란다,

 

- API를 활용한 음원 순위 차트 크롤링

https://wave1994.tistory.com/59?category=872867

 

- 암호 화폐 정보 크롤러 만들기

https://wave1994.tistory.com/58?category=872867

 

 

# 사이트

- https://www.myrealtrip.com/

# 대상 항목

아래 상품에 있는 상품 이미지, 상품 소개 그리고 위도 경도에 대한 정보를 크롤링하였다.

https://www.myrealtrip.com/offers/30162

 

- 상품 상세 정보

 

# 전체 코드

from selenium import webdriver
from bs4 import BeautifulSoup

driver = webdriver.Chrome('/Users/wave/Desktop/chromedriver')
driver.get('https://www.myrealtrip.com/offers/30162')

html = driver.page_source
soup = BeautifulSoup(html, 'html.parser')

'''
팝업창 닫기
'''
x_button = driver.find_element_by_css_selector('body > div.ab-iam-root.v3.ab-animate-in.ab-animate-out.ab-effect-modal.ab-show > div.ab-in-app-message.ab-background.ab-modal-interactions.ab-modal.ab-centered > button > svg > path').click()

driver.implicitly_wait(10)

'''
위치(위도, 경도) 정보 크롤링
'''
location_click = driver.find_element_by_css_selector('div > div.resp-container > div > div > div.offer-container > div.offer-container__main > div.offer-container__meeting > div.offer-container__meeting__area > div > p.offer-container__meeting__show-map').click()

driver.implicitly_wait(10)

location = driver.find_element_by_css_selector('div > div.resp-container > div > div > div.offer-container > div.offer-container__main > div.offer-container__meeting > div.offer-container__meeting__area > div > a:nth-child(2) > img').get_attribute('src')

'''
이미지 크롤링
'''
img_click = driver.find_element_by_xpath('/html/body/main/div[3]/div/div[1]/div[2]/div/div/div[1]/div[1]/div[3]/div/div/div/ul/li[1]/div/div[2]').click()

driver.implicitly_wait(10)

'''
크롤링 데이터 가공 및 출력
'''
location_list = []
a = location.split(',')

b = a[0].split('=')
c = a[1].split('&')

latitude = b[1]
longitude = c[0]

for i in range(6,11):
    image1 = driver.find_element_by_xpath('/html/body/div[17]/div/div/div[2]/div/div[1]/div/div[{}]/img'.format(i))
    print(image1.get_attribute('src'))

    driver.implicitly_wait(10)

print(f"latitude : {latitude}, longitude : {longitude}")

driver.quit()

 

* 코드 설명

먼저 웹드라이버로 페이지 접근 시 위와 같은 팝업 창이 출력되는 것을 알 수 있다 ..... (우한 폐렴 덕분에 ...)

따라서 원할한 크롤링을 위해 위 팝업 창을 닫아줘야 하기 떄문에 해당 팝업창의 X표시에 대한 css_selector를 선택하여 종료시켰다.

x_button = driver.find_element_by_css_selector('body > div.ab-iam-root.v3.ab-animate-in.ab-animate-out.ab-effect-modal.ab-show > div.ab-in-app-message.ab-background.ab-modal-interactions.ab-modal.ab-centered > button > svg > path').click()

 

팝업창을 정상적으로 종료시켰다면 위도 경도 정보를 크롤링 하기 위해서 아래와 구글 이미지에 대한 URL을 가져왔다.

(구글 맵 이미지 링크에 위도 경도 정보가 포함되어 있음)

 

구글 맵 이미지를 보기 위해서는 아래와 같이 지도 보기를 클릭해야되기 때문에 해당 링크에 대한 css_selector를 선택 후 링크를 크롤링 하였다.



location_click = driver.find_element_by_css_selector('div > div.resp-container > div > div > div.offer-container > div.offer-container__main > div.offer-container__meeting > div.offer-container__meeting__area > div > p.offer-container__meeting__show-map').click()

driver.implicitly_wait(10)

location = driver.find_element_by_css_selector('div > div.resp-container > div > div > div.offer-container > div.offer-container__main > div.offer-container__meeting > div.offer-container__meeting__area > div > a:nth-child(2) > img').get_attribute('src')

 

마지막으로 이미지를 크롤링 해기 위해서는 아래 사진과 같이 이미지를 클릭 후 출력되는 화면에서 정보를 가져와야하기 때문에 

해당 이미지를 클릭 후 사진 정보를 가져왔다.

 

이미지를 가져올때 css_selector를 사용해 보았지만 정상적으로 크롤링이 되지 않아 xpath를 사용하여 이미지를 가져왔다.

img_click = driver.find_element_by_xpath('/html/body/main/div[3]/div/div[1]/div[2]/div/div/div[1]/div[1]/div[3]/div/div/div/ul/li[1]/div/div[2]').click()

driver.implicitly_wait(10)

for i in range(6,11):
    image1 = driver.find_element_by_xpath('/html/body/div[17]/div/div/div[2]/div/div[1]/div/div[{}]/img'.format(i))
    print(image1.get_attribute('src'))

    driver.implicitly_wait(10)

 

# 실행 결과

(scrap) Waveui-MacBookPro:myrealtrip wave$ python product_img.py clear
https://d2ur7st6jjikze.cloudfront.net/offer_photos/30162/193686_large_1525762845.jpg?1525762845
https://d2ur7st6jjikze.cloudfront.net/offer_photos/30162/193689_large_1525762779.jpg?1525762779
https://d2ur7st6jjikze.cloudfront.net/offer_photos/30162/193690_large_1525762847.jpg?1525762847
https://d2ur7st6jjikze.cloudfront.net/offer_photos/30162/193688_large_1525762776.jpg?1525762776
https://d2ur7st6jjikze.cloudfront.net/offer_photos/30162/193691_large_1525762892.jpg?1525762892
latitude : 41.392529, longitude : 2.16502119999996

Comments