끄적끄적

반응형

크롬 버전 확인 : 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분컷)

https://sab-jil.tistory.com/2

더보기

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

 

반응형
Please Enable JavaScript!
Mohon Aktifkan Javascript![ Enable JavaScript ]