새소식

크롤링

파이썬 크롤링(crawling) :: selenium 이용하여 카카오맵 동적 크롤링 하기 - 1

  • -

크롤링을 하려다 보면 페이지 url로 하는게 아니라

동적으로 처리되는 경우가 있습니다

 

예를들어 다음 지도의 경우 주소는 다 그대로인데 아래의 내용들만 바뀝니다!!

예를들어 강남 스타벅스라고 입려했지만

위의 주소는 그대로입니다!! 이런 경우 url로 크롤링을 할 수가 없어요 ㅠㅠㅠ

그래서 어떻게 장소 정보들을 크롤링 헤야하지... 하다가 말로만 듣던 selenium을 알게되었어요

selenium을 이용하면 동적 크롤링이 가능하답니다!!

 

Selenium(셀레니움) 파이썬 크롤링 방법

우선 브라우저는 크롬을 이용할 겁니다

그래서 크롬 드라이버가 필요합니다

https://chromedriver.chromium.org/downloads

 

Downloads - ChromeDriver - WebDriver for Chrome

WebDriver for Chrome

chromedriver.chromium.org

드라이버는 위에서 받으실 수 있습니다. 이떄 크롬의 버전을 확인하고 받으셔야 되요

 

버전은 크롬을 키고 오른쪽 상단의 버튼을 눌러서 설정-Chrome 정보를 누르면 확인할 수 있어요

현재 제 크롬 버전은 84버전이네요

앞에 84가 붙은 크롬 드라이버를 다운 받으면 됩니다

그렇게 되면 seleinum은 크롬 드라이버를 이용해서 크롬을 제어할 수 있어요!!

 

selenium 이란??

이를 이용하면 JS를 이용해 뒤늦게 만들어지는 데이터들을  모두 가져올 수 있어요

동적으로 변경된 데이터들은 HTML에 보여지지 않는데 Selenium을 이용하면

브라우저를 직접 작동시키고 제어하기 때문에 보여지는 데이터를 모두 가져올 수 있습니다.

 

Selenium 설치

pip install selenium

selenium을 pip를 이용해서 설치해줍니다

 

Selenium 사용 방법

import os
from selenium import webdriver

options = webdriver.ChromeOptions() # 크롬 브라우저 옵션
options.add_argument('headless') # 브라우저 안 띄우기
options.add_argument('lang=ko_KR') #  KR 언어
chromedriver_path = "chromedriver" # 크롬 드라이버 위치
driver = webdriver.Chrome(os.path.join(os.getcwd(), chromedriver_path), options=options)  # chromedriver 열기

############
### 로직 ###
############

driver.quit() # driver 종료, 브라우저 닫기

위와 같이 기초 코드를 작성합니다

위에서 선언한 driver로 브라우저를 작동하게 됩니다

처음엔 위에 옵션중 headless를 주석 처리하고 해보시는걸 추천드려요!!

어떻게 동작하는지 보게 좋으니까요

 

카카오 맵에 자동 검색하기(find_element_by_xpath)

이번에는 자동 검색을 한번 해볼게요!!

검색을 위해서 검색창 정보를 가져와야 합니다

우선 F12를 눌러 개발자 창을 켜주세요!

 

그러면 오른쪽에 창이 뜨는데 거기서 왼쪽 상단의 저 버튼을 눌러주세요!

노란색으로 칠한 버튼이요!!

그러면 왼쪽 창의 요소들을 선택할 수 있어요

 

위와 같이 검색창에 마우스를 대면 아래에 요소가 나오게 됩니다

클릭합니다

 

그러면 오른쪽에 그 요소가 나오게 됩니다

그 요소에서 마우스 오른쪽 버튼을 눌러주세요

 

그러면 위와 같이 나오는데 Copy-CopyXPath를 눌러주세요!!

 

//*[@id="search.keyword.query"]

그러면 위와 같은게 복사됩니다

이를 이용해서 검색어를 자동으로 입력해봅시다!

 

search_area = driver.find_element_by_xpath('//*[@id="search.keyword.query"]') # 검색 창
search_area.send_keys('강남 스타벅스')  # 검색어 입력
driver.find_element_by_xpath('//*[@id="search.keyword.submit"]').send_keys(Keys.ENTER)  # Enter로 검색

우선 첫 번째 줄에서 검색창을 가져옵니다.

그리고 두 번째 줄에서 검색어를 send_keys() 함수를 이용해 입력합니다.

그리고 세 번째 줄에서 검색 버튼을 xpath에 넣습니다. 검색 버튼도 위와 똑같이 xpath를 얻어내면 됩니다

그리고 이번에는 send_keys에 'Keyes.ENTER'를 입력합니다.

그러면 엔터가 입력되면서 버튼 클릭이 됩니다!!

다른 방법으로 했었는데 Keys.ENTER를 보내는게 어느 element든 잘 먹히더라구요

(이를 응용하면 다른 페이지로의 이동도 가능합니다 ex. 링크 타고 상세 페이지로 넘어가기)

 

BeautifulSoup로 정보 parsing 하기

이제 검색이 되어서 아래에 검색 결과들이 나오게 됩니다

여기서는 이제 원하는 정보를 얻어내기 위해서 HTML을 분석해야 합니다

간단하게 목록의 장소 이름들을 가져와 볼게요!! (이를 응용하시면 됩니다)

from bs4 import BeautifulSoup
html = driver.page_source
soup = BeautifulSoup(html, 'html.parser')
cafe_lists = soup.select('.placelist > .PlaceItem')

우선 driver의 page_source를 통해 html 코드를 얻어옵니다

그리고 규칙을 찾아내서 parsing 합니다

검색된 목록들 하나하나는 plcaelist class 밑에 PlaceItem class에 있습니다

 

 

그리고 이름은 head_item -> tit_name -> link_name class에 있네요

for cafe in cafe_lists:
	cafe_name = cafe.select('.head_item > .tit_name > .link_name')[0].text  # cafeName

위와 같이 코드를 작성하시면 검색된 목록 들의 이름을 가져올 수 있습니다

쉽죠??? HTML 분석은 몇 번 하다보면 익숙해집니다

beautifulsoup 문법만 조금 익히시면 되요!!

이렇게 selenium을 이용해서 크롤링 하는 방법을 알아봤습니다!!

 

다음 selenium 강좌에서는 탭 전환까지도 알아보겠습니다

Contents

포스팅 주소를 복사했습니다

이 글이 도움이 되었다면 공감 부탁드립니다.