반응형
티스토리 블로그 워드프레스 이전용 파이썬 스크립트
티스토리 블로그를 워드프레스로 옮길 때 가장 손이 많이 가는 부분이 바로 XML 포맷으로의 변환 작업입니다. 특히 글이 수백~수천 개가 넘어가면 워드프레스가 한 번에 임포트하지 못하고 멈춰 버리기 일쑤인데요, 이를 해결하기 위해 직접 만든 tistory_to_wp.py
스크립트의 개발 과정과 사용법, 그리고 한계점을 정리해 보았습니다.
개발 배경
- 워크플로우 문제
- 티스토리의 Sitemap을 통해 전체 포스트 URL을 가져오고
- 티스토리 블로그 사이트맵 페이지를 여세요. http://당신블로그주소.tistory.com/sitemap.xml
- sitemap.xml 화면에서 마우스 오른쪽 버튼을 눌러서 파일로 저장합니다.
- 각 URL에서 HTML을 크롤링한 뒤
- 워드프레스가 읽을 수 있는 WXR(XML) 포맷으로 변환이 과정을 수작업 또는 GUI 도구로 반복하기에는 글이 많을 때 너무 번거로웠습니다.
- 티스토리의 Sitemap을 통해 전체 포스트 URL을 가져오고
- 분할 임포트 필요
워드프레스에서는 대용량 WXR 파일을 한 번에 임포트하면 메모리 부족이나 타임아웃이 발생합니다. 그래서 100개 단위로 XML을 분할 저장하는 로직을 넣기로 했습니다.
개발 과정
- Sitemap 파싱–
sitemap.xml
에서/entry/
가 포함된 포스트 URL만 뽑아냅니다.
def parse_sitemap(path):
tree = ET.parse(path)
root = tree.getroot()
ns = {'ns': 'http://www.sitemaps.org/schemas/sitemap/0.9'}
return [el.text for el in root.findall('.//ns:loc', ns) if '/entry/' in el.text]
- 본문 크롤링 & 정제– 광고 스크립트,
<iframe>
,<button>
등을 제거해 최소한의 HTML로 정제합니다.
resp = requests.get(url, headers=headers, timeout=10)
soup = BeautifulSoup(resp.text, 'html.parser')
content_html = soup.find('div', class_='contents_style').decode_contents()
cleaned = clean_entry_content(content_html)
- WXR 문서 생성–
<title>
·<dc:creator>
·<guid>
·<wp:…>
태그들을 CDATA로 감싸고, 날짜는YYYY-MM-DD HH:MM:SS
형식으로 맞췄습니다.
ce = etree.SubElement(item, '{http://purl.org/rss/1.0/modules/content/}encoded')
ce.text = etree.CDATA(minified_html)
add(item, '{http://wordpress.org/export/1.2/}post_date', '2024-02-12 21:53:06')
- 100개 단위 분할 저장– 포스트 리스트를 100개씩 잘라서
wordpress_export_final-001.xml
,-002.xml
… 처럼 저장합니다.
prefix, ext = args.output.rsplit('.', 1)
for i in range(0, len(posts), 100):
chunk = posts[i:i+100]
out_file = f"{prefix}-{i//100+1:03d}.{ext}"
build_wxr(chunk, out_file, base_url, start_id=i)
사용법
- 필요한 라이브러리 설치
pip install requests beautifulsoup4 lxml
2 스크립트 실행
- --sitemap
: 티스토리 사이트맵 파일 경로
- --output
: 생성할 WXR 파일의 접두사 및 확장자 지정
python tistory_to_wp.py \
--sitemap sitemap.xml \
--output wordpress_export_final.xml
- 생성된 파일
wordpress_export_final-001.xml
wordpress_export_final-002.xml
…
- 워드프레스 임포트
- 관리자 → 도구 → 가져오기 → WordPress
- 생성된 WXR 파일을 순서대로 업로드
한계점 및 주의사항
- 이미지·미디어는 별도 백업
- 본 스크립트는 본문 HTML만 변환하며, 첨부된 이미지나 미디어 파일 다운로드 기능은 없습니다.
- 대신 티스토리 블로그를 그대로 유지한 채 이용하면 이미지는 티스토리 블로그에 첨부된 이미지를 바라봅니다.
- 다만 이 경우, 워드프레스에서 No Image로 보이지만, 편집에서 블록으로 전환해주고 저장하거나 처음부터 구텐베르크 편집기를 쓰지 않는다면 이미지가 오비니다.
- 페이지 구조 변화에 취약
- 티스토리 스킨 변경 시 CSS 클래스가 달라지면 크롤러가 본문을 못 찾을 수 있습니다.
- 따라서 이 플러그인이 기준으로 삼고 있는 BookClub 스킨으로 변경 후 작업하십시오.
- CCL 설정은 끈 상태로 sitemap.xml을 생성하십시오.
- 댓글·사용자 메타 제외
- 댓글, 태그, 카테고리 매핑 로직은 최소화했습니다. 필요한 경우 추가 개발이 필요합니다.
- 인코딩 문제
- Windows
cp949
콘솔에서는 유니코드 이모지(🛠️ 등) 출력이 깨질 수 있으니, 로그 문구를 단순 텍스트로 조정하세요.
- Windows
- 네트워크·타임아웃
- 대량 크롤링 중 요청 실패가 발생할 수 있습니다.
--timeout
값을 조절하거나, 재시도 로직을 추가하면 안정성이 올라갑니다.
- 대량 크롤링 중 요청 실패가 발생할 수 있습니다.
이제 이 스크립트 한 번으로 수백~수천 개의 티스토리 글을 100개 단위로 나눠 워드프레스에 안정적으로 임포트할 수 있습니다. 필요에 따라 분할 크기(100
)나 메타데이터 처리 방식을 커스터마이즈해 보세요!
반응형
'컴퓨터 인터넷 모바일 it > 블로그 애드센스 등' 카테고리의 다른 글
Rank Math SEO 인스탄트 인덱싱 기능: 네이버 IndexNow도 가능한가? (0) | 2025.05.30 |
---|---|
티스토리 블로그 스킨에서 네이버 크롤링 봇 차단하는 메타태그 (0) | 2025.05.30 |
네이버 서치어드바이저 `<meta name="description">` 누락 오류 해결 (0) | 2025.05.26 |
워드프레스 구글 Site Kit 플러그인 한국어 설정 가이드 (0) | 2025.05.19 |
티스토리에서 워드프레스로 이전하는 방법 완벽 가이드 (0) | 2025.03.31 |
댓글