강의

멘토링

커뮤니티

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

최지훈님의 프로필 이미지
최지훈

작성한 질문수

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

큰 사진 가져오기 오류

작성

·

561

1

안녕하십니까
큰 사진 가져올 때 오류가 발생하여 질문드립니다.
 
강사님과 같이 2번째 사진부터 작은 사진이 받아지기 시작했고,
html을 보니, 1번째 사진은 2가지 img.n3VNCb 중 1번 url
2번째 이후부터는 3가지 img.n3VNCb 중 2번 url에 사진이 정확히 연결되는 것을 확인했습니다.
따라서
 
 # 큰 이미지 주소 추출
    if i == 1:
        target = browser.find_elements(By.CSS_SELECTOR, "img.n3VNCb")[0]
    else:
        target = browser.find_elements(By.CSS_SELECTOR, "img.n3VNCb")[1]
    img_src = target.get_attribute("src")
 
위와 같은 코딩을 추가했습니다.
 
1. 2번째 사진부터 작은 사진이 받아지는 문제는 해결됨
 
2.. 강의 영상에 나오는 오류해결 방법을 모두 해봤지만,
2번째 사진 이후, 3번째사진부터는 다운로드가 되지 않음
 
3. 오류는 아래와 같이 발생
Traceback (most recent call last): File "C:\Users\rnrxh\AppData\Local\Programs\Python\Python310\lib\urllib\request.py", line 1348, in do_open h.request(req.get_method(), req.selector, req.data, headers, File "C:\Users\rnrxh\AppData\Local\Programs\Python\Python310\lib\http\client.py", line 1282, in request self._send_request(method, url, body, headers, encode_chunked) File "C:\Users\rnrxh\AppData\Local\Programs\Python\Python310\lib\http\client.py", line 1328, in _send_request self.endheaders(body, encode_chunked=encode_chunked) File "C:\Users\rnrxh\AppData\Local\Programs\Python\Python310\lib\http\client.py", line 1277, in endheaders self._send_output(message_body, encode_chunked=encode_chunked) File "C:\Users\rnrxh\AppData\Local\Programs\Python\Python310\lib\http\client.py", line 1037, in _send_output self.send(msg) File "C:\Users\rnrxh\AppData\Local\Programs\Python\Python310\lib\http\client.py", line 975, in send self.connect() File "C:\Users\rnrxh\AppData\Local\Programs\Python\Python310\lib\http\client.py", line 1454, in connect self.sock = self._context.wrap_socket(self.sock, File "C:\Users\rnrxh\AppData\Local\Programs\Python\Python310\lib\ssl.py", line 513, in wrap_socket return self.sslsocket_class._create( File "C:\Users\rnrxh\AppData\Local\Programs\Python\Python310\lib\ssl.py", line 1071, in _create self.do_handshake() File "C:\Users\rnrxh\AppData\Local\Programs\Python\Python310\lib\ssl.py", line 1342, in do_handshake self._sslobj.do_handshake() ssl.SSLError: [SSL: WRONG_SIGNATURE_TYPE] wrong signature type (_ssl.c:997) During handling of the above exception, another exception occurred: Traceback (most recent call last): File "<stdin>", line 15, in <module> File "C:\Users\rnrxh\AppData\Local\Programs\Python\Python310\lib\urllib\request.py", line 241, in urlretrieve with contextlib.closing(urlopen(url, data)) as fp: File "C:\Users\rnrxh\AppData\Local\Programs\Python\Python310\lib\urllib\request.py", line 216, in urlopen return opener.open(url, data, timeout) File "C:\Users\rnrxh\AppData\Local\Programs\Python\Python310\lib\urllib\request.py", line 519, in open response = self._open(req, data) File "C:\Users\rnrxh\AppData\Local\Programs\Python\Python310\lib\urllib\request.py", line 536, in _open result = self._call_chain(self.handle_open, protocol, protocol + File "C:\Users\rnrxh\AppData\Local\Programs\Python\Python310\lib\urllib\request.py", line 496, in _call_chain result = func(*args) File "C:\Users\rnrxh\AppData\Local\Programs\Python\Python310\lib\urllib\request.py", line 1391, in https_open return self.do_open(http.client.HTTPSConnection, req, File "C:\Users\rnrxh\AppData\Local\Programs\Python\Python310\lib\urllib\request.py", line 1351, in do_open raise URLError(err) urllib.error.URLError: <urlopen error [SSL: WRONG_SIGNATURE_TYPE] wrong signature type (_ssl.c:997)> >>>
 
 
# 구글이미지+큰거 다운로드
import imp
from lib2to3.pgen2 import driver
from tkinter import BROWSE
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 time
import os
import urllib.request # url 이미지 다운로드 라이브러리
import pyautogui

# 크롬 드라이버 자동 업데이트
from webdriver_manager.chrome import ChromeDriverManager

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

# 불필요한 에러 메시지 삭제
chrome_options.add_experimental_option("excludeSwitches", ["enable-logging"])

# 셀레니움으로 웹브라우저 자동으로 띄우기
# ChromeDriverManager를 통해서 ChromeDriver를 설치하고, Service라는 객체를 만든 뒤, service라는 변수에 저장한다
service = Service(executable_path=ChromeDriverManager().install())
browser = webdriver.Chrome(service=service, options=chrome_options)

if not os.path.exists("파이썬/고양이"):
    os.mkdir("파이썬/고양이")  

url = "https://www.google.com/search?q=%EA%B3%A0%EC%96%91%EC%9D%B4&prmd=ivsn&sxsrf=ALiCzsZMlAb_fB1ieepQcfla0HAFPCSjlQ:1658683173264&source=lnms&tbm=isch&sa=X&ved=2ahUKEwjD-diqhJL5AhUE-2EKHVGcChoQ_AUoAXoECAIQAQ&biw=819&bih=862&dpr=2"
browser.implicitly_wait(10)
browser.maximize_window()
browser.get(url)

# 무한 스크롤: 동적 사이트에서 자동으로 스크롤을 가장 아래까지 내려주는 알고리즘
# 스크롤을 내리기 전 기본이 되는 높이를 설정
before_h = browser.execute_script('return window.scrollY')

while True:
    # 맨 아래로 스크롤을 내린다.
    browser.find_element(By.CSS_SELECTOR, 'body').send_keys(Keys.END) # 대부분의 웹페이지는 body 태그가 다 있다. 이걸 이용하고, END를 통해 맨 아래까지 스크롤 내림
    # 너무 빠르면 오류가 생기니까 스크롤 사이에 페이지 로딩 시간을 주자.
    time.sleep(1)
    # 스크롤 후 높이
    after_h = browser.execute_script('return window.scrollY')

    if after_h == before_h:
        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.n3VNCb")[0]
    else:
        target = browser.find_elements(By.CSS_SELECTOR, "img.n3VNCb")[1]
    img_src = target.get_attribute("src")
   
    # HTTP Error 403: Forbidden
    opener = urllib.request.build_opener()
    opener.addheaders = [("User-Agent", "Mozila/5.0")]
    urllib.request.install_opener(opener)

    # 이미지 다운로드
    urllib.request.urlretrieve(img_src, f"파이썬/고양이/{i}.jpg")
 
 
 
 
 
 
 
 
 
 
 
 
 
 

답변 1

0

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

urllib.error.URLError: <urlopen error [SSL: WRONG_SIGNATURE_TYPE] wrong signature type (_ssl.c:997)

오류는

 

이미지가 있는 사이트에서 크롤링하지 못하도록

방지해놓은 것으로 판단 됩니다.

 

try - except 문으로 이미지 다운로드 하는 부분만 묶어 주세요. 오류가 나는 이미지를 제외하고 가져오게 됩니다. 

 

# 이미지 다운로드
    try:
        urllib.request.urlretrieve(img_src, f"고양이/{i}.jpg")
    except:
        pass

 

최지훈님의 프로필 이미지
최지훈

작성한 질문수

질문하기