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

나윤호님의 프로필 이미지
나윤호

작성한 질문수

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

큰 사진 변환이 잘 안됩니다.

작성

·

436

2

안녕하세요 강사님? 강사님께서 너무 질 좋은 수업을 제공해주셔서 정말 많은 도움을 받고 있습니다.

제가 구글 이미지 크롤링을 하는데, 제 나름대로 keyword, number 입력과 같은 여러 개를 추가했습니다. 그리고 강사님께서 알려주신 것처럼 했는데, 다운받아지는 처음 이미지만 큰 이미지이고 다른거는 다 작은 이미지더라구요. 코드에 어느 부분이 잘못되었는지 확인해주실 수 있으신가요?

그리고 강사님께서 이미지를 추출하실 때 img.n3VNCb로 클래스를 사용하시고 큰 이미지와 작은 이미지를 구분하기 위해서 리스트를 사용하셨는데, 지금 구글에서 이미지의 클래스를 확인해보니 'img.n3VNCb.KAlRDb'로 바뀐?것 같더라구요. 이거랑 같은 클래스를 가진 사진들은 모두 큰 사진밖에 없더라구요. 그래서 이걸 활용하고, target=driver.find_element(By.CSS_SELECTOR, 'img.n3VNCb.KAIRDb')로 했는데 그때는 이미지가 아에 다운받아지지 않더라구요. 이 두 문제를 해결해 주실 수 있으신가요?

from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from webdriver_manager.chrome import ChromeDriverManager
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys
import time
import pyautogui
import os
import urllib.request
keyword=pyautogui.prompt('검색어를 입력하세요')
number=int(pyautogui.prompt('몇 번째 이미지까지 크롤링할까요?'))
num=0
if not os.path.exists(f'{keyword}.google'):
    os.mkdir(f'{keyword}.google')
service=Service(executable_path=ChromeDriverManager().install())
driver=webdriver.Chrome(service=service)
response=driver.get(f'https://www.google.com/search?q={keyword}&sxsrf=ALiCzsadE49SRlwdOzINREC1wSxMZD0kiw:1661318376125&source=lnms&tbm=isch&sa=X&ved=2ahUKEwjjoaud3d75AhUXmVYBHUXqBUMQ_AUoAXoECAIQAw&biw=767&bih=712&dpr=1.25&safe=active&ssui=on#imgrc=hIwGHHtQdIeMRM')
driver.maximize_window
driver.implicitly_wait(5)
before_h=driver.execute_script('return window.scrollY')
while True:
    driver.find_element(By.CSS_SELECTOR, 'body').send_keys(Keys.END)
    time.sleep(1)
    after_h=driver.execute_script('return window.scrollY')
    if before_h==after_h:
        break
    before_h=after_h
imgs=driver.find_elements(By.CSS_SELECTOR, 'img.rg_i.Q4LuWd')

for i, img in enumerate(imgs, 1):
    if num==number:
        break
    # 클릭하다보면 element click intercepted 에러
    #javascript로 클릭을 직접 하도록 만들기.
    driver.execute_script('arguments[0].click();',img)
    if i==1:
        target=driver.find_elements(By.CSS_SELECTOR, 'img.n3VNCb')[0]
    else:
        target=driver.find_elements(By.CSS_SELECTOR, 'img.n3VNCb')[1]
    img_src=target.get_attribute('src')
    
    #403:Forbidden 에러 해결
    opener=urllib.request.build_opener()
    opener.addheaders=[('User-Agent','Mozila/5.0')]
    urllib.request.install_opener(opener)
    
    try:
        urllib.request.urlretrieve(img_src, f'{keyword}.google/{i}.png')
    except:
        pass
    num+=1

답변 3

0

나윤호님의 프로필 이미지
나윤호
질문자

질문 하나가 해결되지 않아서 다시 질문드려요. 지금 구글에 이미지를 검색해서 클래스를 추출하면 n3VNCb.KAlRDb가 나오더라구요.

그리고 그 클래스를 추출하면 큰 이미지 하나만 있어서, find_element를 사용했습니다.

그런데 img_src=target.get_attribute['src']에서 에러가 발생했습니다.

'method' object is not subscriptable 라고 뜨네요. 왜 오류가 발생하는 것인가요?

from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys
from webdriver_manager.chrome import ChromeDriverManager
import urllib.request
import time
import os
import pyautogui

keyword=pyautogui.prompt('검색어를 입력하세요')
number=pyautogui.prompt('몇 페이지까지 크롤링할까요?')
num=0

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

service=Service(executable_path=ChromeDriverManager().install())
driver=webdriver.Chrome(service=service)

url=f'https://www.google.com/search?q={keyword}&sxsrf=ALiCzsYWdTh8-pf-RbVUKlr6vcRh_RrRHQ:1661388994496&source=lnms&tbm=isch&sa=X&ved=2ahUKEwiY4eam5OD5AhXVE4gKHeWbABoQ_AUoAXoECAIQAw&safe=active&ssui=on'
driver.get(url)
driver.maximize_window
driver.implicitly_wait(1)

before_h=driver.execute_script('return window.scrollY')
while True:
    driver.find_element(By.CSS_SELECTOR, 'body').send_keys(Keys.END)
    after_h=driver.execute_script('return window.scrollY')
    if before_h==after_h:
        break
    before_h=after_h

imgs=driver.find_elements(By.CSS_SELECTOR, 'img.rg_i.Q4LuWd')
for i, img in enumerate(imgs, 1):
    if number==num:
        break
    driver.execute_script('arguments[0].click();', img)
    target=driver.find_element(By.CSS_SELECTOR, 'img.n3VNCb.KAlRDb')
    time.sleep(1)
    img_src=target.get_attribute['src']
    
    opener=urllib.request.build_opener()
    opener.addheaders=[('User-Agent','Mozila/5.0')]
    urllib.request.install_opener(opener)

    try:urllib.request.urlretrieve(img_src, f'{keyword}.pre/{i}.png')
    except:
        pass
    num+=1
스타트코딩님의 프로필 이미지
스타트코딩
지식공유자

안녕하세요. () 와 [] 를 구분하고 사용하셔야 합니다 ^^

객체.메소드()

객체.딕셔너리[]

get_attribute('src') 로 바꾸어 주셔야 합니다.

0

나윤호님의 프로필 이미지
나윤호
질문자

감사합니다!

0

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

안녕하세요!!

해당 오류는 테스트 해본 결과

이미지를 클릭하고 로딩할 시간을 주지 않아서 발생하는 오류 입니다.

time.sleep(2) 정도 기다린 후 이미지를 저장하시면 정상적으로 큰 이미지가 다운로드 됩니다.

나윤호님의 프로필 이미지
나윤호

작성한 질문수

질문하기