본문 바로가기
데이터분석/크롤링

[BeautifulSoup] 사이트에서 이미지 크롤링

by merona99 2022. 5. 22.
반응형

사이트에서 이미지 크롤링하기

 

'그림플렛폼 프로젝트'에서 우리가 구축한 색추출 모델(knn+mean shift clustering)을 시험해보기 위한 그림 샘플을 구함

참고한 크롤링 사이트: https://gurim.com/search-all/ (그림닷컴 - 그림전체보기)

 

그림닷컴

1페이지부터 286번페이지까지 긁어왔는데 총 13,400개의 .jpg 데이터를 확보함

 

 

크롤링 순서

1.  모듈 불러오기

파이썬 기반의 BeautifulSoup: html파일로 크롤링을 진행

크롤링할 주소를 설정해주는 urllib라이브러리도 추가

 

2.  크롤링 할 주소 입력

해당 사이트의 경우 1페이지부터 286번 페이지까지 있어서 두개의 url로 나누고 가운데 숫자가 들어가도록 함

 

3.  크롤링 할 주소 열기 & html 파일 가져오기

.find_all('태그') : 해당 태그에 해당되는 모든 부분을 가져옴 / 여러 데이터가 리스트 형식으로 반환

 

4.  반복을 통해 이미지 하나씩을 설정된 경로에 저장

img의 개수만큼 반복

.attrs['하위속성'] : 태그의 속성중에서 하위태그에 맞는 데이터를 저장

./images 경로에 이미지들을 숫자(n)을 하나씩 증가시키면서 해당 이름으로 저장

 

크롤링한 사이트를 출력해봤을때 이상하게 src태그에 이미지 경로가 있지 않고 data-original속성에 이미지 경로가 있음

src경로는 static/images 형식으로 url이 나오지 않고 장고를 사용한듯 다른 폴더에 있는게 보임

그래서 data-original이 가지고 있는 이미지의 주소값을 가져오기로 결정

 

노랑색: data-original 값

파랑색: src 값

 

중간에 url 데이터에 '/복사본/'과 같은 한글이 들어간 경우가 있어 해당부분은 try(예외처리)로 제외시키고 가져옴

첫 번째 예외처리: img(이미지태그)에서 data-original 옵션이 있는가?

두 번째 예외처리: data-original값(이미지 경로)에 한글이 들어있는가?

 

 

[소스코드]

# 그림닷컴 전체 그림 이미지 크롤링
from ast import excepthandler
from bs4 import BeautifulSoup as bs
from urllib.request import urlopen
from urllib.parse import quote_plus
 
baseUrl = 'https://gurim.com/search-all/?p_sort=1&p_style=0&p_subject=0&p_price=0&p_size_wh=1&p_size=0&p_shape=0&p_color=0&p_num='
tailUrl = '&put-sorting='

n=0
for i in range(1,287):
    url = baseUrl + str(i) + tailUrl
    html = urlopen(url)
    soup = bs(html, "html.parser")
    img = soup.find_all('img')
    for j in img:
        try:
            j.attrs['data-original']
            tmp_url = j.attrs['data-original']
            try:
                with urlopen(tmp_url) as f:
                    print(j.attrs['data-original'])
                    with open('./images/img' + str(n)+'.jpg','wb') as h: # w - write b - binary
                        img = f.read()
                        h.write(img)
                        n+=1
                    
            except:
                continue
        except:
            continue
print("step1 done!!!!!!!!!!!!!!!!!!!!!!!!!!!!")

 

 

[결과]

깔끔하게 13400개의 데이터가 잘 저장되었음!

 

이제 해당 이미지 데이터들로 우리가 여러가지로 구축한 모델에 넣어봐서 색 추출이 잘 되는지 확인해볼 것이다~

 

반응형

댓글