다음 뉴스 스크래핑
뉴스
다음(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')