Python

[Python] 크롤링(crawling) 사용해보기: Velog 크롤링

dud9902 2025. 1. 10. 23:42

팀원들과 미니 프로젝트 진행하면서 크롤링이 필요하여 처음 사용해보게 되었다.

brunch, naver blog, reddit, tistory, velog, X 를 각자 하나씩 맡아서 크롤링을 진행하기로 했는데 나는 velog를 선택했다.

naver blog 크롤링을 먼저 끝내신분이 있어서 그 팀원의 코드를 사용해서 수정했다.

 

크롤링(crawling)이란?

 웹 페이지의 정보를 자동으로 수집하고 저장하는 작업

 

먼저, 각 플랫폼마다 다르게 실행될수 있도록 crawling_service.py를 따로 만들어서 연결해주었다.

 

from crawling_naver import get_blog_content
from crawling_brunch import get_brunch_content
from crawling_velog import get_velog_content
from summarization_model import process_url
from crawling_tistory import get_tistory_content
from crawling_reddit import get_reddit_content
from crawling_x import get_x_content

def crawlingfromUrl(url: str):
    content = None
    title = None
    tags = None
    crawler = None

    if 'brunch' in url:
        crawler = get_brunch_content 
    if 'naver' in url:
        crawler = get_blog_content
    if 'tistory' in url:
        crawler = get_tistory_content
    if 'velog' in url:
        crawler = get_velog_content
    if 'reddit' in url:
        crawler = get_reddit_content 
    if 'x' in url:
        crawler = get_x_content    

    return process_url(url, crawler)

 

velog를 크롤링 할수있게 벨로그 글 하나를 들어가서 추출하고 싶은 내용의 HTML 태그를 찾아서 코드에 작성했다.

import requests
from bs4 import BeautifulSoup
import re
import emoji

# Velog 게시물의 내용을 크롤링하여 제목, 본문, 태그를 추출하는 함수
def get_velog_content(url):
    """
    주어진 Velog URL에서 게시물의 제목, 본문, 태그를 크롤링하여 반환하는 함수.
    """
    headers = {
        # 웹 크롤링을 위한 User-Agent 설정
        "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36"
    }
    response = requests.get(url, headers=headers)  # URL로 HTTP GET 요청
    if response.status_code == 200:  # 요청 성공 시
        soup = BeautifulSoup(response.text, "html.parser")  # HTML 파싱

        # 제목 추출
        title = soup.find("h1")  # 제목 태그(h1)를 찾음
        title_text = (
            title.get_text(strip=True) if title else "제목을 찾을 수 없습니다."
        )  # 제목 텍스트 추출

        # 본문 추출
        content = soup.find(
            "div", {"class": "sc-bXTejn FTZwa"}
        )  # 본문이 포함된 div를 찾음
        if content:  # 본문이 존재할 경우
            text = " ".join(content.stripped_strings)  # 본문 텍스트 추출 및 공백 제거
            cleaned_text = re.sub(r"\s+", " ", text).strip()  # 중복 공백 제거
            cleaned_text = emoji.replace_emoji(
                cleaned_text, replace=""
            )  # 텍스트에서 이모지 제거
        else:
            cleaned_text = "본문을 찾을 수 없습니다."  # 본문이 없을 경우

        # 태그 추출
        tags = soup.find_all(
            "a", {"class": "sc-dtMgUX gISUXI"}
        )  # 태그가 포함된 a 태그를 찾음
        tag_list = (
            [tag.get_text(strip=True) for tag in tags] if tags else []
        )  # 태그 텍스트 목록 생성

        # 결과 반환
        return {
            "title": title_text,
            "content": cleaned_text,
            "tags": tag_list,
        }
    else:  # 요청 실패 시
        return {
            "error": f"오류 발생: {response.status_code}"
        }

# 직접 실행 시 테스트 코드
if __name__ == "__main__":
    """
    스크립트를 직접 실행할 때, Velog 게시물 URL을 테스트하여 결과를 출력.
    """
    # 테스트용 Velog URL
    velog_url = "테스트용 Velog URL"  
    result = get_velog_content(velog_url)
    print(result)