워드프레스 블로그 포스트 제목 URL 추출하기(feat. Python & WordPress)

워드프레스 블로그를 운영하다보면 지금까지 작성한 포스트 제목 URL 추출 한번쯤 고민해 보시지 않으셨나요?

내가 얼마나 글을 썼는지도 궁금하기도 하고, 퍼머링크 등 포스트를 수정하게 되면 구글 서치콘솔과 같은 곳에서 url검사 메뉴를 통해 포스트 주소를 다시 등록도 해야 하니까요.

이번 포스트에서는 파이썬 스크립트를 이용하여 포스트의 제목과 URL을 자동으로 추출하여 엑셀 파일로 저장하는 방법을 알려드릴려고 해요. 아래 내용을 보시면서 천천히 따라 해보세요.

VS code 설치 및 사용 적응하기

우선, 파이썬 스크립트를 작성하고 실행을 위해서 VS code를 설치를 하도록 하겠습니다. VS CODE 설치 – 윈도우 기준 포스트를 통해서 따라 해보시기 바랍니다.

VS code 사용이 처음이신 분은 살짝 적응을 위해 아래의 포스트를 읽어보시고 한번씩 실행해보시기 바랍니다.

파이썬 소스코드 및 실행하기

파이썬 소스코드 수정사항

아래의 코드를 복사해서 VS code에 붙혀넣기 하고 실행하기만 하시면 됩니다. 다만, 바로 아래 부분의 주소(볼드체)만 본인의 것으로 바꾸면 됩니다.

# 예시 사용 (secondlife.lol)
api_endpoint = ‘https://secondlife.lol/wp-json/wp/v2′

import requests
import json
from openpyxl import Workbook
import time

def get_all_wordpress_posts(api_endpoint, auth=None):
    headers = {'Accept': 'application/json'}
    if auth:
        headers['Authorization'] = auth

    posts = []
    page = 1
    per_page = 10 

    while True:
        try:
            response = requests.get(f"{api_endpoint}/posts?page={page}&per_page={per_page}", headers=headers)
            response.raise_for_status()

            page_posts = json.loads(response.content)
            if not page_posts:
                print(f"모든 페이지를 처리했습니다. 총 {len(posts)}개의 포스트를 가져왔습니다.")
                break

            posts.extend(page_posts)
            page += 1
            print(f"페이지 {page-1} 처리 완료. 총 {len(posts)}개의 포스트 가져옴.")

            time.sleep(1)  # 각 요청 사이에 1초 대기

        except requests.exceptions.HTTPError as e:
            if response.status_code == 400 and "rest_post_invalid_page_number" in response.text:
                print(f"페이지 {page}는 유효하지 않습니다. 총 {len(posts)}개의 포스트를 가져왔습니다.")
            else:
                print(f"HTTP 오류 발생: {e}")
                print(f"응답 내용: {response.text}")
            break
        except Exception as e:
            print(f"예외 발생: {e}")
            break

    return posts

def save_to_excel(posts, filename="post_info.xlsx"):
    wb = Workbook()
    ws = wb.active
    ws.append(["Title", "URL"])  # 헤더 추가

    for post in posts:
        ws.append([post['title']['rendered'], post['link']])

    wb.save(filename)
    print(f"{filename} 파일에 {len(posts)}개의 포스트 정보 저장 완료.")

# 예시 사용 (secondlife.lol)
api_endpoint = 'https://secondlife.lol/wp-json/wp/v2'
auth = 'Basic <base64 encoded username:password>'

print("포스트 가져오기 시작...")
posts = get_all_wordpress_posts(api_endpoint, auth)
print(f"총 {len(posts)}개의 포스트를 가져왔습니다.")

if posts:
    save_to_excel(posts)
else:
    print("가져온 포스트가 없습니다.")

워드프레스 블로그 포스트 제목 URL 추출 실행결과

위 코드에서는 실행하면 페이지네이션으로 구분된 페이지를 기준으로 반복하면서 모든 포스트 정보를 가져옵니다. 그리고 아래와 같이 순차적으로 진행된 내용을 보여줍니다. 그리고 마지막으로 post_info.xlsx 파일이 생성됩니다.

