6. 웹 브라우저를 이용한 크롤링
파이썬을 이용한 머신러닝, 딥러닝 실전개발 입문
파이썬을 이용한 머신러닝, 딥러닝 실전개발 입문 책과 강의를 바탕으로한 코드 리뷰 및 정리입니다. 자세한 내용은 책과 강의를 참고해주세요.
link: github
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)