본문 바로가기
Python

[파이썬] 티스토리 이미지, 텍스트 백업해보기

by 퍼포먼스마케팅코더 2022. 8. 8.
반응형

티스토리도 마찬가지로 여러분들의 양질의 콘텐츠들을 여러분들의 소중한 콘텐츠를 포스팅을 하셨었잖아요. 이런 것을 근데 보시면 아시겠지만 티스토리도 저품질이 빨리 오죠. 펍벤이라고 말도 하던데 구글 에드센스를 이용을 하면 저품질도 얼고 그러지 않습니까 티스토리도 양질의 포스팅을 성심껏 포스팅을 하셨다면 이것도 백업을 반드시 해야 됩니다. 저는 그렇게 믿어요. 백업을 해서 여러분만의 그런 소중한 포스팅을 많이 많이 이렇게 보관을 해놔야 돼요 우리는 티스토리 그거 하나에만 의존을 할 수는 없잖아요. 티스토리는 훌륭한 블로플랫폼입니다. 티스토리가 원래는 백업에 관련됐었던 것을 제공을 했죠. 그런데 이거를 없애버렸습니다. 그게 한 꽤 없앤 지는 됐어요.  한 최소 한 3 4년 정도는 된 것 같은데 백업 했었던 기능 자체를 없애버렸습니다. 이것에 대해서 골머리를 쌓는 분들이 있긴 한데 걱정하지 마십시오 밑에 파이썬 코딩만 돌려버리시면 모든 게 다 해결이 됩니다.

파이썬 티스토리 이미지, 텍스트 백업해보기

먼저 첫 번째 부분이 있는데 이거 첫 번째 부분은 뭐냐면 여러분의 url을 집어넣는 거예요. 여러분의 티스토리의 주소를 집어넣으면 그것에 따라서 포스팅을 가지고 옵니다. 공유 폴더가 열어놓고 여러 번의 포스팅에 숫자만큼 이미지하고 텍스트를 다 백업으로 가지고 올 거예요. 그게 하나가 처음에 있고요 두 번째는 여러분 다른 사람의 url을 집어넣어버리면 그에 걸맞춰서 제목 똑같이 이미지와 텍스트를 가져온 겁니다.

 

import requests
from bs4 import BeautifulSoup
from bs4 import Comment
from PIL import Image
import re
import os


def tistory_backup(post_num):
    for num in range(1, post_num + 1):
        try :
            url = 'https://mvmv3754.tistory.com/' + str(num)
            response = requests.get(url)
            soup = BeautifulSoup(response.text, 'lxml')

            ### 포스팅 글 제목
            titles = soup.select_one('#content > div.inner > div.post-cover > div > h1')

            ### 등록일
            date = soup.select_one('#content > div.inner > div.post-cover > div > span.meta > span.date')

            if not titles or not date:
                continue

            print(titles.text)    
            print(date.text)

            ### 포스팅 내용
            entry_content = soup.find('div', {'class':'entry-content'})
            print(entry_content.get_text())

            res = requests.get(url)
            soup_img = BeautifulSoup(res.content, 'lxml')
            imgs = soup_img.select('img[src^=https]')  # https 로 시작하는 src, '//'로 시작하는 src 제외시킴
            print(f'이미지 수 : {len(imgs)}')
            # print(imgs)

            # 저장 디렉토리 만들기
            if not os.path.exists('tistoryBackup'):
                os.mkdir('tistoryBackup')
            if not os.path.exists('tistoryBackup/post_' + str(num)):
                os.makedirs('tistoryBackup/post_' + str(num))

            cnt = 1
            for img in imgs:
                img_url = img['src']

                ## pillow.Image로 이미지 format 알아내기
                imageObj = Image.open(requests.get(img_url, stream=True).raw)
                img_format = imageObj.format
                imge_size = imageObj.size
                print(f'img_url: {img_url}')
                print(f'img_format: {img_format}')
                print(f'imge_size: {imge_size}')
                print(f'os.path.basename(img_url): {os.path.basename(img_url)}')

                res_img = requests.get(img_url).content
                print(f'len(이미지): {len(res_img)}')  # requests의 .content는 bytes 타입을 리턴함

                if img_url.split('.')[-1] in ['png', 'jpg']:
                    img_name = str(num) + '_' + str(cnt) + '_' + os.path.basename(img_url)
                else:
                    img_name = str(num) + '_' + str(cnt) + '_' + 'no_filename_img.' + img_format

                print(img_name)

                if len(res_img) > 100:  # 이미지 용량이 00 bytes 이상인 것만
                    with open('./tistoryBackup/post_' + str(num) + '/' + img_name, 'wb') as f:
                        f.write(res_img)
                    cnt += 1

            title_content = titles.text + '\n' + date.text +  '\n' + entry_content.get_text()
            filename = str(num) + '_tistory_title_content.txt'
            with open('./tistoryBackup/post_' + str(num) + '/' + filename, 'w', encoding='utf-8') as f:
                f.write(title_content)
        except :
            pass
            
