이미지를 크롤링하여 다운로드 할때 생기는 오류

조회수 1792회

Yes24 사이트에서 책들의 이미지 url을 크롤링하고 이미지를 저장하려고 합니다.

크롤링을 하다 보면 img src.jpg들어가 있는 것도 있고 들어가 있지 않는 것도 있을 때 어떻게 해야 둘다 다운을 받을 수 있나요?

아래와 같은 코드를 사용하였지만 .jpg가 들어가 있지 않은 파일들은 다운받아지다가 .jpg가 들어간 파일이 나오면 에러가 발생하며 중단됩니다.

book_img = soup.find_all('em', {'class': 'imgBdr'})
 img_url = book_img[0].find('img')['src']
 print(img_url)
 b_img_url.append(img_url)  # 이미지 url을 찾아서 리스트에 추가
 if '.jpg' in str(img_url):
  img = img_url
 else:
  img = img_url + '.jpg'
 img_name = book_img[0].find('img')['alt']
 urllib.request.urlretrieve(img, "yes24_2018,2019/" + img_name.replace("/", ",").replace('"', "'").replace(":", "-").replace(">", ")").replace("<", "(").replace("?", "").strip() + '.jpg')  # 이미지를 저장

에러는 다음과 같습니다.

urllib.error.HTTPError: HTTP Error 404: Not Found

  • (•́ ✖ •̀)
    알 수 없는 사용자

1 답변

  • import requests
    from bs4 import BeautifulSoup as bs
    
    def filesave(url):
        try:
            urlsplit = url.split('/')[-1]
            name = 'C:/Users/User/hi/'+urlsplit
            bn = requests.get(url).content
            if bn[0:3] != b'\xff\xd8\xff':
                print('this file is not JPEG file format')
                return 0
            else:
                if 'jpg' not in urlsplit:
                    name += '.jpg'
            f = open(name,'wb')
            f.write(bn)
            f.close()
            print(f'[!] {name} saved')
            return name
        except Exception as e:
            print(e)
            return 0
    
    def imgsrc(url):
        s = bs(requests.get(url).text, 'html.parser')
        img = s.find('div', {'class':'gd_imgArea'})
        if img is not None:
            return img.span.em.img['src']
        else:
            return None
    
    url1 = 'http://www.yes24.com/Product/Goods/58397337'
    url2 = 'http://www.yes24.com/Product/Goods/58412700'
    
    filesave(imgsrc(url1))
    filesave(imgsrc(url2))
    

    참고해주세용 file signature 식별하는건 생략해도 되요.

답변을 하려면 로그인이 필요합니다.

프로그래머스 커뮤니티는 개발자들을 위한 Q&A 서비스입니다. 로그인해야 답변을 작성하실 수 있습니다.

(ಠ_ಠ)
(ಠ‿ಠ)