네이버 블로그를 운영하는 와이프의 글을 티스토리에도 포스팅 하기 위해 프로그램을 만들었다.
글내용이야 드래그를 해서 복사하면 그만이지만 문제는 이미지였다.
그 많은 사진을 언제 다 일일이 다운받을지 막막했는데 검색을 해보니 크롬 확장프로그램, 파이썬 프로그램 등 이미 많은 프로그램이 있었다.
하지만 필요하면 만들어라는 신념하에 내가 직접 만들기로 했다.
가장 어려웠던 부분은 이미지를 다운받을 주소를 크롤링하는 부분이였다.
그 이유는 일반주소로는 이미지가 크롤링이 되지 않았기 때문이다.
다행히 검색으로 크롤링이 되는 대체 블로그 주소를 알아내어 그 주소를 이용했고 결과적으론 크롤링이 잘됐다.
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를 재설치 후 빌드
실행파일
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))
'코딩' 카테고리의 다른 글
파이썬으로 텔레그램 메시지 보내기 (0) | 2022.09.15 |
---|---|
[파이썬] 쿠기 저장해서 사이트 로그인 과정 생략하기 (2) | 2022.02.20 |
[파이썬] 머신런닝을 이용한 자동방지 문자 캡챠 뚫어보기 (42) | 2022.01.24 |
[파이썬] 카카오톡으로 뽐뿌 키워드 알림을 받아보자 (2) | 2022.01.15 |
[파이썬] 네이버 이웃 블로그 자동 공감 버튼 눌러주기 (18) | 2022.01.12 |
댓글 영역