tistory_backup(3) #포스팅 숫자만큼 가져옴

파이썬 티스토리 두번째 이미지, 텍스트 백업해보기

두 번째는 말 그대로 url을 집어넣으면 url에 나오는 텍스트와 이미지를 다 가지고 오는 거고 첫 번째는 주소를 집어넣으면 가지고 오는 거고 그렇게 생각하시면 될 거예요. 한마디로 첫 번째 거는 여러분의 티스토리의 url에 따른 콘텐츠를 가지고 오는 것이고 두 번째는 어떤 여러 분의 티스토리 주수 중에서 특정 url을 가지고 뭔가 가지고 오고 싶다라는 게 있으면 두 번째 걸 사용하시면 됩니다. 편하시죠 이 두 가지를 만들어 놨습니다. 그렇게 크게 달라지거나 이런 거는 없어요. 조금만 코딩만 바꾸셔서 사용해보시면 편하실 거거든요. 그렇게만 사용하시면 될 것 같네요. 어려운 내용이라 그런 거는 전혀 없습니다. 그래서 그런 것만 있다라는 것만 사용만 해주시면 될 것 같습니다.

import requests
from bs4 import BeautifulSoup
from bs4 import Comment
from PIL import Image
import re
import os


#num 수정

def extact_tistory_blog(url):
    try :
        #url = 'https://mvmv3754.tistory.com/3'
        response = requests.get(url)
        soup = BeautifulSoup(response.text, 'lxml')


        titles = soup.select_one('#content > div.inner > div.post-cover > div > h1').text ### 포스팅 글 제목
        special_char = '\/:*?"<>|.'
        for c in special_char:
            if c in titles:
                titles = titles.replace(c, '')  # 특수 문자 제거

        date = soup.select_one('#content > div.inner > div.post-cover > div > span.meta > span.date') ### 등록일

        #if not titles or not date :
        #    continue

        #print(titles.text)    
        #print(date.text)


        ### 포스팅 내용
        entry_content = soup.find('div', {'class':'entry-content'})
        #print(entry_content.get_text())

        res = requests.get(url)
        soup_img = BeautifulSoup(res.content, 'lxml')
        imgs = soup_img.select('img[src^=https]')  # https 로 시작하는 src, '//'로 시작하는 src 제외시킴
        #print(f'이미지 수 : {len(imgs)}')
        #print(imgs)

        # 저장 디렉토리 만들기
        if not os.path.exists('tistoryBackup'):
            os.mkdir('tistoryBackup')
        if not os.path.exists('tistoryBackup/'+str(titles)):
            os.makedirs('tistoryBackup/'+str(titles))

        cnt = 1
        for img in imgs:
            img_url = img['src']

            ## pillow.Image로 이미지 format 알아내기
            imageObj = Image.open(requests.get(img_url, stream=True).raw)
            img_format = imageObj.format
            imge_size = imageObj.size
            #print(f'img_url: {img_url}')
            #print(f'img_format: {img_format}')
            #print(f'imge_size: {imge_size}')
            #print(f'os.path.basename(img_url): {os.path.basename(img_url)}')

            res_img = requests.get(img_url).content
            #print(f'len(이미지): {len(res_img)}')  # requests의 .content는 bytes 타입을 리턴함

            if img_url.split('.')[-1] in ['png', 'jpg']:
                img_name = str(titles) + '_' + str(cnt) + '_' + os.path.basename(img_url)
            else:
                img_name = str(titles) + '_' + str(cnt) + '_' + 'no_filename_img.' + img_format

            #print(img_name)

            if len(res_img) > 100:  # 이미지 용량이 00 bytes 이상인 것만
                with open('./tistoryBackup/' + str(titles) + '/' + img_name, 'wb') as f:
                    f.write(res_img)
                cnt += 1

        title_content = str(titles) + '\n' + date.text +  '\n' + entry_content.get_text()
        filename = str(titles) + '_tistory_title_content.txt'
        with open('./tistoryBackup/' + str(titles) + '/' + filename, 'w', encoding='utf-8') as f:
            f.write(title_content)

        print(str(titles) + "의 이미지, 텍스트 백업이 완료되었습니다.")
    except :
        print("웹페이지가 없습니다.")

 

반응형

댓글