selenium을 활용한 웹 스크래핑

1 분 소요

업데이트:

selenium을 활용한 웹 스크래핑 함수 일부 정리

이번 프로젝트 진행 과정에서 더미데이터를 위해 이미지를 모아야하는 부분이 있다
selenium에서 쓰는 함수들은 언어마다 약간씩 다른이름을 가지고 있다
(자바는 카멜케이스, 파이썬은 스네이크케이스)
selenium을 이용해 이미지를 저장하는 과정에서 사용한 함수들에 대해 정리해보고, 유사한 함수들에 대해 정리를 해보려한다

Selenium 준비하기

환경

python 3.6.8
selenium 3.141.0

Selenium(셀레늄) ?

Selenium은 웹 브라우저의 자동화를 가능하게하고 지원하는 다양한 도구 및 라이브러리를위한 포괄적인 프로젝트.
즉, 많은 브라우저에서 호환 가능하게 실행될 수 있는 명령어 세트를 작성하는 인터페이스.

셀레늄 리소스는 웹드라이버, IDE, Grid가 있는데 나는 웹드라이버를 사용할 예정.

필요 라이브러리 설치

$ pip install selenium

chrome-Web driver 설치

다운로드 링크에서 브라우저,버전에 맞게 압축파일을 다운로드한다.
이때 파일은 작업할 소스코드 근처에 두는게 좋다. 경로를 입력해서 찾아줘야하기때문에..
나의 설치 버전 : ChromeDriver 83.0.4103.39


Selenium 시작하기

사용하는 라이브러리들 import하기

from selenium import webdriver as wd
from bs4 import BeautifulSoup

Remote WebDriver

class selenium.webdriver.remote.webdriver.WebDriver(command_executor='http://127.0.0.1:4444/wd/hub', desired_capabilities=None, browser_profile=None, proxy=None, keep_alive=False, file_detector=None, options=None)

  • 크롬 브라우저 열기
    driver = wd.Chrome(executable_path = './chromedriver')
    driver.get(opi_link)
    

    다운로드 해서 압축을 풀은 chromedriver를 경로에 맞춰서 써준다음, get 내부에 링크를 넣어서 해당 링크를 브라우저에서 실행시킨다.

  • 뒤로가기
    driver.back()
    
  • 현재 창 닫기
    driver.close()
    
  • 종료
    driver.quit()
    

    드라이버를 종료하고 전체 페이지를 닫는다. 작업 종료 후 꼭 해주기

  • 엘리먼트 선택
    • 함수 종류
      find_element(by='id', value=None)
      find_element_by_class_name(name)
      find_element_by_css_selector(css_selector)
      find_element_by_id(id_)
      find_element_by_link_text(link_text)
      find_element_by_name(name)
      find_element_by_partial_link_text(link_text)
      find_element_by_tag_name(name)
      find_element_by_xpath(xpath)
      

      element(1개) 또는 elements(엘리먼트 리스트)로 나뉜다.
      차이점은 element의 경우, 결과값이 없으면 에러를 일으킨다.(NoSuchElementException)
      elements의 경우, 결과값이 없으면 빈 리스트를 리턴한다.

이 중에서 이번 프로젝트에 쓴 몇개를 정리하자면,

  • xpath이용하기
    driver.find_element_by_xpath('//*[@id="query"]')
    

    xpath를 이용해서 엘리먼트를 선택하는 방법.
    이 때 xpath는 [크롬브라우저 - 개발자도구]를 이용해서 쉽게 찾을 수 있다.
    image1

  • class이름 이용하기
     element = driver.find_element_by_class_name('foo')
    
  • tag 이용하기
    element = driver.find_elements_by_tag_name("a") # a태그에 해당하는 엘리먼트 리스트 리턴
    
  • 이미지 저장하기
    • get_screenshot_as_file(filename)
      driver.get_screenshot_as_file('./image/test.png')
      

      IOERROR가 있으면 false리턴, 아니면 true를 리턴한다.
      filename에는 full paths가 들어가야한다.(.png)확장자로 끝나야한다.

    • get_screenshot_as_png()
      만약 이미지 태그 엘리먼트를 찾았다면 xpath와 screenshot_as_png를 이용해서 저장할 수도 있다.
         tmpPath = "/html/body/img"
         final_img = driver.find_element_by_xpath(tmpPath)
         element_png = final_img.screenshot_as_png 
         with open("./image/test.png", "wb") as file:
             file.write(element_png)
      

Remote WebDriver WebElement

class selenium.webdriver.remote.webelement.WebElement(parent, id_, w3c=False)

  • 하위 엘리먼트 선택
    마찬가지로 엘리먼트 하위의 엘리먼트를 선택하기위한 find_element혹은 find_elements로 시작하는 함수들을 쓸 수 있다.

  • attr 가져오기
    # Check if the "active" CSS class is applied to an element.
    is_active = "active" in target_element.get_attribute("class")
    

    엘리먼트의 attribute나 property를 가져올 수 있다.

  • property 가져오기
    text_length = target_element.get_property("text_length")
    
  • 엘리먼트 클릭
    test = '//*[@id="query"]'
    driver.find_element_by_xpath(test).click()
    

    xpath에 해당하는 엘리먼트를 클릭하기. 나는 버튼 클릭 이벤트에서 썼다.

  • style 속성 값
    element.value_of_css_property("font-size")
    

    해당 엘리먼트의 css속성에 font-size가 있다면, 값 출력

참고

Selenium
Selenium(셀레늄) 사용하기 WebDriver API

댓글남기기