본문 바로가기

Language/Python기초

1. 네이버 날씨 미세먼지 데이터 가져오기

1. 네이버 날씨 웹페이지 가져오기

1
2
3
4
5
6
from bs4 import BeautifulSoup as bs
from pprint import pprint 
import requests
 
pprint(html.text)
 

다음 코드는 네이버 날씨 웹페이지를 가져오는 코드입니다. 

pprint는 리스트나 딕셔너리의 데이터가 길경우 보기 좋게 정리해주는 함수입니다. 

실행결과 다음과 같은 결과를 얻을 수 있습니다. 

이는 웹페이지의 마우스 오른쪽 클릭 후 페이지 소스보기에 들어가면 볼 수 있는 코드와 동일한 코드입니다. 이를 좀 더 분석하기 쉽도록 파싱작업을 하도록 하겠습니다. 

 

2.파싱작업

1
2
3
4
5
6
7
8
9
from bs4 import BeautifulSoup as bs
from pprint import pprint 
import requests
 
#pprint(html.text)
 
pprint(soup)
 

파싱작업 코드를 추가했습니다. 결과는 다음과 같습니다.

해당 웹페이지의 HTML코드가 보기 좋게 정리된것을 볼 수 있습니다. 

 

3. 웹페이지 분석하기 

우리는 네이버 날씨 사이트의 미세먼지데이터를 가져오려고 합니다. 데이터를 가져오기 위해서는 해당 데이터가 쓰인 HTML 코드의 태그와 속성을 알아야 합니다. 이는 크롬의 개발자도구를 통해 알 수 있습니다. 

개발자도구는 크롬창에서 F12키를 누르면 들어갈 수 있습니다. 

 

크롬 개발자 모드에서 왼쪽 중단에 있는 Selector를 켜고 원하는 데이터에 마우스를 올려 놓으면 해당 데이터의 태그와 속성을 알아낼 수 있습니다. 이제 알아낸 태그와 속성을 이용하여 필요한 데이터만 추려내는 작업을 하겠습니다. 

 

4. 미세먼지 데이터만 추려내기 

 

1
2
3
4
5
6
7
8
9
10
11
12
from bs4 import BeautifulSoup as bs
from pprint import pprint # pprint는 리스트나 딕셔너리의 데이터가 길경우 정리해서 보여주는역할
import requests
 
#pprint(html.text)
 
#pprint(soup)
 
data1 = soup.find('div',{'class':'detail_box'})#영역 추출
pprint(data1)
 

soup.find 메소드를 이용하여 태그가 'div'이고 'class'가'detail_box'인 영역을 추출하였습니다. 결과는 다음과 같습니다.

find메소드는 해당 HTML 문서에 중복된 값이 있는 경우에는 가장 첫 번째 값만 반환합니다.

원하는 영역이 제대로 출력된 것을 확인할 수 있습니다. 이제 해당 영역에서 미세먼지, 초미세먼지, 오존 지수 각각의값을 추출해보도록 하겠습니다. 

 

개발자 도구를 통해 각각의 데이터가 dd태그를 같은 것을 알 수 있었습니다. 다만 'class'는 네이버 자체적으로 미세먼지, 초미세먼지, 오존농도의 값이 달라지면 그 값이 달라지므로 사용할 수 없었습니다. 태그만 사용하여 그 값을 추출해보도록 하겠습니다. 

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
from bs4 import BeautifulSoup as bs
from pprint import pprint # pprint는 리스트나 딕셔너리의 데이터가 길경우 정리해서 보여주는역할
import requests
 
#pprint(html.text)
 
#pprint(soup)
 
data1 = soup.find('div',{'class':'detail_box'})#영역 추출
#pprint(data1)
 
data2 = data1.findAll('dd')
pprint(data2)
 
 

 

findAll메소드를 사용하여 위에서 추출한 영역 중 'dd'태그를 갖는 모든 값을 반환받았습니다. 결과는 다음과 같습니다. 

 반환된 값이 List로 반된된 것을 확인할 수 있었습니다. 우리가 원하는 것은 미세먼지 데이터이므로 리스트 값만을 취하기 위해 index값을 이용하여 출력해보도록 하겠습니다. 

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
from bs4 import BeautifulSoup as bs
from pprint import pprint # pprint는 리스트나 딕셔너리의 데이터가 길경우 정리해서 보여주는역할
import requests
 
#pprint(html.text)
 
#pprint(soup)
 
data1 = soup.find('div',{'class':'detail_box'})#영역 추출
#pprint(data1)
 
data2 = data1.findAll('dd')
pprint(data2[0])

 

미세먼지는 리스트의 첫 번째 값이므로 index값으로 0을 넣었습니다. 결과는 다음과 같습니다. 

위의 결과를 바탕으로 미세먼지 값이 span 태그를 갖고 class값으로 "num"를 같은 것을 확인하였습니다. 위에서 사용해봤던 find메소드를 이용하여 미세먼지 데이터를 추출해보도록 하겠습니다.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
from bs4 import BeautifulSoup as bs
from pprint import pprint # pprint는 리스트나 딕셔너리의 데이터가 길경우 정리해서 보여주는역할
import requests
 
#pprint(html.text)
 
#pprint(soup)
 
data1 = soup.find('div',{'class':'detail_box'})#영역 추출
#pprint(data1)
 
data2 = data1.findAll('dd')
#pprint(data2[0])
 
find_dust = data2[0].find('span',{'class':'num'})
print(find_dust)
 

find메소드를 이용하여 값을 출력했습니다. 결과는 다음과 같습니다.

 

위의 결과는 태그, class 그리고 우리가 원하는 데이터 모두가 출력됩니다. 우리가 원하는 것은 데이터 이므로 데이터만 출력할 수 있도록 .text를 이용하도록 합니다. .text는 태그 내부의 텍스트만 추출할 수 있도록 합니다. 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
from bs4 import BeautifulSoup as bs
from pprint import pprint # pprint는 리스트나 딕셔너리의 데이터가 길경우 정리해서 보여주는역할
import requests
 
#pprint(html.text)
 
#pprint(soup)
 
data1 = soup.find('div',{'class':'detail_box'})#영역 추출
#pprint(data1)
 
data2 = data1.findAll('dd')
#pprint(data2[0])
 
find_dust = data2[0].find('span',{'class':'num'})
 

.text를 사용하였습니다. 결과는 다음과 같습니다. 

 

이렇게 네이버 날씨 사이트에서 미세먼지 데이터를 추출하는 방법에 대해 알아봤습니다.

 

 

 

python 공부 중에 있습니다. 잘못된 정보가 있으면 댓글에 남겨주시킬 부탁드립니다. 한번 더 배우겠습니다.  

감사합니다. 

'Language > Python기초' 카테고리의 다른 글

2. Anaconda - JupyterNotebook 설치하기  (0) 2019.07.15
0. 파이썬 레시피(1)  (0) 2019.07.07