버전은 크롬을 키고 오른쪽 상단의 버튼을 눌러서 설정-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