Python 웹 스크래핑

Python으로 웹에 있는 자료들을 스크래핑 하는 방법을 알아봅니다.


수강중

9. 다음 뉴스 스크래핑

뉴스

다음(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')