뉴스 크롤링하기
- Python/웹크롤링
- 2020. 5. 6.
https://news.v.daum.net/v/20200506153410306
다음 뉴스를 가지고 크롤링을 해보겠습니다.
뉴스 제목 크롤링
뉴스 제목을 크롤링하는 방식은 다음과 같습니다.
- requests 모듈로 기사의 링크를 가져옵니다.
- BeautifulSoup으로 Html을 파싱해옵니다.
- 뉴스 제목에 해당하는 tag를 파싱한 곳에서 찾습니다.
- 찾은 tag에서 get_text()를 이용해 text를 가져옵니다.
위 방법을 토대로 다음과 같이 코드를 작성합니다.
import requests
from bs4 import BeautifulSoup
url = 'https://news.v.daum.net/v/20200506153410306'
resp = requests.get(url)
soup = BeautifulSoup(resp.text)
news_title = soup.select_one('h3.tit_view')
news_title.get_text()
제목이 나오는 것을 볼 수 있습니다. 여기서 select_one 은 딱 한개만 찾을 때 쓰는 매소드이고 get_text()는
다음 tag를 보면 <>외신 "삼성 갤럭시z플립~~~</> 으로 되어있는데 여기서 value값을 가져오는 매소드입니다.
h3.tit_view는 직접 찾아야하는데 위 뉴스가 뜬 해당페이지에서 개발자모드(F12 키 누름)를 켜면 찾을 수 있습니다.
개발자 모드를 누르면 오른쪽에 어떤 화면이 뜹니다.
그러면 위 화살표 모양을 누른 후 뉴스 제목에 갖다대면 파랗게 그려지면서 아래 그림처럼 옆에 태그가 나옵니다.
참고로 개발자 모드를 들어갔는데 아무것도 안 뜨면 새로고침해서 다시 데이터를 받아오면 됩니다.
뉴스 본문 크롤링
뉴스 본문도 뉴스 제목 찾기와 동일한 방법으로 합니다. 좀 더 살펴봐야 할 곳은 본문 선택후의 tag 형태입니다.
본문을 선택했더니 다음과 같은 tag가 나옵니다. 여기서 우리가 원하는건 p로 엮여져 있는 모든 text입니다.
그래서 harmonyContainer 에서 p를 찾도록 합니다. for과 select를 이용해 harmonyContainer 에 있는 모든 p로 이루어진 text를 가져오겠습니다. 뉴스제목에서 쓰던 코드를 이미 썼다 생각하고 본문에서 text 가져오는 코드만 쓰겠습니다.
content = ''
for p in soup.select('div#harmonyContainer p'):
content +=p.get_text()
print(content)
깔끔하게 본문 내용을 가져온 것을 볼 수 있습니다.
뉴스 댓글 크롤링
뉴스 댓글은 단순하게 html로 구성되어 있지 않고 ajax로 구현되어 있습니다. 댓글란에서 '더보기' 를 누르면 댓글란만 새로고침되는 것을 볼 수 있는데 이런 구현은 ajax로 가능합니다. 따라서, html을 파싱하는 BeautifulSoup으로는 찾을 수 댓글을 크롤링할 수가 없습니다.
그래서 댓글에 해당하는 링크를 찾아야합니다. 개발자 모드에 Network에서 Initiator 가 ajax인 것을 찾아서 눌러서 동일한 댓글이 있는지 확인합니다.
그래서 Response에서 댓글과 똑같은 문구가 있는 것을 찾아냅니다. 찾았다면 그 링크를 Header에서 찾습니다.
위 그림에서 파랗게 표시되어 있는 곳이 url입니다. 이 url을 활용하겠습니다. headers는 크롤링을 안 되는 경우에 더 넣어서 크롤링을 할 수 있게 하는 것이고 크롤링이 되지 않는다면 selenium을 활용해야 합니다.
url = 'https://comment.daum.net/apis/v1/posts/@20200506153410306/comments?parentId=0&offset=0&limit=3&sort=RECOMMEND&isInitial=true'
headers = {
'Authorization': 'Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJmb3J1bV9rZXkiOiJuZXdzIiwiZ3JhbnRfdHlwZSI6ImFsZXhfY3JlZGVudGlhbHMiLCJzY29wZSI6W10sImV4cCI6MTU4ODgwNzcwNywiYXV0aG9yaXRpZXMiOlsiUk9MRV9DTElFTlQiXSwianRpIjoiNDg0OWNlMGEtNDk2YS00MGQ5LWE5ZGUtMDRlMGMwMzllMmU5IiwiZm9ydW1faWQiOi05OSwiY2xpZW50X2lkIjoiMjZCWEF2S255NVdGNVowOWxyNWs3N1k4In0.yFLBDHykRwOinGGWPD3GXPw08O3aGueevxoRvSTddKI',
'Origin': 'https://news.v.daum.net',
'Referer': 'https://news.v.daum.net/v/20200506153410306',
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.129 Safari/537.36'
}
resp = requests.get(url, headers=headers)
resp.json()
이렇게 댓글을 가져왔습니다.
댓글 정리는 추후에 json 다룰 때 포스팅하도록 하겠습니다. 감사합니다.
'Python > 웹크롤링' 카테고리의 다른 글
[Python] FinanceDataReader로 주식데이터 가져오기 (0) | 2021.08.20 |
---|---|
[웹크롤링] 네이버증권에서 재무제표 가져오기 (13) | 2021.07.19 |
[Python] BeautifulSoup 간단 사용법 (0) | 2020.04.28 |
requests 모듈(get 방식 크롤링) (0) | 2020.04.26 |
정규표현식 (re) (1) | 2020.04.22 |