본문 바로가기
  • 이웃집 찰스
파이썬

티스토리 백업 파이썬 코드

by 리뷰하는 김과장 2023. 6. 12.

티스토리 관리자 메뉴에서  블로그 , 데이터관리에 들어가시면 백업메뉴가 나옵니다. 이것을 이용해서 백업해보니 시간은 좀 걸리지만 백업파일이 생성되고 이것을 다운로드 받게되면 완벽하게 백업이되는것을 확인하였습니다. 블로그가 1개나 2개 정도일때는 이방법으로 백업하면 좋을것 같다는 생각이 듭니다.

 

 

 

 

1. 티스토리 백업 파이썬 코드를 만든 이유

 

최근 파이썬 코드를 만지는것이 재미있기도 했고 티스토리에서 제공하는 백업기능이 저에게는 조금 번거롭기도 했습니다. 저의 티스토리는 좀 많기 때문입니다. 하나하나 일일이 백업하고 다운로드 하고 하는것이 너무 귀찮았습니다. 그리고 포스팅을 또 하게되면 업데이트된 목록만 백업하는것이 아니라 처음부터 다시 백업하기 때문이 이것도 비효율적인것 같았습니다. 그래서 직접 파이썬 코드를 만들어보게 되었습니다. 이렇게 백업하는 코드를 짜면서 공부한 내용을 가지고 구글블로그 또는 워드프레스에 복원하는것도 쉽게 가능하지 않을까 하는 생각도 하게 되었습니다. 사실 정말 많은 공부가 된건 사실입니다.

 

 

 

2. 티스토리 백업  계획설정

 

어떤씩으로 코드를 짤지 먼저 계획을 설정하였습니다.

 

1) 여러개의 블로그 주소가 저장된 텍스트 파일을 읽어서 반복문으로 돌리자.

2)  사이트 맵을 이용해서 블로그 포스팅 url 주소를 추출하자

3)  티스토리에 업로드된 이미지url 주소가 있는 방식으로 html 작성한후 파일을 첫번째로 저장

(이 파일이 필요할수도 있을것 같은 생각이 들기도 합니다.)

4)  이미지를 다운로드한후 다운로드한 이미지의 상대경로를 이용해서 html 을 작성한후 두번째로 저장

(티스토리 백업기능을 이용하면 이런 방식으로 백업이 되었답니다.)

5) 이미 만들어진 폴더가 있을경우 백업을 건너뛰도록 설계 (백업시간 단축)

6) 본문내용 제일 상단에 포스팅 제목과 카테고리명을 입력하기

7) 각각의 티스토리는 스킨이 다르기 때문에 모두 모바일주소에서 크롤링 하도록 함

(모바일주소는 /m 을 추가하면 되죠. 이렇게 해줌으로써 모든 블로그는 동일한 스킨이 되었습니다.)

 

 

 

 

 

3. 티스토리 백업 파이썬 코드

 

전체 코드는 아래와 같습니다. 주석이 있기 때문에 어려운것은 없을것 같습니다. 

파이썬 초보가 인터넷 검색해가며 짠 코드이기 때문에 코드가 복잡하고 지저분할수가 있습니다. 참고하세요.

막히는 부분을 결정적으로 챗지피티가 해결해 주어서 수월하게 작업할수가 있었네요.

 

import requests
from bs4 import BeautifulSoup
import os
import sys
import urllib.request
import advertools as adv #pip install advertools
import re
import time

f = open("D:/티스토리_백업/url.txt", "r")

list = []
while True:  #txt 파일을 열어서 한줄씩 리스트에 담기
    line = f.readline().strip()
    if not line: break
    list.append(line)

# srcset 속성을 삭제하는 함수
def remove_srcset(source):
    pattern1 = r'srcset="(.*?)"'    
    source = re.sub(pattern1, "", source)
    pattern2 = r'onerror="(.*?)"'   
    source = re.sub(pattern2, "", source)
    pattern3 = r'data-filename="(.*?)"'   
    source = re.sub(pattern3, "", source)
    pattern4 = r'data-origin-height="(.*?)"'   
    source = re.sub(pattern4, "", source)
    pattern5 = r'data-origin-width="(.*?)"'   
    result = re.sub(pattern5, "", source)   
    return result    

