Selenium에 대해서 알아보자!

AI Scientist를 목표로!·2022년 8월 3일
0

Selenium

목록 보기
1/1

Selenium 사용하는 이유

장점

  1. 자바스크립트가 동적으로 만든 데이터를 크롤링하기 위해
  • requests도 많이 사용하지만 동적요소에는 어렵기 때문에 대신 Selenium을 사용
  1. 반복적으로 사용하고 있는 웹상의 업무 자동화 가능 및 메일 보내기 좋아요 누르기 등 각종 업무 자동화 가능
  2. 브라우저를 직접 켜서 확인하면서 크롤링이 가능

단점

  1. 브라우저를 켜서 움직임으로 컴퓨터에 따라 속도 차이가 크다
  2. 자원을 많이 잡아먹는다

Selenium으로 크롤링하기

요기요 리뷰를 크롤링한다는 가정하에 작성하겠다.

  • 맥의 경우아래 코드를 쳐줘야 크롬브라우저가 맥에서 열린다.
cd ./Users/.../chromedriver다운경로 
!xattr -d com.apple.quarantine chromedriver # 맥에서 크롬 브라우저 허용하는 코드 
  • 필요 라이브러리 불러오기
from selenium import webdriver
import time
from selenium.webdriver.common.keys import Keys # enter 치는 명령어
import csv 
import pandas as pd 
  • 브라우저 생성
browser = webdriver.Chrome('chromedriver 저장 경로')
  • 웹 사이트 열기
browser.get('https://www.yogiyo.co.kr/mobile/#/')
  • 검색창 클릭
search = browser.find_element_by_xpath('//*[@id="search"]/div/form/input')
search.click()
  • 검색어 입력
search.send_keys('검색 지역')
search.send_keys(Keys.ENTER) # 검색 후 클릭
time.sleep(15) # 로딩 시간을 위한 대기 
  • 스크롤 하기
# 스크롤 전 높이
before_h = browser.execute_script("return window.scrollY") # 현재 스크롤 된 높이를 계산

# 무한 반복문 사용
while True:
    # 맨 아래로 스크롤을 내린다.
    browser.find_element_by_css_selector("body").send_keys(Keys.END) # end키를 통해 스크롤을 맨 아래로 내림 

    # 스크롤 사이 페이지 로딩 시간 추가
    time.sleep(3)

    # 스크롤 후 높이 확인 
    after_h = browser.execute_script("return window.scrollY")

    # before_h = after_h # after의 높이를 before로 갱신

    if after_h > 10000: # 스크롤 높이보다 높으면 멈춤 
        break
  • 저장할 파일 생성
# 파일 생성 
f = open(r"/Users/파일 저장 경로/파일명.csv", 'w', encoding="UTF-8", newline="") # 파일 입출력 기능 

csvWirter = csv.writer(f) # wirter에 파일(f) 넘겨주기
f.close()
  • 크롤링 함수 생성

웹 페이지에 따라 css코드가 중복으로 나오는 경우가 있다.
그럴때에는 xpath를 활용하면 된다.

def reveiw_crawling_first_scroll():
    while True:
        try:          
            browser.find_element_by_css_selector("body").send_keys(Keys.END) # end키를 통해 스크롤을 맨 아래로 내림 
            time.sleep(1)

            # 더보기 클릭
            more_click = browser.find_element_by_css_selector('li.list-group-item.btn-more')
            isExistNextPage = more_click.is_enabled() # 더보기 클릭 가능하다면
            if (isExistNextPage == True):
                more_click.click()
                time.sleep(3)  
            else :  # 없다면 끝 
                break
        except:
            break

    count = browser.find_element_by_xpath('//*[@id="content"]/div[2]/div[1]/div[5]/div[2]/div/strong[1]').text
    if int(count) >= 2: # 리뷰 개수가 2개 이하면 크롤링X
        for i in range(2, int(count)+1):
            
            # 가게 이름
            title = browser.find_element_by_css_selector('span.restaurant-name.ng-binding').text

            items = browser.find_element_by_xpath(f'//*[@id="review"]/li[{i}]')
            review = items.find_element_by_css_selector("p.ng-binding").text

            print(title,'|',review,)
            csvWirter.writerow([title, review, ]) # 행 추가

우클릭 -> 검사 버튼을 누른 후 원하는 css 및 xpath를 추가하면 된다.

profile
딥러닝 지식의 백지에서 깜지까지

0개의 댓글