크롬 버전 확인 : chrome://settings/help
크롬드라이버 다운로드 : https://chromedriver.chromium.org/downloads
###############################################################
파이썬 셀레니움 이미지 크롤링
https://www.youtube.com/watch?v=1b7pXC1-IbE
Selenium Locating Elements (python)
https://dejavuqa.tistory.com/108
Locating Elements
https://selenium-python.readthedocs.io/locating-elements.html#locating-elements
Selenium 웹 드라이버 unexpected alert open 처리
https://blkcoding.blogspot.com/2018/03/selenium.html
from selenium import webdriver
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.common.exceptions import TimeoutException
browser = webdriver.Firefox()
browser.get("url")
browser.find_the_element_by_id("add_button").click()
try:
WebDriverWait(browser, 3).until(EC.alert_is_present(),
'Timed out waiting for PA creation ' +
'confirmation popup to appear.')
alert = browser.switch_to.alert
alert.accept()
print("alert accepted")
except TimeoutException:
print("no alert")
네이버 로그인하기 (네이버 자동로그인 방지문자 우회 1분컷)
from selenium import webdriver
import time
driver = webdriver.Chrome('chromedriver')
driver.get('https://nid.naver.com/nidlogin.login')
id = '아이디'
pw = '비밀번호'
driver.execute_script("document.getElementsByName('id')[0].value=\'" + id + "\'")
# time.sleep(1)
driver.execute_script("document.getElementsByName('pw')[0].value=\'" + pw + "\'")
# time.sleep(1)
driver.find_element_by_xpath('//*[@id="frmNIDLogin"]/fieldset/input').click()
1. 파이썬 가상 환경 세팅 : Sublime Text에서 해보려다가 잘 안돼서 패스~
2. Selenium 설치 및 브라우저 세팅
3. 구글 이미지 크롤링 코드 작성
1. 파이썬 가상 환경 세팅
파이썬 버전이나 라이브러리가 각각 만들고자 하는 프로젝트별로 모두 다를 수 있다.
그렇기 때문에 하나의 컴퓨터 내에서도 이렇게 파이썬의 버전이나 정보들을 여러개로 분리하여 각각을 독립적으로 가상환경처럼 만들어서 선택해서 사용하게 만들 수 있다.
비주얼스튜디오 코드를 실행
메뉴선택 : File > Open folder
터미널 열어서 작업하고자 하는 폴더로 이동
(shift+마우스 오른쪽 버튼 클릭, '여기서 명령 창 열기(w)' 클릭)
F:\python
명령어 실행
python -m venv selenium
(마지막 selenium은 아무렇게나 적어줘도 된다.)
한참 기다리다가 끝나면 하위디렉토리 selenium이 생성된다.
F:\python\selenium
가상환경 들어가는 방법
1) 가상 환경을 생성한 Script폴더로 이동한다.
2) activate 명령어를 입력한다.
* 그러면 명령프롬프트 앞에 가상환경 표시가(selenium)이 붙게된다.= 가상환경에 들어왔다는 걸 알려주는 표시
* 이 표시가 붙은 상태로 파이썬 코드를 실행하거나 패키지를 설치하면 이 selenium이라고 하는 가상환경 내에서 실행되고, 설치되는 것이기 때문에 다른 프로젝트와 독립적인 공간에서 패키지를 설치하고 사용할 수 있다.
1.
가상환경에서 셀레니움 설치
pip install selenium
2.
셀레니움으로 활용할 웹브라우저를 세팅
크롬 버전 확인
방법 1) 크롬 주소창에 chrome://version 를 입력하고 엔터를 치면 볼 수 있다.
방법 2) 크롬 메뉴 > 도움말 > chrome 정보
버전 86.0.4240.75(공식 빌드) (64비트)
구글검색창 : chromdriver
Downloads - ChromeDriver - WebDriver for Chrome
https://chromedriver.chromium.org/downloads
크롬버전과 일치하는 크롬드라이버를 다운받는다.
If you are using Chrome version 86, please download ChromeDriver 86.0.4240.22
chromedriver_win32 압축을 풀고, exe파일을 셀레니움 폴더에 복사해 넣는다.
이제 셀레니움 폴더에 py 파일을 만들고 코딩하면 된다.
구글 검색창에 python selenium example 검색한다.
https://selenium-python.readthedocs.io/getting-started.html
이 사이트 접속해서 코드를 복사해서 붙여넣는다.
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
import time
import urllib.request
driver = webdriver.Chrome()
driver.get("https://www.google.co.kr/imghp?hl=ko&tab=wi&ogbl")
#검색창 찾고, 검색어 입력, 엔터키 누름
elem = driver.find_element_by_name("q") #검색창 class로 찾아도 되고, name=q으로 찾아도 된다.
searchWord = "아이린"
elem.send_keys(searchWord) #검색창에 아이린 입력
elem.send_keys(Keys.RETURN) #엔터키 누름
# 스크롤을 계속 끝까지 내려서 최대한 많은 이미지를 확보
SCROLL_PAUSE_TIME = 1
# Get scroll height : 자바스크립트 코드로 브라우저 높이를 찾아낸다.
last_height = driver.execute_script("return document.body.scrollHeight")
while True:
# Scroll down to bottom : 브라우저 끝까지 스크롤을 내리겠다.
driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")
# Wait to load page : 로딩 될 동안 time sleep한다. 위에 설정된 1초 동안
time.sleep(SCROLL_PAUSE_TIME)
# Calculate new scroll height and compare with last scroll height
new_height = driver.execute_script("return document.body.scrollHeight")
if new_height == last_height:
try:
# 스크롤 내리다 보면 '결과 더보기'버튼이 나오는데 그걸 클릭하는 부분임
driver.find_element_by_css_selector(".mye4qd").click()
except: #스크롤 내리다가 맨 마지막에는 '결과 더보기'버튼이 없어서 오류가 나는데 이때 반복문을 종료한다.
break
last_height = new_height
#작은 이미지 선택
images = driver.find_elements_by_css_selector(".rg_i.Q4LuWd")
count = 1
for image in images:
try:
image.click()
time.sleep(2) # 로딩 2초 기다림
#큰 이미지 주소 가져오기
imgUrl = driver.find_element_by_xpath('//*[@id="Sva75c"]/div/div/div[3]/div[2]/c-wiz/div[1]/div[1]/div/div[2]/a/img').get_attribute("src") #Html부터 시작해서 굉장히 구체적으로 들어가서 태그를 선택한다.
#이미지 다운로드
opener=urllib.request.build_opener()
opener.addheaders=[('User-Agent','Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/36.0.1941.0 Safari/537.36')]
urllib.request.install_opener(opener)
urllib.request.urlretrieve(imgUrl, "z:\\" + searchWord + "_" + str(count) + ".jpg")
count = count + 1
except: #오류가 나면 무시하고 다음으로 넘어가라
pass
#웹브라우저를 닫아준다.
driver.close()
#https://blog.naver.com/microfun/221996310195
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
import time
import urllib.request
driver = webdriver.Chrome()
driver.get("https://www.google.co.kr/imghp?hl=ko&tab=wi&ogbl")
#검색창 찾고, 검색어 입력, 엔터키 누름
elem = driver.find_element_by_name("q") #검색창 class로 찾아도 되고, name=q으로 찾아도 된다.
searchWord = "아이린"
elem.send_keys(searchWord) #검색창에 아이린 입력
elem.send_keys(Keys.RETURN) #엔터키 누름
# 스크롤을 계속 끝까지 내려서 최대한 많은 이미지를 확보
# python selenium scroll down : https://stackoverflow.com/questions/20986631/how-can-i-scroll-a-web-page-using-selenium-webdriver-in-python
SCROLL_PAUSE_TIME = 1
# Get scroll height : 자바스크립트 코드로 브라우저 높이를 찾아낸다.
last_height = driver.execute_script("return document.body.scrollHeight")
while True:
# Scroll down to bottom : 브라우저 끝까지 스크롤을 내리겠다.
driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")
# Wait to load page : 로딩 될 동안 time sleep한다. 위에 설정된 1초 동안
time.sleep(SCROLL_PAUSE_TIME)
# Calculate new scroll height and compare with last scroll height
# 브라우저 높이를 구해서 다시 새로운 높이로 구해준다.
# 새로 구한 높이랑 이전 높이랑 같다면 (더 이상 내릴 게 없다는 의미니깐) 반복 종료
new_height = driver.execute_script("return document.body.scrollHeight")
if new_height == last_height:
try:
# 스크롤 내리다 보면 '결과 더보기'버튼이 나오는데 그걸 클릭하는 부분임
driver.find_element_by_css_selector(".mye4qd").click()
except: #스크롤 내리다가 맨 마지막에는 '결과 더보기'버튼이 없어서 오류가 나는데 이때 반복문을 종료한다.
break
last_height = new_height
#작은 이미지 선택
#element는 1개 선택, elements는 여러개 선택
#원래 클래스 이름은 "rg_i Q4LuWd" 이렇지만 클래스니깐 점을 찍어준다. ".rg_i.Q4LuWd"이렇게 점을 찍어준다. CSS강좌 참고..CSS 선택하는 방법과 동일
#elem = driver.find_elements_by_css_selector(".rg_i.Q4LuWd") #작은 이미지 class로 찾음
#images = driver.find_elements_by_css_selector(".rg_i.Q4LuWd")[0].click() #검색결과 여러 작은 이미지 중 첫번째[0] class로 찾고, 클릭
images = driver.find_elements_by_css_selector(".rg_i.Q4LuWd")
count = 1
for image in images:
try:
image.click()
time.sleep(2) # 로딩 2초 기다림
#큰 이미지 주소 가져오기
#imgUrl = driver.find_element_by_css_selector(".n3VNCb").get_attribute("src") #클래스가 3개나 돼서 제대로 안되는 경우가 있다.
#태그에서 마우스 우클릭 Copy > Copy select나 Copy XPath를 통해서 좀 더 구체적으로 선택할 수 있다.
imgUrl = driver.find_element_by_xpath('//*[@id="Sva75c"]/div/div/div[3]/div[2]/c-wiz/div[1]/div[1]/div/div[2]/a/img').get_attribute("src") #Html부터 시작해서 굉장히 구체적으로 들어가서 태그를 선택한다.
#이미지 다운로드
#이미지를 다운로드 하실때 나무위키 등 특정 사이트의 경우 봇이 접근하는 것을 차단해서
#urllib.request.urlretrieve(imgUrl, "test.jpg") 줄에서 urllib.error.HTTPError: HTTP Error 403: Forbidden가 뜨실 수 있습니다.
#그럴때는 아래와 같이 브라우저 인것 처럼 속이는 header를 추가하시면 정상적으로 크롤링 할 수 있습니다!
opener=urllib.request.build_opener()
opener.addheaders=[('User-Agent','Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/36.0.1941.0 Safari/537.36')]
urllib.request.install_opener(opener)
urllib.request.urlretrieve(imgUrl, "z:\\" + searchWord + "_" + str(count) + ".jpg")
#python download image by url : https://stackoverflow.com/questions/3042757/downloading-a-picture-via-urllib-and-python
count = count + 1
except: #오류가 나면 무시하고 다음으로 넘어가라
pass
#웹브라우저를 닫아준다.
driver.close()
#이 작업을 하다보면 TMP 폴더에 쓰레기(?)인지 뭔지 모르겠지만 용량을 잡아먹는다.
#삭제해 주는 소스 추가
import os
import shutil
def removeFolder(wPath,tFolder):
try:
items = os.listdir(wPath)
for item in items:
if item.find(tFolder) > -1:
ext = os.path.join(wPath, item)
print(ext)
#os.rmdir(ext) #폴더 안에 파일이 있으면 삭제 불가, 오류가 난다.
shutil.rmtree(ext) #폴더 안에 파일이 있어도 삭제 가능
except PermissionError: #접근권한 때문에 오류가 날 때
pass
removeFolder("Z:/TMP/","scoped_")
#os.system("pause")
################
실행을 했을 때 아래와 같은 메세지가 뜨고 실행이 안된다면 크롬드라이버를 업데이트 해줘야 한다.
(크롬 버전이 자동으로 업데이트 되어서 드라이버 버전과 안맞아서 애러가 뜨는 거임)
Traceback (most recent call last):
File "F:\python\selenium\sel.py", line 167, in <module>
driver.close()
NameError: name 'driver' is not defined
[Finished in 4.9s]
크롬 버전 확인 : chrome://version
크롬 드라이버 다운로드 : https://chromedriver.chromium.org/downloads
[2023.01.15] 파이썬 셀레니움4 사용하다가 남기는 메모 (0) | 2023.01.15 |
---|---|
[2023.01.15] 파이썬 셀레니움 실행 오류 메세지 해결 (python selenium) (0) | 2023.01.15 |
[파이썬] slacker 라이브러리를 사용해서 메세지 보내기 (유튜브 보다가 메모) (0) | 2020.12.04 |
[파이썬] 크레온 API 시작하기/환경설정 (유튜브 보다가 메모) (0) | 2020.11.28 |
[파이썬] PyAutoGUI 라이브러리로 키보드, 마우스 제어하기 (정리중) (0) | 2020.11.18 |