상세 컨텐츠

본문 제목

주소입력만으로 네이버 블로그 이미지 일괄 저장하기 (feat.파이썬)

코딩

by 땡감 2022. 2. 10. 17:13

본문

반응형

네이버 블로그를 운영하는 와이프의 글을 티스토리에도 포스팅 하기 위해 프로그램을 만들었다.
글내용이야 드래그를 해서 복사하면 그만이지만 문제는 이미지였다.
그 많은 사진을 언제 다 일일이 다운받을지 막막했는데 검색을 해보니 크롬 확장프로그램, 파이썬 프로그램 등 이미 많은 프로그램이 있었다.
하지만 필요하면 만들어라는 신념하에 내가 직접 만들기로 했다.

가장 어려웠던 부분은 이미지를 다운받을 주소를 크롤링하는 부분이였다.
그 이유는 일반주소로는 이미지가 크롤링이 되지 않았기 때문이다.
다행히 검색으로 크롤링이 되는 대체 블로그 주소를 알아내어 그 주소를 이용했고 결과적으론 크롤링이 잘됐다.
input_url 함수를 보면 base_url에 추가로 입력 받은 id와 number를 통해 대체 블로그 주소를 만들었다.

그 다음이야 크게 어려움은 없었고 제목을 따오기 위해서 한글을 추출하는 정규식을 사용했다.
저런 정규식 말고도 유니코드 값으로 정규식을 만드는 내용도 있던데 역시 코딩의 세계에 불가능은 없다.
다음 진행 순서는 이미지링크를 추출 -> 제목을 기반으로 저장폴더를 생성이다.

사진을 저장하는 함수안에서는 추출된 이미지 URL에서 이미지의 확장자까지 확인하고 동일한 확장자로 저장해준다.
gif까지 잘 되는것을 확인했고 동영상은 안된다.

import re
import os
import requests
from bs4 import BeautifulSoup
import urllib


# 블로그 주소 입력 함수
def input_url():
    base_url = 'https://blog.naver.com/PostView.naver?blogId='  # 크롤링을 위한 베이스 주소
    input_url = input('블로그 주소를 입력하세요. 형식은 아래와 같습니다\nhttps://blog.naver.com/아이디/게시글번호\n')
    id = input_url.split('/')[3]  # 아이디 추출
    number = input_url.split('/')[4]  # 게시글번호 추출
    url = base_url + id + '&logNo=' + number
    return url


# 블로그 방문 함수
def visit_blog(url):
    html = requests.get(url).text
    return html


# 블로그 제목 추출 함수
def get_title(html):
    soup = BeautifulSoup(html, 'html.parser')
    contents = str(soup.select('.se-fs-'))  # 제목 추출을 위한 셀렉터
    hangul = re.compile('[^ ㄱ-ㅣ가-힣]+')  # 한글만 따오기 위해
    result = hangul.sub('', contents)
    title = result.strip().split(' ')  # 공백으로 구분
    return title[0]  # 0번째 인덱스가 제목 


#블로그 이미지 추출 함수
def get_img_list(html):
    soup = BeautifulSoup(html, 'html.parser')
    imgs = soup.select('.se-image-resource')
    img_list = list()
    for img in imgs:
        img_list.append(img['data-lazy-src'])  # 큰사진의 경로
    return img_list 


 # 저장경로 생성 함수
def mkdir(title):
    save_dest = 'C:/Users/root/Desktop/'  # 저장을 위한 베이스 경로
    if os.path.isdir(save_dest + title):  # 베이스경로에 제목으로 하위 폴더 생성
        pass
    else:
        os.makedirs(save_dest + title)
    return save_dest + title  


# 이미지 저장 함수
def save_img(img_list, save_dest): 
    for i in range(0, len(img_list), 1): 
        ext_idx = (img_list[i].find('?type')) #확장자 찾기 위해 type 문자열을 먼저 찾고 
        ext = (img_list[i][ext_idx-3:ext_idx]) #위에서 찾은 인덱스에서 -3하여 해당 파일의 확장자 확인 
        urllib.request.urlretrieve(img_list[i], save_dest+'/'+str(i+1)+'.'+ext) 
        return len(img_list) 
      
      
