Python 크롤링 흐름 살펴보기

Jeongkuk Seo
sjk5766
Published in
5 min readJan 25, 2019

본 글은 Python으로 크롤링은 이런 흐름으로 하는구나를 설명하기 위해 쓰는 글입니다. 관련 라이브러리 모듈의 설치 방법이나, 디테일한 설명은 다른글에 쓰려합니다. naver 뉴스 페이지의 기사 목록들을 보여주는 것으로 흐름을 설명하겠습니다.

네이버 news 페이지의 주요 기사 제목을 뽑아보겠습니다. 크롤링을 위해서 Python에서는 크게 두 가지 모듈이 필요한데 한 가지는 urllib 라는 통신 모듈로 기본적으로 설치가 되어 있으며 두 번째 필요한 라이브러리는 BeautifulSoup 라는 데이터 파싱 라이브러리가 필요합니다. BeautifulSoup의 경우 소스 설치나 pip를 통해 설치할 수 있습니다.

네이버 뉴스 페이지에 접속한 뒤, F12를 눌러 크롬 개발자 도구를 엽니다. 오른쪽 빨간색으로 굵게 표시한곳을 클릭한뒤에 네이버 페이지를 찍어보면 원하는 섹션의 HTML 구조를 살펴볼 수 있습니다. 이 시간 주요 뉴스라는 부분을 찍었을 때 HTML 소스를 타고 들어가니 기사 제목이 strong 태그안에서 보이는 것을 확인할 수 있습니다. 좀 더 상세히 확인해 보겠습니다.

기사 제목이 포함된 HTML 구조를 살펴보면 <li> 태그 하위에 화살표로 표시한 div 태그가 보입니다. 모든 기사제목이 위와 같은 구조로 되어있으므로 다음과 같이 소스를 만듭니다.

import bs4              // BeautifulSoup 
import urllib.request // 통신 라이브러리

url = "https://news.naver.com/"
html = urllib.request.urlopen(url) // naver news 페이지를 읽어온다.

o = bs4.BeautifulSoup(html, "html.parser") // html 기반으로 파싱
l = o.findAll("div", {"class":"newsnow_tx_inner"}) // div 태그 중 클래스 이름이 newsnow_tx_inner 인 녀석들을 추출합니다.

위에서 변수 l을 출력해보면 결과는 아래와 같습니다.

[<div class=”newsnow_tx_inner”>
<a class=”nclicks(hom.headcont)” href=”https://news.naver.com/main/read.nhn?oid=056&amp;sid1=100&amp;aid=0010664941&amp;mid=shm&amp;mode=LSD&amp;nh=20190125141704"><strong>출구 안 보이는 방위비분담금 협상…팽팽한 줄다리기</strong></a>
</div>, <div class=”newsnow_tx_inner”>
<a class=”nclicks(hom.headcont)” href=”https://news.naver.com/main/read.nhn?oid=003&amp;sid1=102&amp;aid=0009031588&amp;mid=shm&amp;mode=LSD&amp;nh=20190125142221"><strong>서울 홍역 확진자 1명 추가…올겨울 들어 38명째</strong></a>
.
.
.]

출력결과는 [ <div><a><strong> 1번 기사 제목 </strong></a></div>, <div><a><strong> 2번 기사 제목 </strong></a></div>……………] 와 같은 포맷입니다. 저는 List를 loop 돌면서 strong 태그가 가지고 있는 데이터를 찍어보겠습니다.

import bs4
import urllib.request

url = "https://news.naver.com/"
html = urllib.request.urlopen(url)

o = bs4.BeautifulSoup(html, "html.parser")
l = (o.findAll("div", {"class":"newsnow_tx_inner"}))
for i in l: // loop를 돈다
print(i.find("strong").text) // strong 태그의 데이터를 출력

태그의 실제 데이터를 찍기 위해 i.find(“strong”).text와 같이 text를 출력했습니다. 결과는 아래와 같습니다.

출구 안 보이는 방위비분담금 협상…팽팽한 줄다리기
서울 홍역 확진자 1명 추가…올겨울 들어 38명째
양승태 전 대법원장, 이후 어떤 ‘헌정 최초’를 쓸까
코스피, 外人·기관 쌍끌이 ‘사자’에 2170선 회복…석 달 반 만에 최고치
공기질 깨끗…오후부터 동해안 눈
개성공단 기업인 방북 또 무산…통일부 “유보, 금일 통보”
예타면제 ‘눈먼 돈’ 잡아라… 지자체마다 ‘서명·집회·읍소’
‘시진핑 책사’ 왕후닝 “최악의 상황에 대비해야”
법원 “산양은 원고가 될 수 없다” 케이블카 소송 각하
윤석헌 금감원장 “저축銀 선제적 건전성 관리 나서야”

--

--