Selenium이란?
WebBrowser(Chrome, Firefox, IE, Safari 등등)를 조작해주는 프레임워크(Framework).
일반적으로 웹 앱을 테스트할 때 주로 사용하는 프레임워크이다.
webdriver(조작을 원하는 browser별로 실제 파일이 다름)라는 API를 이용해 브라우저를 제어할 수 있다. 브라우저를 직접 동작시킨다는 것은 JavaScript가 동작하면서 비동기적으로 서버로부터 콘텐츠를 가져오거나 숨겨져 있는 콘텐츠를 열거나 하는 등의 작업을 수행함을 의미한다. webdriver는 http프로토콜로 명령을 직접 날리고 확인 할 수 있다.
Selenium 라이브러리에는 브라우저 조작이 가능한 다양한 기능이 존재하며, JS로 렌더링이 완료된 후의 DOM결과물에 접근이 가능하다. 우리가 requests에서 사용했던 .text의 경우 브라우저에서 '소스보기'를 한 것과 같이 동작하여, JS등을 통해 동적으로 DOM이 변화한 이후의 HTML을 보여주지 않기 때문에 Selenium은 JavaScript에 의해 동적으로 생성되는 사이트의 데이터를 크롤링할 때 매우 유용하게 사용되는 스크래핑 도구이다.
설치방법(Python기준)
1. 현재 설치된 패키지 정보들을 보자. 파이어폭스 찾아봐!
sudo apt --installed list | grep firefox
2. 셀레니움 설치
pip install selenium
3. 현재 환경설정
현재 파이참 개발은 myapps라는 환경에서 하고 있으므로 이동.
주피터를 위해 base에도 설치해주고, myapps에서 한번 셀레니움을 더 설치해준다.
conda activate myapps
4. 설치하고 tar 파일 압축 풀기
wget https://github.com/mozilla/geckodriver/releases/download/v0.26.0/geckodriver-v0.26.0-linux64.tar.gz
tar xvzf geckodriver-v0.26.0-linux64.tar.gz
5. 파일 경로 이동
sudo mv geckodriver /usr/local/bin/
6. testdaum.py 파일을 생성한다.
다음 계정으로 로그인 하는 실험을 해보도록 하자.
user와 pass에 다음 계정 아이디와 비밀번호를 넣고 로그인해보자.
from selenium.webdriver import Firefox, FirefoxOptions
USER = ""
PASS = ""
# Firefox 실행하기
browser = Firefox()
# 로그인 페이지에 접근하기
url_login = "https://accounts.kakao.com/login?continue=https%3A%2F%2Flogins.daum.net%2Faccounts%2Fksso.do%3Frescue" \
"%3Dtrue%26url%3Dhttps%253A%252F%252Fwww.daum.net%252F "
browser.get(url_login)
print("로그인페이지에 접근합니다")
# 텍스트 박스에 아이디와 비밀번호 입력하기
e = browser.find_element_by_id("id_email_2")
e.clear()
e.send_keys(USER)
e = browser.find_element_by_id("id_password_3")
e.clear()
e.send_keys(PASS)
# 입력양식 전송해서 로그인하기 -find_element_by_css_selector("")
form = browser.find_element_by_css_selector("button.btn_g.btn_confirm.submit")
# form.submit()
form.click()
print("로그인버튼 클릭")
browser.implicitly_wait(3)
browser.get("http://www.naver.com")
# browser.quit()
7. 결과
알아서 입력한 아이디 비밀번호가 입력되고 로그인버튼이 눌러진다.
앗... 카카오로 통합되었더니 로봇 인증을 해야해서ㅠ로그인이 되지는 않는다.
하지만 제어는 성공적!
네이버는 보안이 철저해서 다음으로 했으나ㅠ로봇 인증때문에 더 어렵게 되었다ㅠ
8. 스크린샷 및 종료
브라우저를 스크린샷을 찍어서 저장할 수도 있다. 꼭 브라우저 꺼주고 나가야 과부하가 생기지 않는다.
browser.save_screenshot("result.png")
browser.quit()
[ 주피터 노트북 : 웹스크래핑으로 이미지 다운로드하기 ]
1. url을 입력해서 화면 캡처하고 저장하기
네이버 홈페이지를 캡처하고 저장해보자.
headless로 하게되면 상단의 메뉴바가 없이 캡쳐된다.
▼ 전체 코드
from selenium.webdriver import Firefox, FirefoxOptions
# 파이어 폭스를 헤드리스 모드로 설정하는 옵션(Headless:창이 없는)
options = FirefoxOptions()
# url 설정
url = "http://www.naver.com"
# 입력받을 인자값 등록
options.add_argument('--headless')
# 파이어폭스 드라이버 추출
browser = Firefox(options=options)
# url 읽어들이기
browser.get(url)
#화면을 캡쳐해서 저장하기
browser.save_screenshot("Website.png")
#종료
browser.quit()
2. 인스타그램에서 강아지 사진 가져오기
1) 게시물 갯수를 크롤링해보자.
▼ 전체 코드
from selenium.webdriver import Firefox, FirefoxOptions
import time
#헤드리스모드
options = FirefoxOptions()
options.add_argument('--headless')
#드라이버 추출
browser = Firefox(options=options)
#주소 설정
url = "https://www.instagram.com/explore/tags/%EA%B0%95%EC%95%84%EC%A7%80/"
# url 읽어들이기
browser.get(url)
# 옵션 설정하기
time.sleep(3)
#총 이미지 갯수를 띄우는 텍스트의 클래스 이름 입력
total_cnt = browser.find_element_by_class_name('g47SY').text
print('총 검색된 강아지 이미지 수 : ', total_cnt)
2) 강아지 사진 저장
주피터 workspace에 downImg > dog 경로로 사진을 저장할 폴더를 생성해주었다.
▼ 전체 코드
# 이미지 읽어서 저장하기
imgs = browser.find_elements_by_css_selector('img.FFVAD')
#이미지 가져오기
result = []
for img in imgs:
if 'http' in img.get_attribute('src'):
result.append(img.get_attribute('src'))
from urllib.request import urlretrieve
# 디운로드
for index,link in enumerate(result):
print(index, ":",link)
urlretrieve(link, 'downImg/dog/dog_'+str(index)+'.jpg')
print('success!')
3. [과제]구글에서 입력한 동물 이미지를 수집해서 자동으로 저장하는 프로그램 개발하기
'[ 빅데이터 ]' 카테고리의 다른 글
[빅데이터] spring MVC (0) | 2020.10.30 |
---|---|
[빅데이터] 웹 크롤링 : BeautifulSoup(2) : select, css selector, pandas (0) | 2020.10.23 |
[빅데이터] 웹 크롤링 : BeautifulSoup(1) find, xml 파싱, 태그 속성값 크롤링 (0) | 2020.10.23 |
[빅데이터] 프로젝트 - 상품등록 페이지 만들기(2) (0) | 2020.10.20 |
[빅데이터] 프로젝트 - 상품등록 페이지 만들기(1) (0) | 2020.10.19 |
댓글