for ur in list:  #여러개의 사이트를 하나씩 백업하기

    urlfd=ur.replace("https://","").replace("http://","").replace("/","").replace(".","_")
    urlfd=f'D:/티스토리_백업/{urlfd}'
    if not os.path.exists(urlfd): #사이트이름으로 폴더생성 
                os.makedirs(urlfd)

    ur2 = ur.replace("http://","").replace("https://","")

    sitemap_urls = adv.sitemap_to_df(f'https://{ur2}/sitemap.xml') 
    s_urls = sitemap_urls["loc"].to_list()  #사이트맵 URL 만 추출해서 리스트에 담기
    url2=f'https://{ur2[:-1]}'  #불필요한 url 
    category=f'https://{ur2}category' #불필요한 url 
    tag=f'https://{ur2}tag' #불필요한 url 
    guestbook=f'https://{ur2}guestbook' #불필요한 url 

    for url in s_urls: 
        time.sleep(0.05)  
        if (url== url2)or(url.startswith(category))or(url== tag)or(url== guestbook): 
            print("제외합니다") #불필요한 url 제거
        else:      
            
            urllist=url.split("com/")
            url=urllist[0]+"com/m/"+urllist[1]
            print(url)
            path = urlfd+"/"+urllist[1]
            path2 = urlfd+"/"+urllist[1]+"/img"
            if not os.path.exists(path):
                os.makedirs(path) #폴더생성
                os.makedirs(path2) #폴더생성             
                res=requests.get(url)        
                res.raise_for_status
                soup = BeautifulSoup(res.text,"lxml")
                datas=soup.find("div",attrs={"class":"blogview_content useless_p_margin editor_ke"}) #내용추출
                keyword=soup.find("h2",attrs={"class":"screen_out"}).text #제목추출
                try:
                    category2=soup.find("span",attrs={"class":"inner_g"}).text #카테고리 추출 
                    category2=f'카테고리 : {category2} '    
                except Exception as e: 
                    print('카테고리 크롤링 에러', e)                       
                    category2="카테고리 : 없음"                  
                
				html=str(datas)
                key=keyword.rstrip() #제목에서 우측공백제거
                key=key.replace(" ","-") #제목에서 공백변경
                key=re.sub(r"[^\uAC00-\uD7A30-9a-zA-Z\s]", "", key) #제목에서 특수문자 제거



                html=f'<h1>{keyword}</h1><p>{category2}</p><hr>{html}' #본문내용에 제목과 카테고리 추가
                adress3 = path+'/'+key+".html" #htnl 파일 저장 경로 결정
                with open(adress3,"w", encoding = "utf8") as f:
                    f.write(html)


                try:         
                    imgs=soup.find("div",attrs={"class":"blogview_content useless_p_margin editor_ke"}).find_all("img") #이미지추출용
                    k=1
                    for img in imgs:
                        time.sleep(0.05)
                        print("="*100)    
                        src=img["src"]
                        ext=os.path.splitext(src)[1] #확장자 구하기
                        filename = f'{key}_{k}{ext}' #파일이름
                        print(filename)
                        saveUrl = path2+'/'+filename #저장 경로 결정
                        saveUrl2 ='./img/'+filename #이미지 상대경로
                        html=html.replace(src,saveUrl2) #html 이미지 url 상대경로로 변경
                                             
                        
                        print(saveUrl)
                        k=k+1
                        req = urllib.request.Request(src, headers={'User-Agent': 'Mozilla/5.0'})
                        try:
                            imgUrl = urllib.request.urlopen(req).read() #웹 페이지 상의 이미지를 불러옴
                            with open(saveUrl,"wb") as f: #디렉토리 오픈
                                f.write(imgUrl) #파일 저장        
                        except urllib.error.HTTPError:
                            print('에러')
                            sys.exit(0)
                except Exception as e:    
                    print('이미지 저장 에러', e)                
                  
                html = remove_srcset(html) # srcset 속성을 삭제 
                adress4 = path+'/'+key+"_2.html" #htnl 파일 저장 경로 결정
                with open(adress4,"w", encoding = "utf8") as f:
                    f.write(html)

 

 

 

 

4. 티스토리 백업 파이썬 코드 설명

 

폴더주소나 파일주소 같은것은 여러분의 환경에 맞게 수정해야 하며 url.txt 파일을 만들어서 

백업할 티스토리 사이트 주소를 한줄씩 넣으신후 저장하시면 됩니다.

예를 든다면 아래와 같이 입력하시고 저장하시면 됩니다.

 

https://1.alltopx.com/

https://2.alltopx.com/

https://3.alltopx.com/

https://4.alltopx.com/

https://5.alltopx.com/

https://6.alltopx.com/

https://7.alltopx.com/

 

티스토리가 하나라면 하나만 적으시면 되겠죠.

 

반복문 중간중간에 time.sleep(0.05) 라는 딜레이를 주었습니다. 컴퓨터 사양에 따라 더 작게 줄수도 있고 더 많이 줘야 할수도 있습니다. 아예 안주고 하니 잘하다가 에러가 발생하더군요. 딜레이 시간을 적절히 줘야 에러가 없습니다. 너무 많이 주게 되면 백업시간이 너무 길어지게 되니 유념하시기 바랍니다.

 

pip install advertools

 

아마 advertools 라이브러리는 설치가 안되어 있을겁니다. 사이트맵에서 url 을 추출해주는 라이브러리 입니다. 위 명령어를 복사해서 설치하시기 바랍니다.

 

 

 

파이썬 코드를 실행하게 되면 사이트 주소의 폴더가  먼저 생성이 됩니다.

 

 

 

 

 

 

그리고 각 포스팅 url 이름의 폴더가 각각 생성이 됩니다.

 

그 폴더에 들어가게 되면 html 파일이 2가지 있으며 이미지 폴더가 하나 있습니다.

html 파일은 이미지 주소가 원본그대로 인것과 다운로드한 이미지의 상대주소가 있는 파일 이렇게 두가지 입니다. 필요에 따라 두가지중 하나를 선택해서 사용하면 될것입니다.

 

 

 

이미지 폴더에 들어가면 이미지들이 저장되어 있습니다.

 

이 방법으로 한번 백업하고나니 시간이 지난후 추가된 포스팅을 백업할때는 시간이 얼마 걸리지 않았습니다.

 

 

 

이렇게 해서 티스토리 블로그를 파이썬을 이용해서 백업하는 방법을 알아보았습니다. 티스토리 블로그를 파이썬을 이용해서 백업하는 방법에 대해 궁금하셨던분들에게는 좋은 정보가 되었을듯합니다. 다음에는 더욱 유용한 정보로 찾아올것을 약속드리며 이번 포스팅은 여기까지 하도록 하겠습니다. 오늘도 행복한 하루 되세요~ ^^

 

 

 

댓글