리뷰 정보, 뉴스 기사 등 웹 페이지에서의 텍스트 데이터를 수집할 때 유용하게 사용되는 파이썬 BeatifulSoup 라이브러리
이번 예제를 통해 BeatifulSoup을 활용하여 인터넷 뉴스의 텍스트 데이터를 수집해 보도록 한다.
라이브러리 설치
!pip install beautifulsoup4
설치는 아나콘다 혹은 개별 IDE에서 pip 명령어로 간단히 할 수 있다.
웹 페이지 url 분석
간단한 코드 작성으로 원하는 웹 페이지의 텍스트를 수집하면 좋겠지만, 여러 페이지의 내용을 크롤링 할 때 단순 반복문으로 크롤링 하기 복잡한 구조로 되어있을 경우 코드 작성에 어려움이 있을 수 있다. 이번 예제는 단순한 소스 코드 작성의 특성상 순차적인 웹 페이지 넘버링이 되어있는 웹 페이지를 활용할 것이다.
이번 예제에서 사용될 KBS 인터넷 뉴스 url의 경우
https://news.kbs.co.kr/news/view.do?ncd=5508310
와 같이 카테고리에 상관없이 'https://news.kbs.co.kr/news/view.do?ncd=페이지넘버' 의 형식으로 되어 있어, 여러 페이지의 내용을 크롤링하기 매우 편리한 구조로 되어있다.
이제 BeatifulSoup 라이브러리 특성상 html의 각 태그에 작성된 정보를 수집해야 하므로 해당 웹 페이지의 html 구조를 파악해야한다.
우선 이번 예제에서 활용할 상단의 링크를 접속한 뒤 해당 페이지에서 빈 곳에 마우스 우클릭하여 '페이지 소스 보기'를 클릭한다.
다음과 같이 해당 페이지의 html 소스를 볼 수 있으며 이곳에서 각 태그에 작성된 원하는 정보를 파악한다. 가령 뉴스 기사의 경우 필요한 정보는 제목, 카테고리, 기사본문이 되겠다.
기사 제목의 경우 29번 째 줄의 <tytle> 태그에서 시작된다.
기사 본문의 경우 2230번 째 줄 <div> 태그의 view_con_text 클래스에서 시작된다.
카테고리의 경우 1865번 째 줄 <a> 태그의 cate 클래스에 있다.
(해당 예시 뉴스 페이지의 경우 '날씨' 카테고리로 예상되나 시간별 뉴스인 '뉴스12'로 되어있음. 카테고리 분류 문제 등을 활용할 때 조금 불편할 수 있으나 따로 소스코드에 리스트를 적용해서 문화, 경제, 정치, 스포츠 등과 같은 적절한 카테고리의 뉴스 기사만 크롤링 할 수도 있으니 너무 염려하지 않아도 된다.)
이제 필요한 정보인 제목, 카테고리, 기사 본문이 적힌 html 태그를 파악했으니 해당 정보를 바탕으로 소스코드를 작성해본다.
소스코드
from bs4 import BeautifulSoup
import urllib.request
f = open('./data.txt', 'w', encoding = 'UTF-8') #- 수집된 텍스트가 쓰여질 txt파일 생성
#- 5508210번 뉴스 페이지를 기준으로 100개의 뉴스 데이터 수집
for index in range(5508210, 5508310):
news_url = 'https://news.kbs.co.kr/news/view.do?ncd=%d' % index
html = urllib.request.urlopen(news_url)
soup = BeautifulSoup(html, 'html.parser')
#- 기사 제목이 있는 태그 크롤링
title = soup.select_one('title').text
#- 기사 본문이 있는 태그 크롤링(간혹 오류가 있어 예외적용)
try:
content = soup.select_one('div.view_con_text').text.strip()
except Exception as e:
continue
#- 기사 카테고리가 있는 태그 크롤링(간혹 오류가 있어 예외적용)
try:
label= soup.select_one('a.cate').text.strip()
except Exception as e:
continue
#- 크롤링한 텍스트를 txt 파일에 입력
f.write(f'{title}\t{label}\t{content}\n')
#- 만약 원하는 카테고리만 크롤링할 경우 상단 코드는 주석처리한 뒤, 하단 코드를 활용
'''
label_list = ['정치', '경제', '국제', '문화'] #- 본인의 필요에 맞게 수정할 것
if label in label_list:
f.write(f'{title}\t{label}\t{content}\n')
else:
continue
'''
f.close()
테스트
인터넷 뉴스 기사의 url 5508210번 부터 5508310번 까지의 타이틀, 카테고리, 기사본문을 크롤링한 모습
'Python > etc' 카테고리의 다른 글
[Python] 화면 자동 캡쳐 (0) | 2022.09.01 |
---|---|
[Python] 한 번에 파일명 넘버링 하기 (0) | 2022.02.09 |
[Python] pip 커맨드 리스트 (0) | 2021.12.29 |
댓글