본문 바로가기

문돌이 존버/코딩연습

Python을 이용한 네이버 뉴스 댓글 크롤링

반응형

이 코드는 개인적으로 학습용으로 만든 노트에 불과합니다. seodaeho91님의 블로그와 연세대학교 서중원님의 github를 그대로 참조했습니다. 감사합니다.

import requests
from bs4 import BeautifulSoup 
import pprint
import json
import re
import sys

List = []
url = "https://news.naver.com/main/ranking/read.nhn?mid=etc&sid1=111&rankingType=popular_day&oid=015&aid=0004278747&date=20200124&type=1&rankingSeq=2&rankingSectionId=105"
res = requests.get(url)
res.text

oid = url.split("oid=")[1].split("&")[0]
aid = url.split("aid=")[1]
page = 1

headers = {
    "referer": url,
    "User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.181 Safari/537.36"
}
while True:
    c_url = "https://apis.naver.com/commentBox/cbox/web_neo_list_jsonp.json?ticket=news&templateId=default_society&pool=cbox5&_callback=jQuery1707138182064460843_1523512042464&lang=ko&country=&objectId=news"+oid+"%2C"+aid+"&categoryId=&pageSize=20&indexSize=10&groupId=&listType=OBJECT&pageType=more&page="+str(page)+"&refresh=false&sort=FAVORITE"

    res = requests.get(c_url,headers=headers)
    cont = BeautifulSoup(res.content, 'html.parser')
    total_comm = str(cont).split('comment":')[1].split(",")[0] # 실제 댓글 split
    
    #print(str(cont))
    match = re.findall('"contents":([^\*]*),"userIdNo"', str(cont)) # "content": 뒤에 나오는 전체 문장 끝은 ,"userIdNo"로 끝나는...
    #print(match)
    List.append(match)
    
    # 한 번에 댓글이 20개씩 보이기 때문에 한 페이지씩 몽땅 댓글을 긁어오기
    if int(total_comm) <= ((page*20)):
        break
    else:
        page += 1

def flatten(I):
    flatList = []
    for elem in I:
        if type(elem) == list: #타입이 list이면 그 안의 원소를 추가
            for e in elem:
                flatList.append(e)
        else: #타입이 list가 아닌 원소라면 바로 추가
            flatList.append(elem)
    return flatList

flatten(List)

아래는 코드를 돌린 결과입니다.

728x90
반응형