본문 바로가기
python

[selenium] 웹사이트에서 데이터 긁어오기 - 이미지편

by 포 키 2023. 8. 8.
728x90

오늘은 셀레니움을 이용해서 웹 사이트에서 사진을 다운받아오는 과정에 대해 작성한다.

이미지 분석에 사용할 수 있도록 예제코드를 배운 셈으로 생각보다 간단했다.

나는 주피터노트북 가상환경 내에서 이 작업을 진행했으며, 이 과정까지는 더이상 언급하지 않겠다.

 

1. jupyter lab에서 크롬 드라이브 확인하기

이미지 분석을 위해 크롬에서 구글 이미지검색 사이트를 활용할 것이다.

그렇기 위해 크롬 드라이브가 지정한 위치에 있는지 확인을 해주자

 

 

import os

def list_files(startpath):
    for root, dirs, files in os.walk(startpath):
        level = root.replace(startpath, '').count(os.sep)
        indent = ' ' * 4 * (level)
        print('{}{}/'.format(indent, os.path.basename(root)))
        subindent = ' ' * 4 * (level + 1)
        for f in files:
            print('{}{}'.format(subindent, f))

list_files("크롬 드라이버를 설치한 폴더명")

 

2. 크롬 드라이브로 새창 열어보기

맨 처음의 코드가 안된다면, 두번째 코드를 사용해서 드라이브 창이 열리는지 확인하자

1.

from selenium import webdriver
from selenium.webdriver.chrome.service import Service

CHROME_DRIVER_PATH = './driver/chromedriver.exe'
service = Service(executable_path=CHROME_DRIVER_PATH)
options = webdriver.ChromeOptions()
driver = webdriver.Chrome(service=service, options=options)

driver.get('https://www.naver.com/')

 

2.

from selenium import webdriver
from selenium.webdriver.chrome.service import Service as ChromeService
from webdriver_manager.chrome import ChromeDriverManager

driver = webdriver.Chrome(service=ChromeService(ChromeDriverManager().install()))
driver.get('https://www.naver.com/')

 

그리고 잊지 말아야 할 것은 열린 드라이브는 명령어로 닫아주는 것이다!

driver.quit()

 

 

3. 구글 이미지 다운로드 설정

나는 보라카이에 대해 검색하고 소스코드를 분석해 이미지 파일을 다운해 볼것이다.

아래에서 먼저 이미지 파일이 몇개인지 확인을 해주자

 

from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.common.by import By

CHROME_DRIVER_PATH = './driver/chromedriver.exe'
service = Service(executable_path=CHROME_DRIVER_PATH)
options = webdriver.ChromeOptions()
driver = webdriver.Chrome(service=service, options=options)

URL='https://www.google.co.kr/imghp'
driver.get(url=URL)

elem = driver.find_element(By.CSS_SELECTOR, "body > div.L3eUgb > div.o3j99.ikrT4e.om7nvf > form > div:nth-child(1) > div.A8SBwf > div.RNNXgb > div > div.a4bIc > textarea.gLFyf")
elem.send_keys("보라카이")
elem.send_keys(Keys.RETURN)

elem = driver.find_element(By.TAG_NAME, "body")
for i in range(60):
    elem.send_keys(Keys.PAGE_DOWN)
    time.sleep(0.1)

try:
    driver.find_element(By.CSS_SELECTOR, "#islmp > div > div > div > div.gBPM8 > div.qvfT1 > div.YstHxe > input").click()
    for i in range(60):
        elem.send_keys(Keys.PAGE_DOWN)
        time.sleep(0.1)

except:
    pass

links=[] 
images = driver.find_elements(By.CSS_SELECTOR, "#islrg > div.islrc > div > a.wXeWr.islib.nfEiy > div.bRMDJf.islir > img")

for image in images:
    if image.get_attribute('src') is not None:
        links.append(image.get_attribute('src'))
        
print(' 찾은 이미지 개수:',len(links))

 

찾은 이미지 개수를 모두 다운하려한다.

이 때, 위에서 반복문을 사용해서 갯수를 찾아뒀으니, 다운할 때도 반복문을 이용해서 모두 다운받아주자

그전에 미리 해야할 것은 현재 실행중인 경로와 같은 경로에 사진다운로드 라는 파일을 만들어주었다.

폴더 이름은 아무거나 상관없고, 경로를 잘 지정해서 아래 코드에서 잘 넣어주자

 

import urllib.request

for k, i in enumerate(links):
    url = i
    urllib.request.urlretrieve(url, ".\\사진다운로드\\"+str(k)+".jpg")

print('다운로드 완료하였습니다.')

 

 

비록 순서는 엉망일지언정 모두 다운은 정상적으로 완료되었다.

 

728x90