저번 수업 내용에 이어서 진행하겠습니다!
Selenium으로 데이터를 수집할 때 지켜야 하는 프로세스
1) 사이트 요청
2) 데이터 로딩 작업 -> 더보기, 스크롤을 통해서 데이터 로딩
3) 데이터를 수집 (요소)
4) 데이터 가공 (텍스트, 속성)
5) 데이터 활용 (DB,)
위 프로세스를 참고해서 기능과 사용법 주의사항 등을 알아보겠습니다~!
Selenium 라이브러리
# 브라우저를 담당하는 라이브러리
from selenium import webdriver as wb
# (신버전) 선택자를 구분해주는 라이브러리
from selenium.webdriver.common.by import By
# 컴퓨터용 키보드 라이브러리 -> 엔터, del 기능 호출
from selenium.webdriver.common.keys import Keys
1. 브라우저 실행
driver = wb.Chrome()
2. 특정 사이트 요청
driver.get("http://www.naver.com")
3. 검색창에 "강아지" 검색
- 해석 : driver에게 요소를 찾아와~
- 찾아올 것이 한 개면 element / 복수면 elements
search = driver.find_element(By.CSS_SELECTOR,"#query")
# (구버전) 실행안됨 -> 검색해서 보인다면 신버전으로 바꿔서 실핼해야 함
# driver.find_element-by_css_selector("#query")
4. 검색창에 검색어 입력
- 해석 : 검색창에 강아지라는 데이터 보내줘
search.send_keys("강아지")
5. 키보드의 엔터기능 전송
- 키 값은 다 대문자
search.send_keys(Keys.ENTER)
6. 화면의 맨 밑으로 스크롤 이동
- 해석 : 키보드의 END값을 보내주기
- 스크롤 방법 1) JS를 활용 2) 키보드 활용
body = driver.find_element(By.CSS_SELECTOR,"body")
body.send_keys(Keys.END)
7. 화면 뒤로가기
- 뒤로 가기는 HTML태그가 아니다. 브라우저가 가지고 있는 기능이다.
driver.back()
8. 검색창에 고양이 검색
- 컴퓨터는 화면이 바뀌면 기존의 기억을 다 잊어버린다.
- 화면이 다른 페이지로 전환 후에는 반드시 기존태그를 다시 찾아와야 한다.
search = driver.find_element(By.CSS_SELECTOR,"#query")
search.send_keys("고양이")
9. 특정 태그를 클릭
btn = driver.find_element(By.CSS_SELECTOR,"#sform > fieldset > button")
btn.click()
10. 데이터 수집
- 복수개의 데이터가 필요한 경우에는 elements
- 주의점 : 리턴타입은 무조건 리스트 타입으로 변환
title = driver.find_elements(By.CSS_SELECTOR, "div.news_wrap.api_ani_send > div > div.news_contents > a.news_tit")
title[0].text
11. 수집한 요소에서 컨텐츠 추출
title_list = []
for i in title :
title_list.append(i.text)
title_list
12. 브라우저 종료
# 12. 브라우저 종료
driver.close()
# 또는
driver.quit()
위 실습을 통해 중요한 점!
1) selenium에서 요소를 찾을 때는 find_element(s)로 검색한다.
- element로 복수개를 가지고 온 경우에는 인덱스 0번째 데이터만 반환
- elements로 요청한 경우에는 무조건 리스트 타입이 반환
2) key의 기능(enter, del, end)을 활용할 때는 특정 태그에게 send_keys(keys. 기능(대문자))
3) 뒤로 가기, 종료 → HTML태그가 아니기 때문에 바로 명령을 실행한다
4) 데이터 수집 후 → 반드시 사람이 쓰는 텍스트 데이터로 변환
- 이번에는 한솥도시락 사이클 이용해서 실습을 진행하겠습니다!!
0. 우선 사용할 라이브러리들을 불러오기
from selenium import webdriver as wb
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys
1. 사이트 실행
driver = wb.Chrome()
driver.get("https://www.hsd.co.kr/menu/menu_list")
2. 메뉴이름 수집
title = driver.find_elements(By.CSS_SELECTOR, "div > div.item-text > h4")
3. 가격 수정
price = driver.find_elements(By.CSS_SELECTOR, "div > div.item-text > div > strong")
price[0].text
4. 데이터 검증하기
len(title)
→ 여기까지면 한 페이지에 있는 메뉴밖에 나오지가 않음
5. 더 많은 결과를 보기 위해서 더 보기 클릭
btn = driver.find_element(By.CSS_SELECTOR, "#btn_more > span > a")
btn.click()
6. 시간 부여해 주기 (코드를 반복해서 빠르게 실행할 때는 반드시 필요!)
import time
7. 예외처리
→ 영역이 2가지 구분
1) 오류가 나기 전까지 시도할 코드
2) 오류가 났을 때 동작할 코드
- try = 시도할 코드 작성
- except = 오류가 났을 때 코드
* 데이터를 수집할 때 고려해야 할 점
- 데이터를 수집하다가 없는 경우가 발생하면 넘어가지 말고 없다의 의미를 넣어주자
- null, 0, "없다", "none"
try :
# 시도할 코드
for i in range(10) :
btn = driver.find_element(By.CSS_SELECTOR, "#btn_more > span > a")
btn.click()
time.sleep(1)
except :
# 에러났을 때 코드
print("더보기를 완료했습니다.")
8. 데이터 검증하기
len(title)
len(price)
title[0].text
price[0].text
9. 텍스트만 추출한 리스트 제작
title_list = []
for i in title :
title_list.append(i.text)
print(title_list)
price_list = []
for j in price :
price_list.append(j.text)
10. 데이터 프레임 제작
- 컬럼과 데이터구조의 형태가 필요하다. → dic
dic = {"메뉴이름": title_list, "가격정보":price_list}
han = pd.DataFrame(dic)
han.to_html("한솥메뉴.html")
han
11. csv파일로 저장 → 인코딩 작업 필수!!
han.to_csv("한솥메뉴.csv", encoding = "utf-8")
위 자료는 스마트인재개발원 수업내용을 정리한 내용입니다.