다음 뉴스 스크래핑 :: Python 웹 스크래핑 - mindscale
Skip to content

다음 뉴스 스크래핑

뉴스

다음(Daum) 뉴스를 웹스크래핑하고, 판다스를 이용하여 스크래핑한 결과를 csv파일로 저장합니다.

import requests
import lxml.html
import pandas as pd

검색 결과

우선 다음뉴스에서 "인공지능"을 검색하고 그 결과의 주소url 변수에 저장합니다.

url = 'https://search.daum.net/search?w=news&nil_search=btn&DA=NTB&enc=utf8&cluster=y&cluster_page=1&q=인공지능&p={}'

url에 저장된 주소에 요청을 보내고 응답을 받아와 res에 저장합니다.

res = requests.get(url.format(1))

HTML을 처리합니다.

root = lxml.html.fromstring(res.text)

span.cont_info a.f_nb에 해당하는 HTML 태그를 찾고 데이터를 가져옵니다. CSS 선택자에서 공백은 포함관계를 나타냅니다. 즉, span.cont_info에 포함된 a.f_nb 태그를 찾습니다.

links = root.cssselect('span.cont_info a.f_nb')
link = links[0]
link.text_content()
'다음뉴스'

a 태그는 링크를 나타냅니다. a 태그에서 href 속성 값은 링크된 주소를 가리킵니다.

link.attrib['href']
'http://v.media.daum.net/v/20210819060104366'

여러 페이지 주소 수집

기사검색결과의 1페이지 주소부터 2페이지 주소까지 접속하여 개별 신문기사 주소를 추출합니다.

href = []
for page in range(1, 3):
    res = requests.get(url.format(page))
    root = lxml.html.fromstring(res.text)
    for link in root.cssselect('span a.f_nb'):
        if link.text == "다음뉴스":
            href.append(link.attrib['href'])

주소에 해당하는 신문기사 본문을 스크래핑합니다. articles 변수는 기사 본문을 저장할 빈 객체입니다.

기사 본문은 HTML의 class 태그의 .article_view에 있습니다. 기사본문을 articles에 저장합니다.

articles = []
for h in href:
    res = requests.get(h)
    root = lxml.html.fromstring(res.text)
    for article in root.cssselect('.article_view'):
        articles.append(article.text_content().strip())

스크래핑 결과를 csv파일 형태로 저장합니다.

pd.DataFrame({'주소': href, '본문': articles}).to_excel('기사.xlsx')