본문 바로가기
프로그래밍/크롤링

[크롤링(Crawling) – 02] 최신 인터넷 신문 / 기사, 제목만 추출 (BeautifulSoup / parser)

by 철인애슬론 2020. 8. 11.

필요한 정보만 쏙쏙 뽑아서 정리하자!


이전 requests를 통해, HTML 소스를 얻었습니다.

datazzang.tistory.com/1

 

[크롤링(Crawling) - 01] 데이터 요청 하기 (requests)

크롤링 기초 데이터를 분석하기 위해 가장 먼저 해야 하는 것은 데이터 수집이다. 파이썬의 requests를 불러오면(import) HTML 코드를 손쉽게 다운로드된다. import requests get_page = requests.get("https://ww..

datazzang.tistory.com

하지만 정리 안된 뒤죽박죽의 HTML 소스는 보기도 힘들며 필요 없는 정보도 많이 포함되어있습니다.

그러므로 이번 시간에는 필요한 정보만 추출하는 방법에 대해 알아보겠습니다.

 

네이버 뉴스

정치, 경제, 사회, 생활/문화, 세계, IT/과학 등 언론사별, 분야별 뉴스 기사 제공

news.naver.com


데이터 추출에 사용할 명령어는 BeautifulSoup와 parser입니다. 

#불러오기
import requests
from bs4 import BeautifulSoup

#requests를 통한 정보 수집
get_page = requests.get("https://news.naver.com/")

#text로 저장
news = get_page.text

#BeautifulSoup를 통해 Python에 적용
soup = BeautifulSoup(news, 'html.parser')

print(news)
print(soup)

 

BeautifulSoup는 requests에서 추출된 무분별한 정보를 Python에서 사용하기 편리하게 만들어 줍니다.

정보를 획득 했다면, 다음 과제는 HTML 해석입니다. (필요 정보가 어디 있는지 인지)

BeautifulSoup를 통해 다운 받은 HTML 소스를 봐도 되지만 크롬(chrome)을 활용하면 보다 쉽게 검색이 가능합니다.

아래 그림을 보면,

왼쪽 상단(빨간 네모)를 클릭하면, 마우스의 위치에 따라 해당되는 코드를 알려줍니다.

 

코드가 알려주는 위치

 

해당 코드를 확대해보면

HTML 코드 위치

 

메인 기사의 HTML 코드 위치는 div의 "main_content"의 "li" 태그 중 "a" 태그의 strong에 있습니다.

이것을 파이썬 코드로 적으면,

tag_news = soup.select('.main_content li a strong')

입니다. 여기서 (.)은 class를 나타내고, ( ) 스페이스바는 and를 나타냅니다.

위 내용을 사용하기 편하게 리스트[]에 넣으면

#빈 리스트를 만든다.
main_news = []

#분류된 내용을 각각 리스트 항목에 넣는다.
for tag in tag_news:
    main_news.append(tag.text)

 

결과값은 다음과 같습니다.

['추미애 현수막 찢은 한국당... "검찰 인사는 폭거, 본회의 불참"', '김연철 “남북 철도·도로 연결 정밀조사 준비”', '‘호르무즈 파병’ 신중 모드…다른 이슈 연계 가능성은?', '‘추미애 방지’ 공약 낸 한국당…‘인사 추천권은 장관 아닌 총장에게’', '추미애 "인사의견 내라 지시…윤석열 총장이 거역"', '방산주 급등락에 개미투자자만 또 눈물', '"매도" 의견 찾기 힘든 국내 증권사 리포트', '회사가 준 정보만으로 준법감시 하라는 삼성', '권봉석 LG전자 사장 “폴더블폰을 못해서 안 하는 게 아닙니다”', '[집중진단] 모빌리티, ‘스마트 디바이스’로 …차세대 먹거리 될까', '서울서 경찰과 3km 추격전 벌인 25t 트럭 운전자 구속', "[이 시각 뉴스룸] '서지현 인사보복' 안태근, 대법원서 '무죄' 판단", '윤석열 사단 "사퇴는 없다"…물러서지 않는 수사가 \'갈 길\'(종합)', '중 \'원인불명 폐렴\'…"사스 아닌 신종 코로나" 잠정결론', '이순신대교 지나던 트레일러서 3톤짜리 컨테이너 바다 추락', '[문화현장] 반고흐의 명작, 뮤지컬 무대서 살아 움직이다', '완벽한 ‘사기캐’ 리사마저도', '이례적인 겨울비…강원 1월 강수량 역대 최고 경신', '이어령 "한반도가 살 길은 선택이 아닌 창조"', '수입차 어렵다는데..나홀로 성장한 볼보, 인기 비결은?', "갈수록 선전에 뒤처지는 홍콩…작년 성장률 '7% vs -1%'", '새끼 밴 어미소, 도살장서 눈물 뚝뚝…모성애의 기적', '이슬람 무장단체 알샤바브, 케냐에 추가 테러 위협', '진짜로 둔갑한 가짜… 미사일보다 컸던 이란발 오보 대란', '지진으로 고통 받는 카리브해… 102년만 최강지진 후유증 겪는 푸에르토리코', "본회의 가는'데이터 3법'… IT업계 '안도'", "엔씨, '리모트 스트리밍'으로 저사양 유저까지 품는다", '갤럭시S20·갤럭시폴드2 코드명 ‘허블’과 ‘블룸’ 공식확인', '5G 세계최초 영예, 세계최고로 이어간다', '“힘들어? 살살해줄게” 감정 읽는 AI 탁구 코치']

예를 들어, main_news[2]를 검색하면 ‘호르무즈 파병’ 신중 모드…다른 이슈 연계 가능성은?' 라는 값을 구할 수 있습니다.

코드 요약

#불러오기
import requests
from bs4 import BeautifulSoup

#requests를 통한 정보 수집
get_page = requests.get("https://news.naver.com/")

news = get_page.text

#BeautifulSoup를 통해 Python에 적용
soup = BeautifulSoup(news, 'html.parser')
tag_news = soup.select('.main_content li a strong')

#빈 리스트를 만든다.
main_news = []

#분류된 내용을 각각 리스트 항목에 넣는다.
for tag in tag_news:
    main_news.append(tag.text)

main_news

 

반응형

댓글