[Anaconda+python] 웹에서 이미지 수집하기, 이미지 크롤링

코딩/python|2020. 3. 18. 23:00

딥러닝 모델을 훈련시키려면 기본적으로 데이터가 많이 필요합니다. 컴퓨터 비전을 위한 딥러닝 모델을 훈련시키려면, 자연스럽게 많은 이미지들이 필요하게 되죠. 만약에 강아지 이미지가 많이 필요하다면 구글이나 네이버와 같은 검색 엔진에서 강아지라고 입력해서 나오는 이미지들을 하나씩 다운로드하는 방식을 취할 수도 있지만, 이런식으로 하나씩 가져오려면 너무나 번거롭습니다.

 

만약에 1,000,000장의 이미지가 필요하다고 생각해볼까요? 손이 매우 빨라서 하나의 이미지를 저장하는데 1초가 걸린다고 해도, 1,000,000초가 걸립니다. 1,000,000초 = 약 16666분 = 약 277시간 = 약 11.5일 동안 이 짓을 해야한다니, 생각하기도 싫죠?ㅎㅎ 개발자들은 대개 이런 상황을 매우 싫어합니다. 그래서 애꿎은 컴퓨터에게 이렇게 말합니다. "사랑스러운 컴퓨터야, 이 작업은 너가 해줘. 너는 나와 달리 쉽게 싫증을 느끼지 않잖아. 너가 매우 잘할 수 있는 일이야. 내가 너가 알아들을 수 있는 말로 적절하게 명령해줄게." 그 후 이 번거로운 작업을 자동으로 해낼 수 있는 코드를 작성하기 시작하죠.

 

참고로 웹상에서 데이터를 수집하는 것을 크롤링(crawling)이라고 하고, 수집하고자 하는 데이터가 이미지라면 이미지 크롤링이라고 부릅니다.    

 

오늘은 네이버에서 강아지 사진들을 크롤링 해보는 예제를 다루도록 하겠습니다. 다음과 같이 네이버 이미지에서 강아지를 검색했을 때 나오는 사진들을 크롤링해보겠습니다. 

 

얘네들 어떻게 가져오지?

 

이를 위해 필요한 파이썬 코드는 다음과 같습니다. 이 코드는 또마님[1]께서 작성하신 것을 토대로 제가 저의 필요에 맞게 살짝 수정한 것입니다. 코드를 실행하시기 전에 크롤링과 관련된 패키지인 beautifulsoup를 미리 설치해주셔야합니다. 다음과 같이 명령해주면 됩니다.

 

>> pip install beautifulsoup4

 

코드에 대해 간략하게 설명드리겠습니다. '검색어'와 '크롤링할 이미지의 갯수'를 입력해주면 images라는 이름의 하위 디렉토리에 img1.jpg, img2.jpg, img3.jpg,... 등의 이름으로 이미지가 저장되는 코드입니다.

 

 

참고로 최대 50개의 이미지만 한번에 크롤링 가능합니다. 그 이유는 네이버에서 이미지를 검색했을 때 한 페이지에 50개의 이미지를 보여주기 때문입니다. 두번째 페이지, 세번째 페이지의 이미지들도 크롤링하고 싶은데 현재로선 방법을 잘 모르겠습니다. 만약 더 많은 강아지 이미지를 크롤링하려면 검색을 "개", "귀여운 강아지" 이런식으로 해서 크롤링하는 것도 하나의 방법이 될 것 같습니다.  

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
from bs4 import BeautifulSoup as bs
from urllib.request import urlopen
from urllib.parse import quote_plus
 
baseUrl = 'https://search.naver.com/search.naver?where=image&sm=tab_jum&query='
plusUrl = input('검색어 입력: '
crawl_num = int(input('크롤링할 갯수 입력(최대 50개): '))
 
url = baseUrl + quote_plus(plusUrl) # 한글 검색 자동 변환
html = urlopen(url)
soup = bs(html, "html.parser")
img = soup.find_all(class_='_img')
 
= 1
for i in img:
    print(n)
    imgUrl = i['data-source']
    with urlopen(imgUrl) as f:
        with open('./images/img' + str(n)+'.jpg','wb') as h: # w - write b - binary
            img = f.read()
            h.write(img)
    n += 1
    if n > crawl_num:
        break
    
    
print('Image Crawling is done.')
cs

 

코드를 실행하면 검색어와 크롤링할 갯수에 대해 순차적으로 묻습니다. 그 물음에 대답해주셔야 합니다. 저는 강아지에 대한 이미지를 40장 크롤링할 것이기 때문에 다음과 같이 답했습니다.

 

 

필요에 맞게 대답하시면 이미지 크롤링을 시작합니다. 크롤링이 완료되면 Image Crawling is done! 이라는 문구를 띄워줍니다.  

 

 

자, images라는 하위 디렉토리 안에 강아지 이미지들이 잘 저장되었는지 확인해보겠습니다. 

 

크롤링 성공!

 

우리가 원하는 대로 40장의 강아지 사진이 크롤링된 것을 확인할 수 있습니다.

 

만약 이 강아지 사진들을 이미지 분류 모델의 훈련에 사용하려면 이 중에 적합하지 않은 이미지들은 지워줘야 합니다. 이건 수동으로 할 수 밖에 없습니다. 이것도 귀찮은 일이죠. 그래서 이미 필요한 이미지와 관련해서 괜찮은 데이터베이스가 있다면, 그것을 찾아서 사용하는 것이 최선입니다. 우리가 크롤링한 강아지의 경우는 이미 누군가 잘 만들어놓은 데이터베이스가 많이 있습니다. 그러나 물론 데이터베이스가 없는 것도 많겠죠. ㅎㅎ 그렇다면 이 포스팅에서 다룬 이미지 크롤링의 방법으로 수집하던가, 무료 이미지 사이트에서 이미지들을 수집하던가, 필요한 이미지들을 돈을 주고 사던가, 정 안되면 나가서 직접 촬영하던가 해야합니다. 크롤링은 때론 위험할 수 있는 것이 어떤 이미지들은 저작권 문제가 걸려있기 때문에 조심하셔야 합니다. 

 

오늘 포스팅은 여기서 마치도록 하겠습니다. 끝까지 읽어주셔서 감사합니다. 코딩과 관련된 글이기 때문에 파이썬 코드 꼭 한번 실행해보세요.^^ 

 

 

<참고자료>

[1] https://ultrakid.tistory.com/13, 브라보 마이라이프, 또마, "파이썬으로 네이버 이미지 크롤링하기 (Image Crawling)"