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

찬솔님의 프로필 이미지
찬솔

작성한 질문수

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

-

구글 큰이미지 크롤링 IndexError입니다.

작성

·

464

0

안녕하세요. 이전 에러를 해결하고 다시 코드를 잡기 시작했습니다...
에러 내용은 IndexError: list index out of range 입니다.

다른분이 올려주신 글을 읽어보기도 했는데 제 코드에서는 문제점이 무엇인지 잘 모르겠습니다.

두번째 인덱스가 없기 때문인거같은데

큰 그림만 가져오고싶습니다 ㅠ

 

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

import urllib.request

import time
import pyautogui
import os

# 브라우저 꺼짐 방지
chrome_options = Options()
chrome_options.add_experimental_option("detach", True)

# 크롬창 안뜨게 함
chrome_options.add_argument('--headless') # headless 모드 활성화
chrome_options.add_argument('--disable-gpu') # GPU 가속 비활성화


# 불필요 메세지 없애기
chrome_options.add_experimental_option("excludeSwitches", ["enable-logging"])

# 크롬 드라이버 자동 업데이트
browser = webdriver.Chrome(options=chrome_options)
keyword = pyautogui.prompt('검색어를 입력하세요.')

cnt = 0
# 폴더 만들기 (이미 존재하면 += 1)
while True: 
    cnt += 1
    folder_path = f'크롤링/심화3/{keyword}{cnt}모음'
    if not os.path.exists(folder_path):
        os.mkdir(folder_path)
        break

path = f'https://www.google.com/search?q={keyword}&sca_esv=581612012&tbm=isch&sxsrf=AM9HkKnRu6DCGGz23e29xT4BSB7Hq95zgA:1699754235522&source=lnms&sa=X&ved=2ahUKEwiboaf7rb2CAxWJfd4KHWkWA9MQ_AUoAXoECAQQAw&biw=1552&bih=737&dpr=1.65' # 구글
browser.implicitly_wait(3)
browser.maximize_window()
browser.get(path)

before_h = browser.execute_script("return window.scrollY")
# 무한스크롤
while True:
    time.sleep(5)
    # 맨 아래로 스크롤을 내림
    browser.find_element(By.CSS_SELECTOR,"body").send_keys(Keys.END)
    
    # 스크롤 후 높이
    after_h = browser.execute_script("return window.scrollY")
    
    # 스크롤 높이가 맨 아래와 같다면 무한루프 탈출
    if after_h == before_h:
        print('OKOK')
        break
    
    # 스크롤 높이 업데이트
    before_h = after_h

# 썸네일 이미지 태그 추출
imgs = browser.find_elements(By.CSS_SELECTOR, '.rg_i.Q4LuWd')

for i, img in enumerate(imgs, 1):
    # 이미지 클릭 후 큰 사이즈 찾음
    img.click()
    time.sleep(1)
    
    # 큰 이미지 주소 추출
    if i == 1:
        target = browser.find_elements(By.CSS_SELECTOR, 'img.sFlh5c.pT0Scc.iPVvYb')[0]
    else:
        target = browser.find_elements(By.CSS_SELECTOR, 'img.sFlh5c.pT0Scc.iPVvYb')[1]
        # IndexError: list index out of range
    
    img_src = target.get_attribute('src')
        
    # urllib.error.HTTPError: HTTP Error 403: Forbidden 해결방안 3줄
    opener = urllib.request.build_opener()
    opener.addheaders = [('User-Agent', 'Mozila/5.0')]
    urllib.request.install_opener(opener)
        
    # 이미지 저장
    try:
        urllib.request.urlretrieve(img_src, f'크롤링/심화3/{keyword}{cnt}모음/{keyword}{i}.png')
    except:
        pass
    
    print(f'img {i}개: {target}')
        
print('\nDvlp.H.Y.C.Sol\nJason')

답변 2

0

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

아래 처럼 index 값을 나누지 않고 이미지태그를 추출해 보세요 ~

 

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

