출처: https://astrocosmos.tistory.com/202 [ASTROCOSMOS:티스토리] 메타코드 - [ 효율적 뉴스 정보 수집 ] 메타코드 강의 후기 ( 2강 : 뉴스 크롤링 자동화 프로젝트 ) :: 하나둘셋넷
728x90

메타코드 강의

"웹 크롤링 기초 강의ㅣ뉴스, 기차 예매, 여행 사이트 실습"

https://mcode.co.kr/video/list2?viewMode=view&idx=92

 

각각의 뉴스에서 정보 수집

KBS 뉴스탭에서 전체 카테고리를 선택하고 일자별 뉴스 항목에 접근합니다.
먼저, 한 항목을 선택하여 페이지로 이동합니다. F12 버튼을 통해 개발자 모드에 접근하면 각 element들에 대한 자세한 정보를 얻을 수 있으며 이는 뒤에서 바로 진행할 것입니다.

하나의 요소에서 정보를 수집하는 것으로 시작하여, 추후에 여러 뉴스에서 정보를 수집하는 실습을 진행할 것입니다.

 

개발자 모드 F12를 통한 요소 분석

타이틀 부분은 h4로 싸여 있고 class는 "headline-title"임을 확인할 수 있습니다.
본문 부분은 "detail-body font-size"라는 클래스로 되어있음을 확인할 수 있습니다.
개발자 모드에서 접근한 뒤, 화살표 버튼을 통해 내가 원하는 요소에 대한 정보를 쉽게 얻을 수 있습니다.
< br > 태그는 엔터 기능에 해당합니다.

 

라이브러리 호출

기본적인 라이브러리들을 호출하기 위하여 아래 코드를 실행합니다.

import requests
from bs4 import BeautifulSoup

위에서 호출한 requests 라이브러리를 통하여 url의 텍스트 정보를 가져올 수 있습니다.

url = 'https://news.kbs.co.kr/news/pc/view/view.do?ncd=7936381'
html_doc = requests.get(url).text
html_doc

url의 정보의 경우 현재 접속한 페이지의 상단에서 "복사"를 통해 가져오도록 합니다.

위에서 가져온 url 정보를 읽을 때에는 뒤에 .text를 통해 읽도록 합니다.

 

class 정보 수집

title1 = soup.find('h4', class_ = 'headline-title')
title1

이 코드를 실행하여 제목 정보를 가져옵니다.
개발자 모드의 정보에서 title의 class가 어떻게 되는지 쉽게 확인할 수 있으며, 복사 붙여넣기를 통해 'headline-title'을 가져옵니다.

개발자 모드의 좌측 상단의 마우스를 통해 해당 요소의 클래스 정보를 쉽게 찾을 수 있으며, 해당 코드 부분에 마우스 부분을 올려 해당 컨텐츠의 코드 부분이 맞는지 한 번 더 확인하도록 합니다.

 

리스트를 통한 여러 뉴스 데이터 크롤링

아래 코드를 통하여 여러 뉴스들을 하나의 리스트로 담고 데이터프레임으로 만든 뒤에 최종적으로는 csv 파일 형태로 저장합니다.

url_list = []
title_list = []
body_list = []

url1 = 'https://news.kbs.co.kr/news/pc/view/view.do?ncd=7937463'
html_doc1 = requests.get(url1).text
soup1 = BeautifulSoup(html_doc1, 'html.parser')
title1 = soup1.find('h4', class_ = 'headline-title').text
body1 = soup1.find('div', class_='detail-body font-size').text

url_list.append(url1)
title_list.append(title1)
body_list.append(body1)

url2 = 'https://news.kbs.co.kr/news/pc/view/view.do?ncd=7937458'
html_doc2 = requests.get(url2).text
soup2 = BeautifulSoup(html_doc2, 'html.parser')
title2 = soup2.find('h4', class_ = 'headline-title').text
body2 = soup2.find('div', class_ = 'detail-body font-size').text

url_list.append(url2)
title_list.append(title2)
body_list.append(body2)

data12 = {'뉴스url':url_list, '제목':title_list, '내용': body_list}

df12 = pd.DataFrame(data12)
df12.to_csv('new12_kbs.csv', index = False)
pd.read_csv('./news12_kbs.csv')

 

현재는 2개의 뉴스 정보를 추출하는 것이 목적입니다. 따라서, url1, url2의 변수에 각각의 사이트에서 가져온 url 주소를 입력합니다.

list.append()를 활용하여 url, title, body에 대한 정보를 담은 리스트를 생성합니다..

생성된 리스트를 통해 딕셔너리 구조를 변환한 뒤 데이터프레임 구조로 변환하고 이를 csv 형식으로 저장합니다.

 

위에서 저장한 CSV 파일을 확인합니다.

 

화면에서 볼 수 있듯이 url_list에 두 개의 뉴스를 담았기 때문에,

2개의 행으로 구성된 데이터프레임 구조가 CSV로 잘 저장되었음을 확인할 수 있습니다.

Jupyter lab에서 아래에서 볼 수 있듯이 Pandas 라이브러리를 활용하여 읽어볼 수도 있습니다.

컬럼 정보 또한 잘 설정이 되었는지도 확인합니다.

 

 

728x90

+ Recent posts