Stage3 - 페이지 변경하며 데이터 수집하기

두번째 스테이지에서 완성한 데이터수집기에서는 첫페이지의 10개 가게정보만 수집할 수 있습니다. 이번 스테이지에서는 selenium을 활용하여 페이지를 넘겨가면 데이터를 수집해봅니다.

페이지 변경하며 데이터 수집하기

정적페이지의 페이지 이동과 동적페이지의 페이지 이동

네이버 뉴스 데이터 수집에서는 여러 페이지에서 데이터를 수집하기 위해 URL 요청값을 사용했습니다. 하지만 네이버 지도와 같은 동적페이지에서는 URL이 변하지 않기 때문에 요청값 규칙을 이용할 수 없습니다.

검색결과 하단에 페이지 버튼이 있습니다.

그렇기 때문에 직접 검색결과 아래에 있는 페이지 버튼을 클릭하며 데이터를 수집해줘야만 합니다.

검사창에서 페이지버튼을 표현하고 있는 부분을 찾아보면 <div class="paginate loaded">...</div>에 페이지버튼이 저장되어 있는 것을 알 수 있습니다. 페이지를 넘겨가며 연속적으로(2, 3, 4, 5, ...) 클릭해주려면 페이지 버튼의 룰을 찾아야하는데 페이지 버튼의 코드는 <a><strong>이 섞여 있기 때문에 쉽게 룰을 찾을 수 없습니다.

모든 태그를 선택할 수 있는 선택자

div.paginate > *

이번에는 새로운 선택자를 통해 모든 페이지 버튼을 선택해보겠습니다. 검사창에 위와 같은 선택자로 데이터를 검색하면 페이지바(페이지 버튼을 포함하고 있는 부분)의 모든 버튼이 선택되는 것을 알 수 있습니다.

seleniumfind_elements_by_css_selector()함수를 사용하면 모든 버튼을 리스트 형태로 저장할 수 있습니다.

page_bar = driver.find_elements_by_css_selector('div.paginate > *')

2페이지로 이동하기

page_bar에 저장된 페이지 버튼을 통해 첫 페이지 수집 후 다음 페이지로 전환할 수 있습니다. 아래와 같이 코드를 추가한 후 실행해봅니다.

week6_2.py
... 생략
time.sleep(1)
# 컨테이너(가게 정보) 수
stores = driver.find_elements_by_css_selector("div.lsnx")
for store in stores:
# 세부 데이터 수집
name = store.find_element_by_css_selector("dt > a").text
addr = store.find_element_by_css_selector("dd.addr").text
phone = store.find_element_by_css_selector("dd.tel").text
print(name, addr, phone)
page_bar = driver.find_elements_by_css_selector("div.paginate > *")
page_bar[2].click()

크롬창을 살펴보면 1페이지의 데이터를 수집한 후 2페이지로 이동한 것을 확인할 수 있습니다. page_bar[2]는 2번 페이지 버튼을 가리킵니다.

5페이지까지 반복하기

1반복문을 활용하면 2, 3, 4, 5 페이지 버튼을 누르는 것을 반복하며 데이터를 수집할 수 있습니다. 아래와 같이 page_bar의 인덱싱을 변경하며 데이터 수집을 반복합니다.

week6_2.py
... 생략
##################################################
# 반복문 for를 추가해줍니다.
# 여기서 임시변수 n은 현재 페이지를 의미합니다.
for n in range(1, 5):
##################################################
time.sleep(1)
# 컨테이너(가게 정보) 수
stores = driver.find_elements_by_css_selector("div.lsnx")
for store in stores:
# 세부 데이터 수집
name = store.find_element_by_css_selector("dt > a").text
addr = store.find_element_by_css_selector("dd.addr").text
phone = store.find_element_by_css_selector("dd.tel").text
print(name, addr, phone)
page_bar = driver.find_elements_by_css_selector("div.paginate > *")
##################################################
# page_bar의 인덱싱 부분을 다음페이지(n+1)로 바꿔줍니다.
page_bar[n+1].click()
##################################################

이 때 "현재 페이지의 데이터를 수집한 후, 다음 페이지 버튼을 클릭한다"라는 것을 염두에 둡니다. (위 코드에서 5까지 반복하면 5 페이지 버튼을 클릭한 후 종료되므로 4페이지 데이터까지 수집됩니다.)