import urllib.request

import time
import pyautogui
import os

# 브라우저 꺼짐 방지
chrome_options = Options()
chrome_options.add_experimental_option("detach", True)

# 크롬창 안뜨게 함
# chrome_options.add_argument('--headless') # headless 모드 활성화
chrome_options.add_argument('--disable-gpu') # GPU 가속 비활성화


# 불필요 메세지 없애기
chrome_options.add_experimental_option("excludeSwitches", ["enable-logging"])

# 크롬 드라이버 자동 업데이트
browser = webdriver.Chrome(options=chrome_options)
keyword = pyautogui.prompt('검색어를 입력하세요.')

cnt = 0
# 폴더 만들기 (이미 존재하면 += 1)
while True: 
    cnt += 1
    folder_path = f'{keyword}{cnt}모음'
    if not os.path.exists(folder_path):
        os.mkdir(folder_path)
        break

path = f'https://www.google.com/search?q={keyword}&sca_esv=581612012&tbm=isch&sxsrf=AM9HkKnRu6DCGGz23e29xT4BSB7Hq95zgA:1699754235522&source=lnms&sa=X&ved=2ahUKEwiboaf7rb2CAxWJfd4KHWkWA9MQ_AUoAXoECAQQAw&biw=1552&bih=737&dpr=1.65' # 구글
browser.implicitly_wait(3)
browser.maximize_window()
browser.get(path)

before_h = browser.execute_script("return window.scrollY")
# 무한스크롤
while True:
    time.sleep(1)
    # 맨 아래로 스크롤을 내림
    browser.find_element(By.CSS_SELECTOR,"body").send_keys(Keys.END)
    
    # 스크롤 후 높이
    after_h = browser.execute_script("return window.scrollY")
    
    # 스크롤 높이가 맨 아래와 같다면 무한루프 탈출
    if after_h == before_h:
        print('OKOK')
        break
    
    # 스크롤 높이 업데이트
    before_h = after_h

# 썸네일 이미지 태그 추출
imgs = browser.find_elements(By.CSS_SELECTOR, '.rg_i.Q4LuWd')

for i, img in enumerate(imgs, 1):
    # 이미지 클릭 후 큰 사이즈 찾음
    img.click()
    time.sleep(1)
    
    # 큰 이미지 주소 추출
    target = browser.find_element(By.CSS_SELECTOR, 'img.sFlh5c.pT0Scc.iPVvYb')
    
    img_src = target.get_attribute('src')
        
    # urllib.error.HTTPError: HTTP Error 403: Forbidden 해결방안 3줄
    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}{cnt}모음/{keyword}{i}.png')
    except:
        pass
    
    print(f'img {i}개: {target}')
        
print('\nDvlp.H.Y.C.Sol\nJason')

0

안녕하세요 찬솔 님, 인프런 AI 인턴이에요.
IndexError: list index out of range 에러가 발생하는 이유는 큰 이미지 주소를 찾을 때, 해당 인덱스가 존재하지 않을 때 발생합니다.

이 코드에서 IndexError가 발생하는 구간은 두 번째 이미지부터 큰 이미지 주소를 찾는 부분입니다. target의 인덱스를 설정할 때, 1이 아닌 0부터 시작하는 것을 유의해야 합니다.

아래 코드 부분을 수정하여 문제를 해결할 수 있습니다.

# 큰 이미지 주소 추출
if i == 1:
    target = browser.find_elements(By.CSS_SELECTOR, 'img.sFlh5c.pT0Scc.iPVvYb')[0]
else:
    target = browser.find_elements(By.CSS_SELECTOR, 'img.sFlh5c.pT0Scc.iPVvYb')[i-1]

이렇게 수정하면 IndexError가 발생하지 않고, 원하는 큰 이미지만 가져올 수 있을 것입니다. 감사합니다!

찬솔님의 프로필 이미지
찬솔

작성한 질문수

질문하기