워드프레스 블로그 포스트 제목 URL 추출 과정과 결과
워드프레스 블로그 포스트 제목 URL 추출 결과
워드프레스 블로그 포스트 제목 URL 추출 결과

유의할 사항이 있다면 소스코드 파일(post_list_url_r1.2.py)이 있는 폴더에 포스트 정보파일(post_info.xlsx)가 생성됩니다. 그래서 웹에서 자료를 다운로드하는 것처럼 관성적으로 다운로드 폴더 같은 곳에서 생성된 결과 파일을 찾으시면 안됩니다.

정리하기

이번 포스트에서는 Python을 사용하여 WordPress API와 상호작용하고, 워드프레스 블로그 포스트 제목 추출, URL 추출을 통해 엑셀 파일로 저장하는 방법을 설명했습니다.

이상의 과정을 통해 여러분은 블로그 운영하실 때 관리차원의 조그마한 툴을 확보했다고 생각합니다.

이 포스트를 기반으로 다음번 포스트에서는 구글 서치콘솔과 같은 곳에 자동으로 블로그 포스트 URL을 등록하는 방법을 공유해보도록 하겠습니다.(본 포스트에 내용을 담아보려고 트라이를 해보았는데 쉬운 작업이 아닌거 같습니다.)

secondlife.lol과 함께 더욱 스마트한 블로깅 하시기를 바랍니다.

참고로, Export All URLs이라는 플러그인이 있어서 이걸 사용하셔도 될 것 같습니다.

#소스코드 해석

소스코드 및 주요 코멘트

import requests
import json
from openpyxl import Workbook
import time

def get_all_wordpress_posts(api_endpoint, auth=None):
    """페이지네이션을 처리하여 모든 워드프레스 포스트를 가져오는 함수"""

    # API 요청 시 필요한 헤더 설정
    headers = {'Accept': 'application/json'}
    if auth:
        headers['Authorization'] = auth

    posts = []  # 모든 포스트를 저장할 리스트
    page = 1  # 초기 페이지 번호
    per_page = 10  # 한 번에 가져올 포스트 수를 10으로 설정

    while True:
        try:
            # API 엔드포인트에 요청을 보내서 페이지별 포스트를 가져옴
            response = requests.get(f"{api_endpoint}/posts?page={page}&per_page={per_page}", headers=headers)
            response.raise_for_status()  # 요청이 성공하지 않으면 예외 발생

            # 응답 데이터를 JSON 형식으로 변환
            page_posts = json.loads(response.content)
            if not page_posts:
                break  # 더 이상 포스트가 없으면 반복문 종료

            # 가져온 포스트를 리스트에 추가
            posts.extend(page_posts)
            page += 1  # 다음 페이지로 이동
            print(f"페이지 {page-1} 처리 완료. 총 {len(posts)}개의 포스트 가져옴.")

            time.sleep(1)  # 각 요청 사이에 1초 대기 (서버에 부담을 줄이기 위함)

        except requests.exceptions.HTTPError as e:
            # HTTP 오류가 발생했을 때의 처리
            print(f"HTTP 오류 발생: {e}")
            print(f"응답 내용: {response.text}")
            break
        except Exception as e:
            # 기타 예외 발생 시의 처리
            print(f"예외 발생: {e}")
            break

    return posts  # 모든 포스트 반환

def save_to_excel(posts, filename="post_info.xlsx"):
    """포스트 제목과 URL을 엑셀 파일에 저장하는 함수"""

    wb = Workbook()  # 새 엑셀 워크북 생성
    ws = wb.active  # 활성 워크시트 선택
    ws.append(["Title", "URL"])  # 첫 번째 행에 헤더 추가

    for post in posts:
        # 각 포스트의 제목과 URL을 엑셀 파일에 추가
        ws.append([post['title']['rendered'], post['link']])

    wb.save(filename)  # 엑셀 파일 저장
    print(f"{filename} 파일에 {len(posts)}개의 포스트 정보 저장 완료.")

