Hun's Blog

[Python] 웹 크롤링 2 - Python BeautifulSoup4, requests 설치 + 네이버 날씨 미세먼지 가져오기 본문

Language/Python

[Python] 웹 크롤링 2 - Python BeautifulSoup4, requests 설치 + 네이버 날씨 미세먼지 가져오기

jhk-im 2020. 4. 5. 19:27

참고

파이썬 레시피 - 웹 활용 입문편을 공부하면서 정리한 내용

https://wikidocs.net/36472

 

위키독스

온라인 책을 제작 공유하는 플랫폼 서비스

wikidocs.net

 

Beautifulsoup ?  

HTML 및 XML 파일에서 데이터를 가져오는 Python 라이브러리 이다.  
Beautifulsoup 가 가져올 수 있는 page source 는 정적 스크립트이다.  
javascript 로 생성되는 동적 스크립트는 python 의 또다른 라이브러리인 selenium 을 이용해 pulling 한다.  
웹의 어지간한 data 는 beautiful soup 과 selenium 을 통해 가져올 수 있다.  

 

requests ?

HTTP Request를 웹 브라우저가 아닌 python에서 가능하게 해주는 모듈이다. 

프로그래밍 언어 별로 각각 HTTP Request를 편리하게 할 수 있도록 도와주는 모듈이 있다.

python에서는 requests가 HTTP 관련된 작업을 편리하게 할 수 있도록 해준다. 

HTTP Request와 관련된 수많은 모듈 중 가장 많이 사용되는 모듈이기도 하다. 

 

PIP?

python으로 작성된 패키지 라이브러리를 관리해주는 시스템이다. 

우분투와 비교하자면 apt-get 과 흡사하다고 할 수 있다. 

pip는 파이썬 3.4 이후 기본적으로 포함되어 있어 별도의 설치가 필요없다. 

 

 

1. 설치 
sudo apt-get update // 사용가능한 패키지와 그 버전들의 리스트를 업데이트 
#sudo apt-get install python3-pip  
sudo pip3 install requests 
sudo pip3 install beautifulsoup4 

2. 스크립트 작성 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#!/usr/local/bin/python3
from bs4 import BeautifulSoup as bs
from pprint import pprint
import requests
 
#pprint(html.text)
 
data1 = soup.find('div',{'class':'detail_box'})
#pprint(data1)
 
data2 = data1.findAll('dd')
#pprint(data2)
 
fine_dust = data2[0].find('span',{'class':'num'}).text
print(fine_dust)
 
ultra_fine_dust = data2[1].find('span',{'class':'num'}).text
print(ultra_fine_dust)
 
 

--

2-1 requests.get() 

-> requests모듈의 get 메소드에 url 을 입력하면 해당 url의 페이지의 html 소스를 전부 가져온다. 

requests.get() 메소드로 받아온 html 소스 출력

--

2-2 bs() 

-> BeautifulSoup 모듈의 BeautifulSoup 변수를 bs 라는 이름으로 지정하여 사용한다. 

-> bs() 로 해당 변수를 생성할 때 파싱할 문서인 html.text 를 입력하고 'html.parser' 를 입력한다. 

-> 이렇게 생성된 bs 변수는 입력된 문서의 결과를 내부 메소드들을 통해 반환한다. 

-> soup 이라는 변수에 담는다. 

 

2-3 soup.find(name,attrs,recursive,string,**kwargs)

-> bs 의 find() 메소드에 태그명, 타이틀명, 소스명 등을 입력하면 해당 내용을 찾아 결과값을 반환한다. 

-> find() 메소드는 조건에 맞는 태그를 가져오는데 조건에 맞는 태그가 다수이면 가장 첫 번째 태그를 가져온다. 

-> 'div',{'class':'detail_box'} 를 입력한다.

   -> html에서 div를 모두 검색하면서 class명이 'detail_box' 인 div를 찾아 반환한다. 

-> data1 변수에 결과값을 담는다. 

soup.find() 메소드로 'div',{'class':'detail_box'} 를 찾아 출력

--

2-4 data1.findAll(name,attrs,recursive,string,limit,**kwargs)

-> findAll() 메소드에 마찬가지로 가져올 내용을 입력하여 해당 내용을 찾아 결과값을 반환한다. 

-> findAll() 메소드는 조건에 맞는 모든 태그들을 가져온다. 

-> 'dd'를 입력한다.

   -> data1 에서 태그명이 dd 인 모든 태그를 찾아 반환한다. 

-> data2 변수에 결과값을 담는다. 

 

data.findAll() 메소드로 'dd'를 모두 찾아 출력

--

위 이미지를 보면 findAll() 메소드는 찾은 모든 리스트를 배열로 저장한다는 것을 알 수 있다. 

 

2-5 data2[0].find( data2[0].find('span',{'class':'num'}).text

-> data2의 첫번째 column의 소스를 .find() 메소드로 특정 태그를 찾는다.

-> 'span',{'class':'num'}을 입력한다.

   -> class 명이 num 인 span 태그를 찾아 반환한다. 

-> find() 메소드 뒤에 .text 를 입력하면 해당 태그의 Text를 반환한다.

   -> 첫번째 column의 class명 'num' 인 span 태그의 Text는 51㎍/㎥ 이다. 

-> 반환된 text를 fine-dust 변수에 담아 print() 메소드로 출력한다.

-> data2[1] 로 두번째 column의 소스도 동일한 방법으로 찾아와 출력한다. 

 

최종 실행 결과 확인

 

새로 알게된 내용-

 

from, import, as?

import 모듈명

-> 해당 모듈 전체를 가져온다.

-> 이 방법으로 추가된 모듈은 항상 '모듈명.메소드' 와 같이 모듈명을 앞에 붙여주어야 한다.

 

from 모듈명 import 메소드/변수

-> 해당 모듈 내부에 있는 특정 메소드나 변수를 가져온다.

-> 이렇게 추가된 메소드/변수는 모듈명을 붙이지 않고 그대로 사용할 수 있다. 

 

from 모듈명 import 메소드명 as 별명 

-> 메소드에 특정 별명을 지정한다. 

-> 메소드 이름이 길거나 스크립트 내부에 동일한 메소드명이 존재 할 때 별명을 붙여 구분한다. 

 

 

pprint?

pprint 모듈은 임의의 파이썬 데이터 구조를 인터프린터의 입력으로 사용할 수 있다. 

Pretty Print 로써 복잡한 자료구조의 내용을 조금 더 알기 쉽게 표시해 주는 기능을 지원한다. 

 

pprint() 출력
print() 출력