AI 및 자동화

티스토리 크롤링 포스팅 제목과 링크 추출 자동화 (Python)

lgvv 2024. 10. 1. 15:48

티스토리 크롤링 포스팅 제목과 링크 추출 자동화 (Python)

 

깃헙에 그동안 블로그에 포스팅한 글들을 정리해두려고 함.

근데 이걸 아래의 형태로 뽑아내고자 하는데, 하나하나 수동으로 옮기는거 매우 귀찮음.

비공개 포스팅을 포함해 포스팅이 654개나 되기 때문!

 

[{포스팅 제목}]({링크})

 

하나하나 옮겼으면, 하루 종일 했을 것 같은데, 구조 분석해서 끝내기까지 20분도 걸리지 않았던 것 같음.

앞으로 두고두고 쓸 것 같아서 포스팅.

 

 

작업 후기

  • 자동화를 통해 결과적으로 시간 단축하는건 좋았는데, 데이터를 변환하기 쉽게 바꿔주는 과정이 오래걸림.
  • Swift 쓰다가 Python 쓰니까 에러가 불친절하게 느껴짐. 조금 더 구체적이었으면 좋겠음.
  • Python 정말 쉬움. 목적에 따라 다르겠지만, 이만한 언어가 없는거 같음.
  • 와 진짜 뿌듯하고 개운하다

 

 

글의 순서

  • 파이썬 크롤링 시작 전 설계 및 고려사항
  • 파이썬 코드
  • 카테고리를 포함해서 추출하는 방법
  • 배열로 변환
  • 최종 결과

 

 

 

파이썬 크롤링 시작 전 설계 및 고려사항

크롤링은 대학 수업 이후에 처음 하게 되는데, 당시에 겪었던 몇가지 문제에 대해서 사전에 정의하고 설계하고자 함.

  • 페이지를 넘기는 동작을 수행할 때, 봇으로 오인해서 파이썬 크롤링이 중단됨.
  • 복잡한 알고리즘 보단 규칙에서 인사이트를 발견해 깔끔하게 처리할 것.

예전에 대한 수업 시간에 모든 태그 구조를 분석하고 등등... 어렵게 접근 했었는데, 시각을 다르게 하면 같은 결과를 얻는데 시간이 매우 차이남을 경험할 수 있었음.

 

내가 필요한건 제목과 링크 뿐.

 

 

파이썬 코드

 

환경은 로컬에서 간단한 처리에 용이한 Jupyter Notebook 사용함.

 


크롤링을 위해 해서 `beautifulsoup4` 설치할 것

pip install requests beautifulsoup4

 

 

실제 필요한 코드를 추출

 

아이디어

  • 포스팅 URL의 규칙이 숫자로 되어 있어서 끝부터 처음까지 반복하면서, 필요한 데이터를 추출함.
import requests
from bs4 import BeautifulSoup

# 시작할 포스팅 번호 (653)부터 끝 번호 (1)까지 반복
for post_number in range(653, 0, -1):
    # 크롤링할 티스토리 포스팅 URL
    url = f'https://rldd.tistory.com/{post_number}'
    
    # 웹페이지 요청
    response = requests.get(url)
    
    # 요청이 성공했는지 확인
    if response.status_code == 200:
        # BeautifulSoup을 사용해 HTML 파싱
        soup = BeautifulSoup(response.content, 'html.parser')
        
        try:
            # 포스팅 제목 추출
            title = soup.find('meta', property='og:title')['content']
            
            # 포스팅 URL 추출
            post_url = soup.find('meta', property='og:url')['content']
            
            # 출력 형식: [제목](링크)
            print(f"[{title}]({post_url})")
        
        except TypeError:
            # meta 태그가 없는 경우 처리
            print(f"Post {post_number}: 제목 또는 URL을 찾을 수 없습니다.")

결과 이미지

 

 

카테고리를 포함해서 추출하는 방법

카테고리를 포함해서 추출

 

import requests
from bs4 import BeautifulSoup

# 결과를 담을 배열
results = []

# 시작할 포스팅 번호 (653)부터 끝 번호 (1)까지 반복
for post_number in range(653, 0, -1):
    # 크롤링할 티스토리 포스팅 URL
    url = f'https://rldd.tistory.com/{post_number}'
    
    # 웹페이지 요청
    response = requests.get(url)
    
    # 요청이 성공했는지 확인
    if response.status_code == 200:
        # BeautifulSoup을 사용해 HTML 파싱
        soup = BeautifulSoup(response.content, 'html.parser')
        
        try:
            # 포스팅 제목 추출
            title = soup.find('meta', property='og:title')['content']
            
            # 포스팅 URL 추출
            post_url = soup.find('meta', property='og:url')['content']
            
            # 카테고리 추출
            category_text = soup.find('strong', class_='tit_category').get_text(strip=True)
            
            # 배열에 결과 추가
            results.append(f" - [{title}]({post_url}) - 카테고리: {category_text}")
        
        except TypeError:
            # meta 태그가 없는 경우 처리
            print(f"Post {post_number}: 제목 또는 URL을 찾을 수 없습니다.")

# 배열 출력
for result in results:
    print(result)

 

 

뒤에 카테고리 나옴

 

배열로 변환

 

결과를 배열로 변환

# 주어진 리스트
posts = results
# "코딩테스트"가 포함된 항목 필터링
filtered_posts = [
    post for post in posts if "카테고리: 코딩테스트" in post
]

# 배열로 반환된 필터링 결과
print(filtered_posts)

 

배열 결과

 

최종 추출

 

# # 주어진 배열 (filtered_posts로 가정)
# filtered_posts = [
#     ' - [[Swift] BOJ 1516 게임 개발](https://rldd.tistory.com/432) - 카테고리: 코딩테스트',
#     ' - [[Swift5 코테 공부 사전설정](https://rldd.tistory.com/154) - 카테고리: 코딩테스트/🧸 Swift 문법',
#     ' - [[프로그래머스] Swift 위장 - 42578](https://rldd.tistory.com/228) - 카테고리: 코딩테스트/🏗️ 자료구조와 알고리즘'
# ]

# 카테고리별로 분리할 리스트들
coding_test_only = []
coding_test_grammar = []
coding_test_algorithm = []

# 데이터 분류
for item in filtered_posts:
    if item.endswith('카테고리: 코딩테스트'):
        coding_test_only.append(item.split('- 카테고리')[0])
    elif item.endswith('카테고리: 코딩테스트/🧸 Swift 문법'):
        coding_test_grammar.append(item.split('- 카테고리')[0])
    elif item.endswith('카테고리: 코딩테스트/🏗️ 자료구조와 알고리즘'):
        coding_test_algorithm.append(item.split('- 카테고리')[0])

# 결과 출력
print("코딩테스트:")
for item in coding_test_only:
    print(item)

print("\n코딩테스트/🧸 Swift 문법:")
for item in coding_test_grammar:
    print(item)

print("\n코딩테스트/🏗️ 자료구조와 알고리즘:")
for item in coding_test_algorithm:
    print(item)

 

추출 완료

'AI 및 자동화' 카테고리의 다른 글

[DL] 신경망 학습  (0) 2024.04.23
[DL] 신경망  (0) 2024.04.17
[DL] 퍼셉트론  (0) 2024.04.17