본문 바로가기

프로젝트 목록/ParseWEB

ParseWEB [1-8] 네이버 블로그 게시물 파싱

이번 강좌부터는 새로운 분야의 내용으로 시작합니다. 네이버 블로그 게시물의 내용을 파싱해보도록 하겠습니다.

참고로 이전 강좌였었던 실시간 검색어나 베스트 셀러의 파싱과는 다르게 이번 강좌에서는 잘못 사용하면 법적으로 문제가 될 수 있습니다.

즉 해당 방법을 이용해서 다른 사람이 블로그에 올려놓은 게시물을 그대로 혹은 일부 수정해서 다른 곳에 배포를 하는 등의 행위를 하면 저작권 침해가 될 수도 있습니다.

그렇기 때문에 해당 사항을 명심하고 강좌에 따라와 주시면 감사하겠습니다.


해당 강좌에서는 네이버 블로그팀 공식 블로그에 올라온 공지사항을 파싱해보겠습니다.

사전 정보 수집

앞선 강좌에서도 살펴봤듯이 모바일 환경이 따로 제공되는 사이트라면 되도록 모바일 페이지를 사용해서 파싱을 하는 것이 편리합니다.


파싱하려고 하는 게시물은 아래와 같습니다.

애드포스트 위치 변경과 광고 UI가 개선됩니다!


이번에는 ctrl + F로 찾는 방식이 아닌 다른 방식으로 원하는 내용을 찾아보려고 합니다.

먼저 해당 URL로 이동한 다음 F12로 개발자 도구를 켜줍니다.

그리고 개발자 도구의 상단을 보시면 사각형에 마우스 모양이 있는 부분이 있는데 해당 부분을 클릭하시면 됩니다.

잘 모르시겠으면 아래의 사진에서 빨간색 박스로 표시된 부분을 마우스로 클릭하시면 됩니다.


그리고 마우스를 해당 사이트가 열려있는 화면으로 가져다 대면 아래와 같이 푸른색 반투명 상자가 나오는 것을 볼 수 있습니다.


여기서 우리가 파싱하려고 하는 요소는 게시물의 내용이기 때문에 게시물의 첫 번째 줄인 "안녕하세요. 블로그팀입니다."를 클릭해봅시다.

그러면 태그는 p이고 class 속성으로는 se-text-paragraph를 가지는 것을 확인할 수 있습니다.


해당 요소에서 계속 부모로 거슬러 올라가서 본문의 내용을 모두 포함하는 가장 작은 요소를 찾아봅시다.

이를 만족하는 요소는 태그는 div이고 class 속성으로는 se-main-container를 가진다는 것을 알 수 있습니다.


즉 해당 요소에서 p 태그만 뽑아내서 텍스트만 가지고 올 수 있도록 하면 됩니다.

그리고 게시물에서 이미지가 쓰이고 있는데 해당 부분을 고려해주려면 img 태그도 같이 뽑아내면 됩니다.

이 내용을 기반으로 해서 코드를 작성해보도록 합시다.

구현하기

from bs4 import BeautifulSoup
import requests

def tag_helper(tag):
    if tag.name == 'img':
        # img tag
        return '[IMG]'
    elif tag.name == 'p':
        # p tag
        return tag.get_text()
    else:
        return ''

def get_content():
    url = 'https://m.blog.naver.com/blogpeople/221443570389'
    req = requests.get(url)
    content = req.content

    soup = BeautifulSoup(content, 'html.parser')
    contents = soup.select_one('div.se-main-container')

    result = list(map(tag_helper, contents.find_all(['img', 'p'])))

    return result

contents = get_content()

print(contents)
for item in contents:
    print(item)

시연 결과

아래 이미지와 같이 해당 게시물에 있는 내용을 가지고 오는 것을 볼 수 있습니다.


더 생각해보기

아래 내용은 직접 생각해서 구현을 해보시기 바라며 해당 내용에 대한 답안은 따로 제공하지 않습니다.


  1. 이미지 태그 부분을 '[IMG]'가 아니라 해당 이미지의 주소가 나오도록 수정해봅시다.
  2. 현재 print(contents) 부분의 실행 결과를 보면 중간에 \u200b가 나오는 것을 볼 수 있습니다. 해당 유니코드는 "ZERO WIDTH SPACE"를 의미하는 것으로 해당 부분을 무시하도록 수정해봅시다.
  3. 게시글의 색깔이나 굵기에 대한 정보도 같이 나오도록 한다면 어떻게 해야 할지 생각해봅시다.