카테고리 없음

크롤링_3

bb1714 2024. 10. 15. 01:32

저번 수업 내용에 이어서 진행하겠습니다!

 

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")

 

 

위 자료는 스마트인재개발원 수업내용을 정리한 내용입니다.