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

찬솔님의 프로필 이미지

작성한 질문수

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

-

NoSuchElementException Stacktrace 에러입니다.

23.11.14 00:37 작성

·

591

0

진행 중 에러가 나왔습니다.. 해당 부분에서 어떻게 잘못되었는지 파악을 못해서 글 남깁니다..

 

File "c:\Users\cksth\OneDrive\바탕 화면\Career\크롤링\심화3\09.click.py", line 71, in <module>

 

raise exception_class(message, screen, stacktrace)

selenium.common.exceptions.NoSuchElementException: Message: no such element: Unable to locate element: {"method":"css selector","selector":"img.sFlh5c.pT0Scc.iPVvYb"}

(Session info: chrome=119.0.6045.124); For documentation on this error, please visit: https://www.selenium.dev/documentation/webdriver/troubleshooting/errors#no-such-element-exception

Stacktrace:

 

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:
    # 맨 아래로 스크롤을 내림
    browser.find_element(By.CSS_SELECTOR,"body").send_keys(Keys.END)
    time.sleep(5)
    
    # 스크롤 후 높이
    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):
    # 이미지 클릭 후 큰 사이즈 찾음
    # 클릭하면  element click intercepted -> JS 로 직접 클릭 유도
    browser.execute_script('arguments[0].click();', img)
    time.sleep(1)
    
    # 큰 이미지 주소 추출
    target = browser.find_element(By.CSS_SELECTOR, 'img.sFlh5c.pT0Scc.iPVvYb')
    img_src = target.get_attribute('src')

    # 에러 해결중
    # 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]

    # 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

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

2023. 11. 17. 18:03

클릭했을 때 큰이미지 중에

해당 선택자로 찾을 수 없는 이미지가 포함되어 있네요

 

이미지태그 중 sFlh5c pT0Scc 만 가지고 있는 태그를 찾아보세요~!

0

인프런 AI 인턴님의 프로필 이미지

2023. 11. 16. 00:41

안녕하세요 찬솔님, 인프런 AI 인턴이에요.
에러 메시지를 보면 selenium에서 NoSuchElementException가 발생한 것으로 보입니다. 해당 에러는 웹 요소를 찾지 못했을 때 발생하는 에러입니다.
에러가 발생한 부분은 다음과 같습니다.

target = browser.find_element(By.CSS_SELECTOR, 'img.sFlh5c.pT0Scc.iPVvYb')

해당 코드에서는 'img.sFlh5c.pT0Scc.iPVvYb' CSS 선택자로 이미지를 찾고 있지만, 해당 이미지 요소를 찾지 못해서 NoSuchElementException가 발생한 것 같습니다.

에러 해결을 위해 다음과 같은 방법들을 시도해볼 수 있습니다.
1. 해당 이미지 요소의 CSS 선택자가 변경되었을 수 있으므로, CSS 선택자를 다시 확인해보세요.
2. 이미지 요소가 로딩될 때까지 충분한 시간을 기다린 후에 요소를 찾도록 WebDriverWait을 사용해보세요.
3. NoSuchElementException가 발생하면 예외 처리를 하거나, 해당 부분을 스킵하도록 코드를 수정해보세요.

위의 방법들을 참고하여 수정해보시고, 계속해서 문제가 발생한다면 더 자세한 내용을 알려주시면 도움을 드리겠습니다. 감사합니다.

찬솔님의 프로필 이미지

작성한 질문수

질문하기