728x90
반응형
여기저기 찾아보니 대부분 자료가 오래된 것들이라 없어진 library도 있고 해서
크롤링 코드를 참조하면서 짜기가 힘들었는데요,,,, 고군분투하면서 만든 2023년 버전 구글 이미지 크롤링 코드 공유합니다! 특히 크롤링 했을 때 썸네일 크기의 이미지가 나와서 원본크기의 이미지 다운로드를 구현하느라 시간이 좀 걸렸네요 ㅜ
#구글 이미지 크롤링 #원본크기 크롤링 #동적 크롤링
구글 코랩이나 아나콘다 노트북에서 처음 selenium을 쓴다면)
! pip install selenium
!apt -get update #Colab
!apt install chromium-chromedriver #Colabe에서 chromedriver사용이 가능하도록 합니다
webdriver 설정을 위한 기본 세팅
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.common.by import By
from selenium.webdriver.chrome.service import Service
driver = webdriver.Chrome(service=Service('C:/Temp/chromedriver'))
driver 설정 혹은 CSS SELECTOR 찾는 법은 아래 게시물을 참조해주세요
2023.02.17 - [Python] - 파이썬 Selenium을 사용한 크롤링 (2023버전) _ 태그 쉽게 찾기
from selenium.common.exceptions import NoSuchElementException, TimeoutException, NoSuchWindowException
from requests.exceptions import MissingSchema, InvalidURL
import os
url = "https://www.google.com/search?q="
backurl = "&source=lnms&tbm=isch&sa=X&ved=2ahUKEwiUkNOG76L9AhVION4KHaptAsMQ_AUoAXoECAEQAw&biw=1036&bih=674&dpr=1.25"
fname = ['g1','g2','g3','g4','g5','g6','g7','g8','g9','g10','g11','g12']
cname= ['윤아','유인나','아이유','손예진','태연','전지현','공효진','김희선','제니','이하늬','슬기','조이']
output_folder = "output" #폴더가 없다면 폴더를 만들어달라
if not os.path.exists(output_folder):
os.makedirs(output_folder)
driver = webdriver.Chrome() #크롬을 열고
for f, c in zip(fname,cname):
fpath = f'{url}{c}{backurl}' #구글 이미지 페이지에서 검색어를 입력하고
driver.get(fpath) #크롬으로 앞서 입력한 페이지로 이동(실행)
cnt=0
for i in range(2, 40): #40개 정도 이미지를 뽑아봅시다
try:
smallimg = driver.find_element(By.CSS_SELECTOR, f"#islrg > div.islrc > div:nth-child({i}) > a.wXeWr.islib.nfEiy > div.bRMDJf.islir > img")
smallimg.click() #이미지 검색을 처음나오면 작은 그림들 중 첫번째 클릭
time.sleep(1) #로딩을 위해 잠시 텀을 주고
bigimg = driver.find_element(By.CSS_SELECTOR, "#Sva75c > div.DyeYj > div > div.dFMRD > div.pxAole > div.tvh9oe.BIB1wf > c-wiz > div > div.OUZ5W > div.zjoqD > div.qdnLaf.isv-id.b0vFpe > div > a > img")
src = bigimg.get_attribute("src") #이미지 클릭시 크게 뜨는 이미지 주소를 CSS로 찾아주고, 이미지 소스를 찾습니다
if src and src.startswith('http'):
try:
r = requests.get(src, verify=False) # verify =False는 보안 문제가 있을 수도 있어서 주의
img = Image.open(BytesIO(r.content)) #URL과 이미지 소스에 문제가 없으면 열어서 저장
cnt += 1
img.save(f"output/{f}_{cnt}.jpg")
except Exception as e:
print(f"Error saving image: {e}")
pass
except NoSuchWindowException:
print("Window closed before script finished executing")
break
except (NoSuchElementException, TimeoutException) as e:
print(f"Error finding image element: {e}")
pass
driver.quit()
이 코드는 구글 이미지 검색창에서 검색어 검색 > 작은 이미지들 중 하나 클릭 > 원본 크기 큰 이미지 클릭 > url 문제가 없을 시 저장한 방식 format 대로 저장을 수행하는 코드입니다.
구글 이미지를 가져올 때 생각보다 이미지를 올린 사이트마다, 혹은 이미지 형식에 따라 error가 계속나서 예외처리를 하면서 pass 되도록 했습니다.
728x90
반응형
'Python' 카테고리의 다른 글
Python 문자열 중 알파벳 골라내기 및 소문자로 바꾸기 (0) | 2023.04.17 |
---|---|
파이썬 Selenium을 사용한 크롤링 (2023버전) _ 태그 쉽게 찾기 (0) | 2023.02.17 |
파이썬 딕셔너리 마지막 값 추출하는 법 정리 (0) | 2022.12.04 |
숫자형 리스트 중간값 (median) 구하는 방법 정리 (0) | 2022.11.03 |
Ordered dict 개념 및 기능 정리 (0) | 2022.10.12 |
댓글