Crawling #3 : Selenium Browser


In [1]:
# 기존의 정적인 페이지 ( HTML, CSS 에 모든 정보가 로딩 초기에 Rendering 되서 내려오는 페이지 )나
# AJAX 기반의 동적인 페이지 중에서 API를 직접 까볼 수 있는 페이지 들은
# 기존처럼 requests, beautifulsoup4, json 등을 이용해서 크롤링하실 수 있습니다.

# 다만, 
# AJAX를 이용한 것 같기는 한데, 대체 어디서 정보를 가져오는지 모르겠는 페이지나
# 네이버 카페 등과 같이 Frame 을 이용해서 사이트를 렌더링하는 경우에는
# 이렇게 Selenium으로 직접 브라우져를 띄우고 크롤링을 하실 수 있습니다.

In [2]:
import pandas as pd

from selenium import webdriver

In [3]:
room_df = pd.DataFrame(columns=[
    "연락처",
])

In [4]:
driver = webdriver.Firefox()

In [5]:
driver.get("""http://www.dabangapp.com/search#/search?type=subway&id=446&filters={"deposit-range":[0,999999],"price-range":[0,999999],"room-type":[0,1,2,3,4,5],"location":[[127.00468076340508,37.50362345510044],[127.03536523453545,37.52894892024945]]}&position={"center":[127.02002299897026,37.51628726200644],"zoom":15}""")
driver.implicitly_wait(10)

In [6]:
# 세부 페이지를 크롤링할 새로운 브라우저를 키자.
new_driver = webdriver.Firefox()

room_elements = driver.find_elements_by_css_selector('ul.items li.item')


# 여기서는 샘플로 5개만 데이터를 가져오겠습니다.
for room_element in room_elements[:5]:
    room_detail_page_url = room_element.find_element_by_css_selector('a').get_attribute('href')

    new_driver.get(room_detail_page_url)
    new_driver.implicitly_wait(10)

    new_driver.find_element_by_css_selector('div.contact-view-button-wrap button').click()
    phonenumber = new_driver.find_element_by_css_selector('div.agent-profile-wrap span.number').text

    room_df.loc[len(room_df)] = [phonenumber]
    

# 웹 브라우저는 메모리를 많이 잡아먹으니,
# 꼭 종료를 합시다!
driver.quit()
new_driver.quit()

In [7]:
room_df.to_csv("dabang_room.csv", index=False)