인프런 커뮤니티 질문&답변

eunjeong Joo님의 프로필 이미지
eunjeong Joo

작성한 질문수

[2024 개정판] 이것이 진짜 크롤링이다 - 실전편 (인공지능 수익화)

-

img. click()

작성

·

417

1

- img. click()과 이미지 저장이 안됩니다.
네이버 이미지의 경우
from selenium import webdriver import time from selenium.webdriver.common.keys import Keys import os from selenium.webdriver.common.by import By import urllib.request # 이미지 저장 모듈 keyword = input("검색어 입력 ") url = f"https://search.naver.com/search.naver?sm=tab_hty.top&where=image&query={keyword}" s = Service('D:\programs\chromedriver.exe') browser = webdriver.Chrome(service=s) # 폴더 만들기 if not os.path.exists(f'{keyword}'): # 해당 폴더의 존재여부를 boolean값으로 출력해줌 # not True = False : 해당폴더가 기존에 존재하지 않으면 새 폴더를 만든다! os.mkdir(f'{keyword}') browser.implicitly_wait(5) browser.maximize_window() # 화면크기 최대화 browser.get(url) time.sleep(2) # 무한스크롤 # 스크롤 전 높이 before_h = browser.execute_script("return window.scrollY") #execute_script = 자바스크립트 명령어 실행 # 무한 스크롤 - 반복문 while True: # 맨 아래로 스크롤을 내린다. body = 모든 웹사이트에 존재 # 키보드의 END키 누르면 웹페이지 맨아래로이동 browser.find_element(By.CSS_SELECTOR, "body").send_keys(Keys.END) time.sleep(1) # 스크롤 사이 페이지 로딩시간 after_h = browser.execute_script("return window.scrollY") if after_h == before_h: break before_h = after_h # 스크롤 후 높이가 다르면 before_h를 업데이트 # 이미지 태그 추출 imgs = browser.find_elements(By.CSS_SELECTOR, 'img._image._listImage') for i, img in enumerate(imgs, 1): # enumerate(대상, 시작값) # 이미지 다운을 위해선 태그에있는 이미지의 주소가 필요하다. img_src = img.get_attribute('src') print(i, img_src) # img를 index값의 파일명으로 png파일로 저장 urllib.request.urlretrieve(img_src, f'{keyword}/{i}.png')
이렇게 했는데 이미지 저장이 안됩니다.
구글 이미지는
from selenium import webdriver
import time
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.chrome.service import Service
import os
from selenium.webdriver.common.by import By
import urllib.request
s = Service('D:\programs\chromedriver.exe') browser = webdriver.Chrome(service=s) url = "https://www.google.com/search?q=%EA%B3%A0%EC%96%91%EC%9D%B4&sxsrf=APq-WBsz993sMMBhQOIcEjQ2XF3mjmQK_A:1648550317533&source=lnms&tbm=isch&sa=X&ved=2ahUKEwiHpMjAkOv2AhXCQPUHHZg7AoEQ_AUoAXoECAEQAw&biw=1280&bih=937&dpr=1#imgrc=kaRLNYgN2jiJpM" browser.implicitly_wait(10) #브라우저가 다 열릴때까지 기다림 browser.maximize_window() browser.get(url) before_h = browser.execute_script("return window.scrollY") while 1: #맨 아래로 스크롤을 내린다. browser.find_element(By.CSS_SELECTOR, "body").send_keys(Keys.END)#END는 스크롤을 제일 아래로 내일 수 있다. time.sleep(1) after_h = browser.execute_script("return window.scrollY") if after_h == before_h: break befor_h = after_h

if not os.path.exists('./고양이'): os.mkdir("./고양이") cats = browser.find_elements(By.CSS_SELECTOR,".rg_i.Q4LuWd") for i, cat in enumerate(cats, 1): #각 이미지 테그의 주소추출 #src의 속성값을 가져온다. cat.click() time.sleep(1) big_img = browser.find_elements(By.CSS_SELECTOR,"img.n3VNCb") big_img_src = big_img.get_attribute("src") print(i, big_img_src) urllib.request.urlretrieve(big_img_src,f"./고양이/{i}.png")

이렇게 했는데 이미지 저장도 안되고 404에러도 안 납니다.

 

무엇이 문제일까요?
 
 
 

답변 3

0

스타트코딩님의 프로필 이미지
스타트코딩
지식공유자

네이버 이미지 크롤링 소스를 봤는데

Service 를 사용할 때 문제가 있는 것 같네요 ㅎㅎ

 

아래와 같이 사용해 주셔야 합니다.

1. Service 클래스를 import 해줘야 합니다.

2. 크롬 드라이버의 경로는 \(역슬래시)가 아닌 /(슬래시)로 구분해 줘야 합니다.

