티스토리 뷰

#1 개발 PC 환경


- Windows 10 Professional 64bit

- Python 3.6.4

- Docker toolbox(최신버전)

- Atom Edittor(Python package 설치)



#2 전체 소스코드


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
#모듈 추가
import urllib.request
from bs4 import BeautifulSoup
import time
 
#기사 목록 가져옴
url = "http://news.naver.com/main/main.nhn?mode=LSD&mid=shm&sid1=105"
response = urllib.request.urlopen(url)
 
#응답 or 문자열 . html.paser라 불리우는 paser의 종류를 넣음
soup = BeautifulSoup(response, "html.parser")
results = soup.select("#section_body .photo a")
 
for result in results:
    #기사 가져옴.
    print("제목 : ", result.attrs["title"])
    url_article = result.attrs["href"]
    response = urllib.request.urlopen(url_article)
    soup_atricle = BeautifulSoup(response, "html.parser")
    content = soup_atricle.select_one("#articleBodyContents")
    #print(content.contents)
 
    #가공
    output = ""
    for item in content.contents:
        stripped = str(item).strip()
        if stripped == "":
            continue
        if stripped[0not in ["<""/"]:
            output += str(item).strip()
    output.replace("&apos;""")
    print(output.replace("본문 내용TV플레이어"""))
    
    #5초 대기
    time.sleep(5)
 
 
 
cs




#3 소스코드 설명


1
2
3
4
5
#모듈 추가
import urllib.request
from bs4 import BeautifulSoup
import time
 
cs


웹 크롤링에 필요한 모듈을 사용하기 위해 import 시켜준 것 이다. 여기서 하나 알고 넘어가야할 모듈이 있다. 바로 BeautifulSoup이다. BeautifulSoup 라이브러리는 HTML 태그 등과 같은 컨탠츠들을 가져온 뒤 사용자가 파싱하기 쉽게 도와주는 라이브러리이다. 이제 두번째 코드를 보자.



1
2
3
#기사 목록 가져옴
url = "http://news.naver.com/main/main.nhn?mode=LSD&mid=shm&sid1=105"
response = urllib.request.urlopen(url)
cs



기사의 목록을 가져오는 부분이다. 내가 가져온 URL의 링크를 들어가보면 다음과 같이 나온다.



(웹크롤링 할 네이버 News 사이트)




내가 웹 크롤링 할 부분인 해당 기사 타이틀과 본문 내용들이다. 그래서 일단 기사 목록을 가지고 오기 위해서 편하게 url 이라는 변수를 만들어두고 거기다가 url 주소를 저장해시켜두었다.

response변수를 생성한 의미는 url 변수에 저장해둔 링크를 urlopen이라는 메서드를 이용해서 호출한 후 response에 저장시키기 위해서이다.

이 response는 다음 코드 내용에서 왜 사용이 되는지 설명될 예정이다. 이제 다음 코드를 보자.



1
2
3
soup = BeautifulSoup(response, "html.parser")
results = soup.select("#section_body .photo a")
 
cs


위에서 BeautifulSoup모듈은 HTML 태그와 같은 컨탠츠들을 사용자가 쉽게 파싱하기 쉽도록 도와주는 라이브러리라고 설명을 하였다. 여기서 파싱이 무엇이냐. 쉽게 말해서 파싱이란 "사람이 알아보기 힘든 문자들을 사람이 알아보기 쉽도록 만드는 작업"이라고 생각하면 될거같다. 첫번째로 내요엥서 BeautifulSoup 메서드가 나왔다 이 메서드의 사용방법은 다음과 같다.



BeautifulSoup(응답 or 문자열, parser의 종류)



여기서는 response(url를 open한 내용)을 html 파서의 종류를 넣는다는 의미이다.

그리고 그 결과값에 soup를 사용해서 selset하게 될것인데 괄호 안에 있는 내용은 네이버 뉴스 웹 페이지에서 개발자 도구(f12)로 해당 HTML 코드를 분석해보면 id가 section_body르 되어 있는 부분을 볼 수 있을것이다. 이 내용은 #section_body의 내용을 선택한다는 의미이며 그 중에서도 photo라는 클래스와 a태그에 있는 내용들을 선택해서 results라는 변수에 넣어주겠다 라는 의미이다.



1
2
3
4
5
6
7
for result in results:
    #기사 가져옴.
    print("제목 : ", result.attrs["title"])
    url_article = result.attrs["href"]
    response = urllib.request.urlopen(url_article)
    soup_atricle = BeautifulSoup(response, "html.parser")
    content = soup_atricle.select_one("#articleBodyContents")
cs


for문을 돌려서 기사의 제목을 가져온다. 소스코드 중에서 attrs라는 것을 볼 수 있따. 이 문장은, title라는 속성값을 가지고 오겠다 라는 의미이다.  그리고 나머지 내용들은 가지고온 네이버 뉴스 기사에는 html 태그들이 종종 섞여있다. 그래서 가공하기 위한 소스코드이다.


위 코드를 돌려보면 다음과 같은 결과값이 보여진다.



#4 실행 결과



돌려보면 위와 같이 기사 제목과 본문들이 스크랩 된 내용을 볼 수 있을것이다.



이 내용은 youtube 윤인성님의 강의를 보고 개인적으로 공부해서 정리해둔 내용입니다.


Comments