# 예시 사용 (secondlife.lol)
api_endpoint = 'https://secondlife.lol/wp-json/wp/v2'  # WordPress API 엔드포인트
auth = 'Basic <base64 encoded username:password>'  # 필요한 경우 인증 정보 추가 (Base64로 인코딩된 사용자명:비밀번호)

print("포스트 가져오기 시작...")
posts = get_all_wordpress_posts(api_endpoint, auth)  # 포스트 가져오기 함수 호출
print(f"총 {len(posts)}개의 포스트를 가져왔습니다.")

if posts:
    save_to_excel(posts)  # 포스트가 있으면 엑셀 파일에 저장
else:
    print("가져온 포스트가 없습니다.")  # 포스트가 없으면 메시지 출력

상세 주석 설명

  1. 모듈 임포트
    • requests: HTTP 요청을 보내기 위한 모듈.
    • json: JSON 데이터를 처리하기 위한 모듈.
    • openpyxl: 엑셀 파일을 다루기 위한 모듈.
    • time: 시간 관련 기능을 사용하기 위한 모듈.
  2. get_all_wordpress_posts 함수
    • api_endpointauth를 인자로 받아 WordPress API를 통해 모든 포스트를 가져오는 함수.
  3. 헤더 설정
    • headers = {'Accept': 'application/json'}: JSON 형식으로 응답을 받기 위한 헤더 설정.
    • if auth:: 인증 정보가 있으면 헤더에 추가.
  4. 포스트 데이터를 저장할 리스트와 페이지 설정
    • posts = []: 포스트를 저장할 빈 리스트.
    • page = 1: 초기 페이지 번호.
    • per_page = 10: 한 번에 가져올 포스트 수.
  5. 반복문을 통한 API 요청
    • while True:: 무한 루프로 페이지별로 포스트를 가져옴.
    • response = requests.get(...): API 엔드포인트에 요청을 보냄.
    • response.raise_for_status(): 요청이 실패하면 예외를 발생시킴.
    • page_posts = json.loads(response.content): 응답 데이터를 JSON 형식으로 변환.
    • if not page_posts:: 더 이상 포스트가 없으면 반복문 종료.
    • posts.extend(page_posts): 가져온 포스트를 리스트에 추가.
    • page += 1: 다음 페이지로 이동.
    • time.sleep(1): 각 요청 사이에 1초 대기.
  6. 예외 처리
    • except requests.exceptions.HTTPError as e:: HTTP 오류가 발생했을 때의 처리.
    • except Exception as e:: 기타 예외 발생 시의 처리.
  7. 포스트 데이터를 반환
    • return posts: 모든 포스트 데이터를 반환.
  8. save_to_excel 함수
    • postsfilename을 인자로 받아 포스트 데이터를 엑셀 파일로 저장하는 함수.
  9. 엑셀 파일 생성 및 데이터 저장
    • wb = Workbook(): 새 엑셀 워크북 생성.
    • ws = wb.active: 활성 워크시트 선택.
    • ws.append(["Title", "URL"]): 첫 번째 행에 헤더 추가.
    • for post in posts:: 각 포스트의 제목과 URL을 엑셀 파일에 추가.
    • wb.save(filename): 엑셀 파일 저장.
  10. 메인 코드
    • api_endpoint = 'https://secondlife.lol/wp-json/wp/v2': WordPress API 엔드포인트 설정.
    • auth = 'Basic <base64 encoded username:password>': 필요한 경우 인증 정보 추가.
    • print("포스트 가져오기 시작..."): 시작 메시지 출력.
    • posts = get_all_wordpress_posts(api_endpoint, auth): 포스트 가져오기 함수 호출.
    • print(f"총 {len(posts)}개의 포스트를 가져왔습니다."): 포스트 개수 출력.
    • if posts: save_to_excel(posts): 포스트가 있으면 엑셀 파일에 저장.
    • else: print("가져온 포스트가 없습니다."): 포스트가 없으면 메시지 출력.

유사한 게시물