티스토리 뷰

728x90
반응형

 

 

 

다음 뉴스를 파이썬으로 크롤링해보려합니다!

다음 뉴스 중에서도 가장 핫한, 사람들이 많이 본 뉴스랭킹을 뽑아올거에요,

 

https://news.daum.net/ranking/popular

 

뉴스 랭킹

다음뉴스

news.daum.net

 

 

랭킹뉴스에 많이 본, 열독률 높은, 댓글 많은, 연령별 뉴스가 랭킹순으로 리스팅 되어있어요.

모두 포맷은 동일하기 때문에 전부다 가져올거에요,

 

각 카테고리별 링크는 아래와 같구, ranking/ 뒤만 달라지는 것을 확인할 수 있었어요.

"많이본" 뉴스의 링크는 https://news.daum.net/ranking/popular

"열독률 높은" 뉴스의 링크는 https://news.daum.net/ranking/kkomkkom

"댓글 많은" 뉴스의 링크는 https://news.daum.net/ranking/bestreply

"연령별" 뉴스의 링크는 https://news.daum.net/ranking/age

 

연령별 뉴스를 제외하고는 모두 html 소스가 동일하기때문에

많이 본, 열독률 높은, 댓글 많은 뉴스만 크롤링해도록 하겠습니다!

 

우선 많이본 뉴스만 먼저 테스트겸 가져와볼게요.

크롤링을 위해 requests와 bs4를 임포트시키고,

많이본 뉴스의 html 소스를 가져옵니다.

import requests
from bs4 import BeautifulSoup as bs

url = 'https://news.daum.net/ranking/'
res = requests.get(url)

 

 

F12를 눌러 개발자모드를 열고

뉴스리스트 소스를 보기 위해 클릭해보니,

뉴스리스트들은 list_new2 클래스를 가진 ul태그안에 들어있어요.

 

 

list_new2 ul의 li 태그들만 모두 findAll로 가져왔습니다.

총 50개의 뉴스가 있네요.

뉴스들은 link_thumb 클래스의 a태그 안에 url href와 뉴스제목이 들어있고,

언론사명은 info_news 클래스를 가진 span태그 안에 text로 들어있습니다.

뉴스내용은 길어서 "수술을 받은 이....." 이런식으로 짤려있기 때문에

url에 들어가서 가져올거에요.

 

soup = bs(res.text, 'lxml')
ul = soup.find("ul",{"class":"list_news2"}).findAll("li")
len(ul)

 

50개의 뉴스를

뉴스제목, url, 언론사명까지 가져와서

모두 news라는 리스트에 담습니다

news = []
for li in ul:
    data = li.find("a",{"class":"link_txt"})
    news.append({
        'title': data.text,
        'url': data.get("href"),
        'press': li.find("span",{"class":"info_news"}).text
    })

 

잘 크롤링이 된 것이 확인되었네요,

이제 많이본 뉴스 뿐만 아니라,

열독률 높은, 댓글 많은 뉴스도 똑같이 가져옵니다!

 

3개 카테고리를 가져왔는데 잉? 왜 130개지??? 했더니

열독률높은 뉴스는 총 30개였어요.

 

자 이제 뉴스내용을 가져옵시다!!

크롤링으로 가져왔떤 url 중에 하나를 암거나 선택해서 열어봤어요

뉴스내용이 id="harmonyContainer" div의 p태그들로.. 들어있어요.

그리고 harmonyContainer에 있는 p태그들의 텍스트들을 모조리 가져와버리면

언론사명과 무단 전재 및 재배포 금지 문장까지 크롤링되어버리기 때문에

harmonyContainer div 안에 있는 section p태그의 텍스트들을 가져옵니다.

 

 

그리고,

마지막 인덱스의 p태그는 기자명과 기자 이메일이 들어있기 때문에

마지막 인덱스는 가져오지 않도록 합니다!!

res = requests.get(news[0]['url'])
soup = bs(res.text, 'lxml')
contents = soup.find("div",{"id":"harmonyContainer"}).find("section").findAll("p")[:-1]

 

 

가져온 뉴스내용을 출력해보면

정상적으로 뉴스내용만 가져와졌음을 확인할 수 있습니다

 

contents = soup.find("div",{"id":"harmonyContainer"}).find("section").findAll("p")[:-1]
for p in contents:
    print(p.text)

 

 

이런식으로

news 리스트에 들어있는 모든 뉴스의 뉴스내용들을 크롤링해서

content 라는 키를 만들어서 그 안에 넣어주었답니다.

 

참쉽죠??

다음뉴스 크롤링 끝입니다!

728x90
반응형
댓글