(역슬래시는 문자열에서 이스케이프 문자를 만드는데 사용하는 기호 입니다) 

from selenium.webdriver.chrome.service import Service
s = Service('D:/programs/chromedriver.exe')

0

eunjeong Joo님의 프로필 이미지
eunjeong Joo
질문자

답변을 주셨는데 잘 안보였군요. 

- img. click()과 이미지 저장이 안됩니다.

네이버 이미지의 경우

from selenium import webdriver

import time

from selenium.webdriver.common.keys import Keys

import os

from selenium.webdriver.common.by import By

import urllib.request # 이미지 저장 모듈

keyword = input("검색어 입력 ")

url = f"https://search.naver.com/search.naver?sm=tab_hty.top&where=image&query={keyword}"

s = Service('D:\programs\chromedriver.exe')

browser = webdriver.Chrome(service=s)

# 폴더 만들기

if not os.path.exists(f'{keyword}'):

# 해당 폴더의 존재여부를 boolean값으로 출력해줌

os.mkdir(f'{keyword}')

browser.implicitly_wait(5)

browser.maximize_window() # 화면크기 최대화

browser.get(url)

time.sleep(2) # 무한스크롤

# 스크롤 전 높이

before_h = browser.execute_script("return window.scrollY")

# 무한 스크롤 - 반복문

while True:

# 맨 아래로 스크롤을 내린다.

browser.find_element(By.CSS_SELECTOR, "body").send_keys(Keys.END)

time.sleep(1)

after_h = browser.execute_script("return window.scrollY")

if after_h == before_h:

break

before_h = after_h # 스크롤 후 높이가 다르면 before_h를 업데이트 # 이미지 태그 추출

imgs = browser.find_elements(By.CSS_SELECTOR, 'img._image._listImage')

for i, img in enumerate(imgs, 1):

img_src = img.get_attribute('src')

print(i, img_src) # img를 index값의 파일명으로 png파일로 저장

urllib.request.urlretrieve(img_src, f'{keyword}/{i}.png')

이렇게 했는데 이미지 저장이 안됩니다.

구글 이미지는

from selenium import webdriver

import time

from selenium.webdriver.common.keys import Keys

from selenium.webdriver.chrome.service import Service

import os

from selenium.webdriver.common.by import By

import urllib.request

s = Service('D:\programs\chromedriver.exe')

browser = webdriver.Chrome(service=s)

url = "https://www.google.com/search?q=%EA%B3%A0%EC%96%91%EC%9D%B4&sxsrf=APq-WBsz993sMMBhQOIcEjQ2XF3mjmQK_A:1648550317533&source=lnms&tbm=isch&sa=X&ved=2ahUKEwiHpMjAkOv2AhXCQPUHHZg7AoEQ_AUoAXoECAEQAw&biw=1280&bih=937&dpr=1#imgrc=kaRLNYgN2jiJpM"

browser.implicitly_wait(10) #브라우저가 다 열릴때까지 기다림

browser.maximize_window()

browser.get(url)

before_h = browser.execute_script("return window.scrollY")

while 1: #맨 아래로 스크롤을 내린다.

browser.find_element(By.CSS_SELECTOR, "body").send_keys(Keys.END)

time.sleep(1)

after_h = browser.execute_script("return window.scrollY")

if after_h == before_h:

break

befor_h = after_h

 

if not os.path.exists('./고양이'):

os.mkdir("./고양이")

cats = browser.find_elements(By.CSS_SELECTOR,".rg_i.Q4LuWd")

for i, cat in enumerate(cats, 1):

cat.click()

time.sleep(1)

big_img = browser.find_elements(By.CSS_SELECTOR,"img.n3VNCb")

big_img_src = big_img.get_attribute("src")

print(i, big_img_src)

urllib.request.urlretrieve(big_img_src,f"./고양이/{i}.png")

이렇게 했는데 이미지가 폴더에 저장도 안되고 404에러도 안 납니다.

0

스타트코딩님의 프로필 이미지
스타트코딩
지식공유자

안녕하세요 ^^

 

코드 개행이 안되어서 문제를 파악하기 힘듭니다 ㅠㅠ

VS Code 에서 코드를 복사 한 후 그대로 붙여 넣으면

아래와 같이 잘 보입니다.

 

만약 잘 안된다면 스크린샷으로라도 첨부 부탁드립니다 ^^

from selenium import webdriver

# 맥 사용자 - /Users/사용자계정명/Documents/chromedriver
browser= webdriver.Chrome("c:/chromedriver.exe")
browser.get("https://www.naver.com")
eunjeong Joo님의 프로필 이미지
eunjeong Joo

작성한 질문수

질문하기