본문 바로가기
Information

[Python] BeautifulSoup을 이용한 네이버 블로그 크롤링 - 2

by 정티그로 2021. 5. 23.

지난 시간에 BeautifulSoup을 이용해 네이버 View에 있는 정보(글 제목, URL)를 가져왔다.

 

 

[Python] BeautifulSoup을 이용한 네이버 블로그 크롤링 - 1

뷰티플수프(BeautifulSoup)를 이용해 특정 키워드 검색 후 나온 결과의 네이버 블로그 제목과 URL을 가져올 예정이다. import requests from bs4 import BeautifulSoup from urllib.parse import quote query = "s..

kissi-pro.tistory.com

이번 시간에는 글 제목과 URL 뿐만 아니라, 본문까지 가져오는 코드를 작성해볼 예정이다. 네이버 블로그 본문 스크래핑을 하기 위해서는 먼저 'iframe'태그를 없애야 한다. 그렇지 않으면, 제대로 된 정보를 가져오지 못한다. (왜 그런지 이유는 솔직히 잘 모르겠다.)

 

 

'sk하이닉스'라고 검색하면, 지금 현재 기준(2021. 05. 23) 위 글이 가장 첫 번째로 나온다. 가져온 링크로 크롤링 하려고 할 경우, 제대로 된 값을 가져오지 못한다.

 

개발자 도구를 켜서 확인해본 결과 <iframe>태그가 있는 것을 확인했다. 그리고 src = "/PostView.nhn? ~~" 을 확인할 수 있다. 

 

이 부분이 진짜 글 주소라고 할 수 있는데, 이 주소를 그냥 사용할 수 있는 것은 아니고, 앞부분에 "https://blog.naver.com/"를 붙여줘야 한다. 

 

iframe 안에 있는 src 부분을 가져와 앞 부분에 블로그 주소("https://blog.naver.com/")를 붙여주는 함수를 정의했다.

 

#iframe 제거 후 blog.naver.com 붙이기
def delete_iframe(url):
    headers = {"User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.93 Safari/537.36"}
    res = requests.get(url, headers=headers)
    res.raise_for_status() # 문제시 프로그램 종료
    soup = BeautifulSoup(res.text, "lxml") 

    src_url = "https://blog.naver.com/" + soup.iframe["src"]
    
    return src_url

 

 

다음으로 본문을 가져오는 함수를 작성했다. def text_scraping(url) 이곳에서 들어가는 urldef delete_iframe() 함수에서 반환한 주소(src_url)이다.

 

# 본문 스크래핑
def text_scraping(url):
    headers = {"User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.93 Safari/537.36"}
    res = requests.get(url, headers=headers)
    res.raise_for_status() # 문제시 프로그램 종료
    soup = BeautifulSoup(res.text, "lxml") 

    if soup.find("div", attrs={"class":"se-main-container"}):
        text = soup.find("div", attrs={"class":"se-main-container"}).get_text()
        text = text.replace("\n","") #공백 제거
        print("블로그")
        return text
    else:
        return "확인불가"

 

class 이름이 'se-main-container'인 <div> 태그 안에 본문 내용이 있는 것을 확인할 수 있다. if문을 이용해 해당 이름을 갖고 있는 class가 있는지 확인한 후 그 값이 '참'이라면, 해당 부분의 내용을 긁어온다. replace()함수를 통해 공백을 제거해 텍스트만 가져오도록 했다.

 

위와 같이 코드를 작성할 경우, 스마트에디터로 작성한 글만 가져올 수 있다. 스마트에디터로 작성된 글이 아니라면, 확인 불가 메세지가 나온다.

 

 

import requests
import re #추가
from bs4 import BeautifulSoup
from urllib.parse import quote


for post in posts:

// 앞 부분 생략

    blog_p = re.compile("blog.naver.com")
    blog_m = blog_p.search(post_link)
    
    if blog_m:
        blog_text = text_scraping(delete_iframe(post_link))
        print(blog_text)
        print("-"*50)

 

View 탭에서는 블로그뿐만 아니라, 카페, 네이버포스트도 검색이 된다. 따라서 카페와 네이버 포스트에 대한 예외처리를 해주어야 한다. 아직 이것에 대해 예외처리를 해놓지 않았으므로 정보를 가져올 수 없다.

 

현재는 블로그 글만 가져오도록 코드가 작성되었기 때문에, 정규식을 통해 'blog.naver.com'이 들어간 주소만 크롤링 하도록 만들었다.

 

결론적으로 현재 코드는 네이버 블로그 글이면서 동시에 스마트에디터로 작성된 것만 가져올 수 있다.

 

 

첫 번째 글은 위 사항을 충족하기 때문에, 잘 가져와 지는 것을 볼 수 있다. 정규식과 if문을 통해 카페 글과 네이버 포스트 글도 가져올 수 있도록 개선해야겠다.

 

2021.05.28 - [파이썬] - [Python] BeautifulSoup을 이용한 네이버 블로그 크롤링 - 3

 

[Python] BeautifulSoup을 이용한 네이버 블로그 크롤링 - 3

[Python] BeautifulSoup을 이용한 네이버 블로그 크롤링 - 1 뷰티플수프(BeautifulSoup)를 이용해 특정 키워드 검색 후 나온 결과의 네이버 블로그 제목과 URL을 가져올 예정이다. import requests from bs4 impor..

kissi-pro.tistory.com