정구리의 우주정복

Python 웹크롤링 (Web Crawling) 02. 네이버 이미지 검색결과 다운로드 프로그램 ([​​​​SSL: CERTIFICATE_VERIFY_FAILED] 오류해결) 본문

PYTHON/STUDY

Python 웹크롤링 (Web Crawling) 02. 네이버 이미지 검색결과 다운로드 프로그램 ([​​​​SSL: CERTIFICATE_VERIFY_FAILED] 오류해결)

Jungry_ 2020. 3. 30. 00:39
반응형

참고는 프로그래머 김플 스튜디오 유튜브

 

오늘은 네이버에다 검색어를 검색하면 이미지 검색결과를 자동으로 다운받는걸 만들어볼거다 !

 


과정 (내 생각임)

1. 검색부분 구현 및 html 불러오기

2. html 분석을 통해 이미지 찾기

3. 다운로드하기 (여기서부턴 모르니까 영상참조)


 

1. 검색부분 구현 및 html 불러오기

import urllib.request
from urllib import parse
from bs4 import BeautifulSoup
import ssl

context = ssl._create_unverified_context()

search = input("저장하고 싶은 사진의 검색어 입력 : ")
url = 'https://search.naver.com/search.naver?where=image&sm=tab_jum&query='
newUrl = url+parse.quote_plus(search)

html = urllib.request.urlopen(newUrl,context=context).read()
soup = BeautifulSoup(html,'html.parser')

저번에 했던걸 바탕으로 기본 틀을 먼저 만들었다 (이전 게시글에 자세하게 설명했음 ! )

 

2. html 분석을 통해 이미지 찾기

 

이제 html 을 분석해보자 

 

이미지가 담겨져 있는 태그

<img> 태그 안에 이미지 정보가 담겨진걸 볼 수 있다 

이미지들은 동일하게 class = "_img" 이다 이걸 이용할 수 있지 않을까 !

이미지까지 불러와서 확인해보면 잘 불러와진걸 볼 수 있다


여기서부턴 영상 참고

3. 다운로드 하기 

print() 를 통해 불러온걸 확인

아까 네이버 검색창에선 <img src=" ..." 

에 들어있던게 여기선 data-source="..." 안에 들어 있는걸 확인할 수 있다.

이유는 ?

-코드를 html 로만 짜는게 아니라 js를 이용해서 짜기 때문에 js 를 모두 거친 모습이 <img src="" 인거다 

그래서 크롤링 할때는 출력을 해보면서 하는게 좋다고 합니다 :-)

우리에게 필요한건 data-source ! 

 

import urllib.request
from urllib import parse
from bs4 import BeautifulSoup
import ssl

context = ssl._create_unverified_context()

search = input("저장하고 싶은 사진의 검색어 입력 : ")
url = 'https://search.naver.com/search.naver?where=image&sm=tab_jum&query='
newUrl = url+parse.quote_plus(search)

html = urllib.request.urlopen(newUrl,context=context).read()
soup = BeautifulSoup(html,'html.parser')
img = soup.find_all(class_='_img')


for i in img : 
    print(i['data-source'])
    print()

for 문에서 i['data-source'] 를 출력해보면 잘 가져와진걸 알수있다

 

이제 저장을 해야한다 사실 이부분이 꽃 아닐까 

 

전체 코드 분석

import urllib.request
from urllib import parse
from urllib.request import urlopen
from bs4 import BeautifulSoup
import ssl

context = ssl._create_unverified_context()

search = input("저장하고 싶은 사진의 검색어 입력 : ")
url = 'https://search.naver.com/search.naver?where=image&sm=tab_jum&query='
newUrl = url+parse.quote_plus(search)

html = urllib.request.urlopen(newUrl,context=context).read()
soup = BeautifulSoup(html,'html.parser')
img = soup.find_all(class_='_img')
print("실행!")
n=1 #이름 저장할때 이름 뒤에 붙을거임
for i in img :
    imgUrl=i['data-source']
    with urlopen(imgUrl) as f: #imgUrl 을 open 해서 f 에 부른다 
        with open(search + str(n) +'.jpg','wb') as h :#어떤 이름으로 저장할까 #wb = write 와 이미지이기 때문에 바이너리의 b !!
            img = f.read()
            h.write(img)
    
    n += 1

print("끝 !")

'일단 for 문 부터 살펴보자 

imgUrl 에 이미지가 들어가있는 i[data-source] 를 넣어준다 

 

with as 구문 : 구문이 끝나게 되면 파일을 자동으로 닫아준다 close() 를 할 필요가 없어짐 !

urlopen(imgUrl) 로 이미지를 오픈한걸 f 에 넣어준다

open()  : 파일을 오픈하면서 이름을 정해준다 이름을 search(검색값) + n(몇번째인지) + .jpg 파일 확장자 , 'wb' 는 write 와 

이미지 이기 때문에 바이너리를 불루와주는거다

 

이미지를 읽어주고 다시 write 해준다 !

만약 사진 저장 경로를 지정하고 싶으면 open('파일경로','파일이름','wb') 이렇게 해주면 됨

 

실행하면 내가 원하는 검색어의 네이버 이미지가 다운로드 된다 !! 

만약 갯수를 지정해주고 싶으면 for문 안에 if n<=10 : 이런식으로 조건문을 넣어서 내가 원하는 갯수의 사진을 다운받자 !

 


실행시 

​​

<urlopen error [​​​​SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: unable to get local issuer certificate (_ssl.c:1056)>

 

오류가 발생했을때 (mac에서 발생하는 경우가 있나보다)

finder->application(응용프로그램) -> python3.7(사용하는 버전) -> Install Certificates.command 실행

이렇게 하고나니까 해결이 되었다 !

 

 

나는 이제 사진도 저장할 줄 안다 !

반응형
Comments