본문 바로가기
Python

파이썬 크롤링 selenium 네이버 이미지 검색을 통한 데이터 수집

by wanttosleep1111 2023. 1. 21.

파이썬 크롤링 selenium 네이버 이미지 검색을 통한 데이터 수집

 

▶ 목표

  • 사용자로부터 동물 이름을 입력 받아 네이버 이미지 탭에 검색된 동물의 이미지를 수집
  • 네이버 이미지 탭에서 자동으로 스크롤을 내려 이미지를 계속 검색 후 수집
  • 입력 받은 동물 이름의 폴더를 생성하고 이미지를 검색 이름 폴더에 저장

 

① 필요한 라이브러리 불러오기

# 셀레니움 웹드라이버
from selenium import webdriver as wb
# 셀레니움 다양한 선택자 접근 가능 라이브러리
from selenium.webdriver.common.by import By
# 셀레니움에서 key 명령어 입력 라이브러리
from selenium.webdriver.common.keys import Keys
# 딜레이
import time
# 파일을 다루는 라이브러리 : 파일이나 폴더 생성, 삭제, 수정, 존재 여부 확인
import os
# 이미지 경로를 기반으로 서버에 요청하여 이미지 파일을 저장하게 하는 라이브러리
from urllib.request import urlretrieve

 

② 폴더를 생성하는 함수 만들기

os.path.isdir('') : 폴더 존재 여부를 확인하고 True, False 반환 (존재하면 True, 존재하지 않으면 False)

os.mkdir('') : 폴더 생성

def createFolder (name) :
    if os.path.isdir(f'./{name}') == False :
        os.mkdir(f'./{name}')
        print(f'{name} 폴더 생성 완료')
    else :
        print('이미 존재하는 폴더입니다.')

 

③ 사용자로부터 검색할 동물 이름을 입력 받고, 셀레니움으로 네이버 이미지탭 주소에 접근하기

 

input_name = input('이미지를 검색할 동물 이름 입력 >> ')
dirver = wb.Chrome()
driver.get(f'https://search.naver.com/search.naver?where=image&sm=tab_jum&query={input_name}')

 

④ 네이버 이미지 탭에 접근한 후 스크롤을 내려서 이미지를 더 검색되게 해보기

# body태그에 접근하여 스크롤을 내리기
driver.find_element(By.CSS_SELECTOR, 'body').send_keys(Keys.END)
# for문을 이용해 스크롤을 여러번 내리게 하기
for i in range(6) : # 스크롤을 6번 내리게 하기
    driver.find_element(By.CSS_SELECTOR, 'body').send_keys(Keys.END)
    time.sleep(2) # 딜레이를 줘서 너무 빠르게 넘어가게 하지 않기
print('스크롤 다운 완료')

 

④ 검색된 이미지 태그에 접근하여 속성값(src)를 수집하고, 주소값을 제대로 가져오지 못한 데이터 값은 삭제하기

.get_attribute('속성')

 

# 이미지 태그 수집
img = driver.find_elements(By.CSS_SELECTOR, '._image._listImage')
# 수집한 이미지 태그에서 src 속성값 수집
src = [i.get_attribute('src') for i in img]
src

 

# src_lst에 src의 data:image가 있는 문자열을 뺀 데이터만 담기
src_lst = []
for i in src :
	if 'data:image' not in src :
    	src_lst.append(i)

 

⑤ src_lst에 담긴 이미지 주소를 검색 이름 폴더 안에 이미지 파일(jpg)로 저장하기

urlretrieve(이미지주소,'저장할주소.이미지형식')

# src_lst의 이미지 주소를 for문, urlretrivev를 이용해보기
# 사용자가 입력한 검색어 이름 폴더/검색어_번호.jpg파일로 저장하기
for i in range(len(src_lst)) :
	urlretrieve(src_lst[i], f'./{input_name}/{input_name}_{i+1}.jpg')

 


 

▶ 전체 코드 (레서판다 검색)

input_name = input('이미지를 수집할 동물 이름 입력 >> ')
driver = wb.Chrome()
driver.get(f'https://search.naver.com/search.naver?where=image&sm=tab_jum&query={input_name}')
time.sleep(2) # 브라우저가 열리고 딜레이를 주어서 너무 빨리 코드가 실행되지 않게 조절
for i in range(6) : # body태그에 접근해 스크롤을 6번 내리기
    driver.find_element(By.CSS_SELECTOR, 'body').send_keys(Keys.END)
    time.sleep(2) # 스크롤을 내릴 때 너무 빨리 코드가 실행되지 않도록 딜레이
print('스크롤 다운 완료')
img = driver.find_elements(By.CSS_SELECTOR, '._image._listImage') # 이미지 태그 접근
src = [i.get_attribute('src') for i in img] # 이미지 태그의 src속성값 수집
src_lst = []
for i in src : # 잘못된 주소를 가져온 src 데이터를 빼고 src_lst에 담기
    if 'data:image' not in i :
            src_lst.append(i)
createFolder(input_name) # 검색 이름 폴더 만들기 함수 실행
for i in range(len(src_lst)) : # .jpg 이미지 파일로 저장
    urlretrieve(src_lst[i], f'./{input_name}/{input_name}_{i+1}.jpg')
driver.close() # 브라우저 닫기
print(f'{input_name} 이미지 수집, 저장 작업 완료')

댓글