프로그래밍/Crawling

[WebCrawling] 네이버 뉴스 섹션 토픽 크롤링 2022.ver

seojeon9 2022. 8. 3. 01:31

이 게시글은 데이터사이언스엔지니어링_전문가 과정을 수강하며 복습을 위해 정리한 글입니다.


네이버 뉴스 크롤링 두번째 게시글입니다. 앞선 게시글을 본 후 보는 것을 추천드립니다.

 

[WebCrawling] 네이버 뉴스 메뉴 크롤링 2022.ver

이 게시글은 데이터사이언스엔지니어링_전문가 과정을 수강하며 복습을 위해 정리한 글입니다. 포털사이트 크롤링 소스내에서 특정 문자열(data)을 자칭하는 선택자 얻기(크롬 개발자도구 사용)

seojeong-99.tistory.com


이전 게시글을 통해 네이버 -> 뉴스 -> 각 섹션 url을 얻어왔을 것이다.

이번에 할 단계는 각 섹션에 있는 대표 토픽url을 크롤링해오는 것이다.

 

위의 화면에서 노란색 블록처리해놓은 부분이 대표 토픽(헤드라인)이다.

개발자도구로 들어가서 각 토픽들의 태그를 확인해보면 정치를 제외한 섹션들이 똑같은 화면 구성인 것을 알 수 있을 것이다.

우선 지난번에 저장해둔 섹션 url을 불러오자.

# 필요 모듈 import
from urllib.request import urlopen
import requests
import pandas as pd
from bs4 import BeautifulSoup

# 저장한 섹션별 link 파일 불러오기
#
df_menu = pd.read_csv('./crawl_data/naver_news_section.csv', index_col = 0)
df_menu.head()

 

각 섹션을 돌아가며 토픽 데이터를 수집하는 함수를 만들었다.

def get_topic(url, section) :
    
    # 수집 내용 list에 저장
    topic_title = []
    topic_link = []
    
    # 소스 요청해서 가져오기
    headers = {"User-Agent" : "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/102.0.5005.141 Whale/3.15.136.29 Safari/537.36"}
    res = requests.get(url,headers=headers)
    
    # 파서기 생성(bs4 객체 생성)
    html = res.text
    bs_obj = BeautifulSoup(html,'html.parser')
    
    # section이 정치인 경우는 다른 태그를 추출
    if section == '정치' :
        topic_list = bs_obj.findAll('div',{'class':'cluster_foot_inner'})
    else :
        # 토픽 추출
        # h2태그의 class:cluster_head_topic
        topic_list = bs_obj.findAll("h2",{"class":"cluster_head_topic"})
     
    # 최종 수집 항목을 list에 저장
    # link에 기본 url 추가
    base_url = 'https://news.naver.com'
    # 전체 토픽 title과 link 출력
    for topic in topic_list :
        try :
            a_t = topic.find('a')
            topic_title.append(a_t.text.replace('\n',''))
            topic_link.append(base_url + a_t['href'])
        except :
            print("에러발생")
    return({"topic":topic_title,"url":topic_link, "section":section})

 

이제 모든 섹션에 적용하여 데이터를 추출하여 보겠다.

# 모든 섹션의 topic을 하나의 dataframe에 저장하기 위해 빈 dataframe을 생성
dict_sub={}
dict_sub['topic']=[]
dict_sub['url']=[]
dict_sub['section']=[]

topic_df = pd.DataFrame(dict_sub)
topic_df

# 섹션별 헤드라인 추출
for i in range(1,7) :
    temp = pd.DataFrame(get_topic(df_menu['link'][i],df_menu['section'][i]))
    topic_df = pd.concat([topic_df,temp],axis=0,ignore_index=True)

 

잘 추출 되었는지 확인하고 파일로 저장을 하면 된다!

# 파일로 저장
topic_df.to_csv('./crawl_data/naver_news_topic.csv')

 

다음 글에서는 추출된 대표 토픽 url을 통해 본 뉴스 글로 들어가 본격적인 뉴스 내용을 추출하는 방법에 대해 알아보겠다!

728x90