본문 바로가기
Python/etc

[Python] BeatifulSoup 활용 인터넷 정보 크롤링

by hotelshoe 2022. 7. 13.
반응형

리뷰 정보, 뉴스 기사 등 웹 페이지에서의 텍스트 데이터를 수집할 때 유용하게 사용되는 파이썬 BeatifulSoup 라이브러리
이번 예제를 통해 BeatifulSoup을 활용하여 인터넷 뉴스의 텍스트 데이터를 수집해 보도록 한다.


라이브러리 설치

!pip install beautifulsoup4

설치는 아나콘다 혹은 개별 IDE에서 pip 명령어로 간단히 할 수 있다.


반응형


웹 페이지 url 분석

간단한 코드 작성으로 원하는 웹 페이지의 텍스트를 수집하면 좋겠지만, 여러 페이지의 내용을 크롤링 할 때 단순 반복문으로 크롤링 하기 복잡한 구조로 되어있을 경우 코드 작성에 어려움이 있을 수 있다. 이번 예제는 단순한 소스 코드 작성의 특성상 순차적인 웹 페이지 넘버링이 되어있는 웹 페이지를 활용할 것이다.

이번 예제에서 사용될 KBS 인터넷 뉴스 url의 경우 

https://news.kbs.co.kr/news/view.do?ncd=5508310

 

중부 곳곳에 ‘호우특보’…내일까지 최고 150mm 장맛비

[앵커] 앞이 잘 보이지 않을 정도의 강한 비 때문에 오늘 출근길 힘드셨죠? 특히 중부지방에 강하고, 많은...

news.kbs.co.kr

와 같이 카테고리에 상관없이 '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

댓글