#메인 
if __name__ == '__main__': 
    url = input_url() 
    html = visit_blog(url) 
    title = get_title(html) 
    img_list = get_img_list(html) 
    save_dest = mkdir(title) 
    img_cnt = save_img(img_list, save_dest) 
    print ('{} 제목의 블로그에서 {}개의 이미지를 저장했습니다.'.format(title, img_cnt))

전체 소스코드다.
검색을 해보면 GUI 환경으로 다운로드 과정까지 보여주는 프로그램도 있었지만
그건 효율성이 떨어져보여 이정도로 마무리하려 한다.
이소스를 사용하기 위해서는 mkdir() 함수의 save_dest 변수만 환경에 맞게 바꾸어주면 되지 않을까 싶다.
끝.

PS. 와이프 블로그 주소를 입력후 실제 사진을 다운받아 봤다.


### 2022년 02월 10일 오후 4시44분 추가 내용 ###

  • os.mkdir()을 os.makedirs()로 변경
  • 파이썬에 대해 잘 모르는 분들도 사진 다운이 가능하도록 경로을 입력받는 함수를 추가
  • 실행파일로 배포 (입력받는 인자는 두개로 블로그 주소와 사진저장위치)


### 2022년 02월 11일 오후 2시 50분 추가 내용 ###

  • 첨부파일이 바이러스 파일로 인식되어 pyinstaller를 재설치 후 빌드

 

실행파일

save_img_naver_blog.exe
9.46MB

import os.path
import requests
import re
import urllib.request
from bs4 import BeautifulSoup


#블로그 주소 입력 함수
def input_url():
    base_url = 'https://blog.naver.com/PostView.naver?blogId='  #크롤링을 위한 베이스 주소
    input_url = input('블로그 주소를 입력하세요. 형식은 아래와 같습니다.\nhttps://blog.naver.com/아이디/게시글번호\n')
    id = input_url.split('/')[3]    #아이디 추출
    number = input_url.split('/')[4]    #게시글번호 추출
    url = base_url+id+'&logNo='+number
    return url


#이미지 저장 위치 입력
def input_save_dest():
    save_dest = input('이미지를 저장할 위치를 입력하세요. 형식은 아래와 같습니다.\nC:\\Users\\root\\Pictures\n')
    save_dest = save_dest.replace('\\', '/') #파이썬에서는 디렉토리 구분을 '/'로 인식함
    return save_dest


#블로그 방문 함수
def visit_blog(url):
    html = requests.get(url).text
    return html


#블로그 제목 추출 함수
def get_title(html):
    soup = BeautifulSoup(html, 'html.parser')
    contents = str(soup.select('.se-fs-'))  #제목 추출을 위한 셀렉터
    hangul = re.compile('[^ ㄱ-ㅣ가-힣]+')  #한글만 따오기 위해
    result = hangul.sub('', contents)   
    title = result.strip().split('  ')  #공백으로 구분  
    return title[0] #0번째 인덱스가 제목


#블로그 이미지 추출 함수
def get_img_list(html):
    soup = BeautifulSoup(html, 'html.parser')
    imgs = soup.select('.se-image-resource')
    img_list = list()
    for img in imgs:
        img_list.append(img['data-lazy-src'])   #큰사진의 경로
    return img_list


#저장경로 생성 함수
def mkdir(temp_save_dest, title):
    if os.path.isdir(temp_save_dest+'/'+title):
        pass
    else:
        os.makedirs(temp_save_dest+'/'+title)
    return temp_save_dest+'/'+title


#이미지 저장 함수
def save_img(img_list, save_dest):
    for i in range(0, len(img_list), 1):
        ext_idx = (img_list[i].find('?type'))   #확장자 찾기 위해 type 문자열을 먼저 찾고
        ext = (img_list[i][ext_idx-3:ext_idx])  #위에서 찾은 인덱스에서 -3하여 해당 파일의 확장자 확인
        urllib.request.urlretrieve(img_list[i], save_dest+'/'+str(i+1)+'.'+ext)
    return len(img_list)



#메인
if __name__  == '__main__':
    url = input_url()
    temp_save_dest = input_save_dest()
    html = visit_blog(url)
    title = get_title(html)
    img_list = get_img_list(html)
    save_dest = mkdir(temp_save_dest, title)
    img_cnt = save_img(img_list, save_dest)
    print ('{} 제목의 블로그에서 {}개의 이미지를 저장했습니다.'.format(title, img_cnt))
반응형

관련글 더보기

댓글 영역