6. 웹 브라우저를 이용한 크롤링


파이썬을 이용한 머신러닝, 딥러닝 실전개발 입문

파이썬을 이용한 머신러닝, 딥러닝 실전개발 입문 책과 강의를 바탕으로한 코드 리뷰 및 정리입니다. 자세한 내용은 책과 강의를 참고해주세요.


2. 고급 스크레이핑

2-2. 웹 브라우저를 이용한 스크레이핑


웹 브라우저 원격 조작_Selenium

  • 자바스크립트를 많이 사용하는 웹 사이트는 requests모듈로는 불가. 웹 브라우저를 원격으로 조작하는 방식으로 스크레이핑 할 수 있음
  • Selenium : 웹 브라우저를 원격으로 조작할 때 사용하는 도구 일반적으로 웹 애플리케이션 테스트를 자동화에 사용
  • 다양한 조작을 자동화 (URL열고 클릭, 스크롤, 문자 입력) + 다양한 웹 브라우저에 대응 + 화면, HTML특정부분 출력 가능


Selenuium 기본구조
#기본구조
from selenium import webdriver

#드라이버추출 + 내부적으로 드라이버 실행하는 코드
driver=webdriver.Chrome('/Users/yeoyoung/Downloads/Chromedriver')
driver.implicitly_wait(3) #완전히 초기화 될 때까지 3초정도 기다림

#Url읽어들이기
url="http://www.naver.com/"
driver.get(url)

#하고싶은 활동들
driver.save_screenshot("Website.png")

#드리아버 종료
driver.quit()


네이버에 로그인해서 크롤링하기
from selenium import webdriver
from selenium.webdriver.common.keys import Keys

driver=webdriver.Chrome('/Users/yeoyoung/Downloads/Chromedriver') #크롬드라이버 경로
driver.implicitly_wait(3)

#로그인 페이지에 접근하기
url="https://nid.naver.com/nidlogin.login"
driver.get(url)

driver.maximize_window()

#텍스트 박스에 아이디와 비밀번호 입력하기 
element_id=driver.find_element_by_id("id") #id텍스트 입력상자
element_id.clear() #텍스트 상자내의 문자 clear
element_id.send_keys("본인 아이디")

element_pw= driver.find_element_by_id("pw") #pw 텍스트 입력상자
element_pw.clear() #텍스트 상자내의 문자 clear
element_pw.send_keys("본인 비밀번호")

#입력양식 전송해서 로그인하기
button=driver.find_element_by_css_selector("input.btn_global[type=submit]")
button.submit() 

#메일페이지 불러오기
driver.get("http://mail.naver.com")
driver.find_elements_by_css_selector("strong.mail_title") #elements : 여러개
for title in titles:
    print("-",title.text)
driver.quit()
Selenium으로 DOM요소를 선택 및 조작
  • DOM내부에 있는 여러 개의 요소 중 처음 찾아지는 요소를 추출

    메소드 이름설명
    find_element_by_id(“id”)id속성으로 요소 하나 추출
    find_element_by_name(“name”)name속성으로 요소를 하나 추출
    find_element_by_css_selector(“query”)CSS 선택자로 요소를 하나 추출
    find_element_by_xpath(“query”)XPath를 지정해 요소를 하나 추출
    find_element_by_tag_name(“name”)태그 이름이 name에 해당하는 요소를 하나 추출
    find_element_by_link_text(“text”)링크 텍스트로 요소 추출
    find_element_by_partial_link_text(“text”)링크의 자식 요소에 포함돼 있는 텍스트로 요소를 하나 추출
    find_element_by_class_name(“name”)클래스 이름이 name에 해당하는 요소를 하나 추출


  • DOM내부에 있는 모든 요소를 추출

    메소드 이름설명
    find_elements_by_css_selector(“query”)CSS선택자로 요소를 여러 개 추출
    find_elements_by_xpath(“query”)XPath를 지정해 요소를 여러 개 추출
    find_elements_by_tag_name(“name”)태그 이름이 name에 해당하는 요소를 여러 개 추출
    find_element_by_class_name(“name”)클래스 이름이 name에 해당하는 요소를 여러 개 추출
    find_element_by_partial_link_text(“text”)링크의 자식 요소에 포함돼 있는 텍스트로 요소를 여러 개 추출


  • DOM요소에 적용할 수 있는 메소드와 속성

    • 메소드

      메소드설명
      clear()글자를 입력할 수 있는 요소의 글자를 지움
      click()요소를 클릭
      get_attribute(“name”)요소의 속성 중 name에 해당하는 속성 추출
      is_displayed()요소가 화면에 출력되는지 확인
      is_enabled()요소가 활성화 돼있는지 확인
      is_selected()체크박스 등의 요소가 선택된 상태인지 확인
      screenshot(“filename”)스크린샷을 찍음
      send_keys(“value”)키를 입력함
      submit()입력 양식을 전송
      value_of_css_property(“name”)name에 해당하는 CSS속성의 값을 추출
    • 속성

      속성설명
      id요소의 id 속성
      location요소의 위치
      parent부모 요소
      rect크기와 위치 정보를 가진 딕셔너리 자료형 리턴
      screenshot_as_base64스크린샷을 Base64로 추출
      screenshot_as_png스크린샷을 PNG형식의 바이너리로 추출
      size요소의 크기
      tag_name태그 이름
      text요소 내부의 글자


  • send_keys() 로 키를 보낼때 특수 문자를 이용하고 싶다면 다음 모듈을 사용하면 된다.

    from selenium.webdriver.common.keys import Keys
    
    • BACKSPACE, DELETE, HOME, END, INSERT / ALT, COMMAND, CONTROL, SHIFT / ENTER, SPACE, TAB / F1, F2, … , F12 등을 입력할 수 있다.


자바스크립트 실행하기
  • Selenium에 원하는 기능이 없을 때 execute_script() 메소드를 사용하여 자바스크립트 코드를 실행할 수 있다.

    #자바스크립트 실행하기
    from selenium import webdriver
      
    driver=webdriver.Chrome('/Users/yeoyoung/Downloads/Chromedriver')
    driver.implicitly_wait(3)
      
    #웹 페이지 열기
    driver.get("http://google.com")
       
    #자바스크립트 실행
    r=driver.execute_script("return 100+50")
    print(r)
    






© 2018. by yeo0

Powered by yeo0