다음(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=%EC%9D%B8%EA%B3%B5%EC%A7%80%EB%8A%A5&p=1'
url
에 저장된 주소에 요청을 보내고 응답을 받아와 res
에 저장합니다.
res = requests.get(url)
HTML을 처리합니다.
root = lxml.html.fromstring(res.text)
span a.f_nb
에 해당하는 HTML 태그를 찾고 데이터를 가져옵니다. CSS 선택자에서 공백은 포함관계를 나타냅니다. 즉, span
에 포함된 a.f_nb
태그를 찾습니다.
links = root.cssselect('span a.f_nb')
link = links[0]
link.text_content()
'다음뉴스'
a
태그는 링크를 나타냅니다. a
태그에서 href
속성 값은 링크된 주소를 가리킵니다.
link.attrib['href']
'http://v.media.daum.net/v/20210819060104366'
기사 검색결과의 첫번째 페이지 이외에도 다른 페이지의 검색결과를 받아오기 위하여, 주소를 조금 변경합니다.
url
변수에서 페이지 번호를 의미하는 &p=1
을 &p={}
와 같이 변경하여 이를 url
로 다시 저장합니다.
url = 'https://search.daum.net/search?w=news&nil_search=btn&DA=NTB&enc=utf8&cluster=y&cluster_page=1&q=%EC%9D%B8%EA%B3%B5%EC%A7%80%EB%8A%A5&p=1'
기사검색결과의 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'):
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')