본문으로 바로가기

Python을 이용한 데이터 시각화

category Python/python 2020. 11. 3. 16:33

아나콘다 설치하기

2020/10/13 - [잡학] - 아나콘다(Ananconda) 설치

 

 

빅 데이터(Big Data)

 : 딥러닝 - 머신 러닝을 가장 최적화된 학습 방법.알파고

 

 : 스트레이핑 - 웹 사이트에 있는 특정 정보를 추출하는 기술

 : 크롤링 - 프로그램이 웹 사이트를 정기적으로 돌며 정보를 추출하는 기술

 

urllib

 : Http, Ftp 프로토콜을 통해서 다운받고 사용할 수 있게 도와주는 라이브러리

 

request 모듈

 : 웹 사이트에 있는 데이터에 접근하게 해주는 모듈

 

urlretrieve 함수

 : 웹 상에 자료를 다운로드할 수 있게 도와주는 함수

 

# urllib URL을 다루는 모듈을 모아놓은 패키지
# urllib 패키지에 있는 모듈 중에서 request 모듈을 이용하는데
# request 모듈 안에 urlretrieve()함수를 사용한다

# 파이썬에서 모듈을 불러올 때는 import 명령을 사용한다.
import urllib.request

# 다음 로고 이미지 경로(다음 페이지에서 f12 개발자모드로 복사해옴)
url = "https://t1.daumcdn.net/daumtop_chanel/op/20200723055344399.png"
imgName = "d:\pySrc\daum.png"

urllib.request.urlretrieve(url, imgName) # urlretrieve(URL, 저장할 파일 경로)

print("다운로드 완료 되었습니다.")

 

import urllib.request

url = "https://t1.daumcdn.net/daumtop_chanel/op/20200723055344399.png"
imgPath = "d:\pySrc\daum2.png"

downImg = urllib.request.urlopen(url).read()

# 파일로 저장하는 과정
# f = open("a.txt", "w")
# f.write("테스트로 파일에 내용을 적습니다.")
# f.close()

# 위의 과정을 with 문으로 간단하게 표현한다.

# with open("a.txt", "w") as f:
# f.write("테스트로 파일에 내용을 적습니다.")

with open(imgPath, "wb") as f: # w는 쓰기모드 b는 바이너리 모드(이미지)
    f.write(downImg)

print("이미지 다운로드 완료")

 

 

기상청

www.weather.go.kr/weather/forecast/mid-term-rss3.jsp

 

 : rss - 데이터만 저장되어 있는 파일

 

 : 제주도의 날씨

www.weather.go.kr/weather/forecast/mid-term-rss3.jsp?stnId=184

   - 해당 지역의 stnId를 알면 해당 지역의 정보만 볼 수 있다.

 

 : python을 사용해서 출력

import urllib.request
import urllib.parse    # url을 인코딩하기 위해 불러오는 모듈

rssUrl = "https://www.weather.go.kr/weather/forecast/mid-term-rss3.jsp"
# 매개변수 지역별 코드를 지정하는 변수
# sntId 코드 -> 108:전국, 109:서울/경기도, 105:강원도, 131:충청북도
#               133:충청남도, 146:전라북도, 156:전라남도, 143:경상북도
#               159:경상남도, 184:제주도

values = {'stnId': '184'}

params = urllib.parse.urlencode(values)

url = rssUrl + "?" + params

print("url = ", url)

data = urllib.request.urlopen(url).read()
text = data.decode("UTF-8")

print(text)

 

입력 받은 숫자로 출력

import sys
import urllib.request as req # urllib.request를 req로 사용하겠다. as(alias)
import urllib.parse as parse   # url을 인코딩하기 위해 불러오는 모듈

# 매개변수 지역별 코드를 지정하는 변수
# sntId 코드 -> 108:전국, 109:서울/경기도, 105:강원도, 131:충청북도
#              133:충청남도, 146:전라북도, 156:전라남도, 143:경상북도
#               159:경상남도, 184:제주도

#명령줄 인수가 제대로 입력되었는지 확인
if len(sys.argv) <= 1: # 명령줄 인수가 1이하이면 오류 메세지 출력
    print("사용법: python 인수1 인수2")
    sys.exit()

regionCode = sys.argv[1]

rssUrl = "https://www.weather.go.kr/weather/forecast/mid-term-rss3.jsp"

values = {'stnId': regionCode}

params = parse.urlencode(values)

url = rssUrl + "?" + params

print("url = ", url)

# RSS 데이터를 다운로드
data = req.urlopen(url).read()
text = data.decode("UTF-8")
print(text)

 

 

BeautifulSoup 설치

 : cmd 관리자 모드로 실행

pip3 install BeautifulSoup4
pip install BeautifulSoup4

 : python에서 확인

   - 아무것도 안뜨면 정상. 오류뜨면 비정상

 : 데이터를 다운로드는 할 수 없으나 데이터를 분석할 수 있음

 : 위의 기술과 같이 사용하여 데이터 다운과 분석을 함께 함

from bs4 import BeautifulSoup

html = """
<html>
    <body>
        <h1>스크래핑 연습</h1>
        <p>웹페이지를 분석해보기</p>
        <p>데이터 정제하기</p>
    </body>
</html>
"""

# html 분석하기
soup = BeautifulSoup(html, 'html.parser')

# 원하는 요소 접근하기
h1 = soup.html.body.h1
p1 = soup.html.body.p
p2 = p1.next_sibling.next_sibling
test = p1.next_sibling

# 원하는 요소의 내용을 추출하기
print("h1 = ", h1.string)
print("p = ", p1.string)
print("p = ", p2.string)
print("test = ", test.string)

 

 : find( )

   - 하나의 요소의 값을 읽어옴

   - html id 속성 값을 가지고 올 수 있음

from bs4 import BeautifulSoup

html = """
<html>
    <body>
        <h1 id="title">스크래핑 연습</h1>
        <p id="subTitle">웹페이지를 분석해보기</p>
        <p>데이터 정제하기</p>
    </body>
</html>
"""

# html 분석하기
soup = BeautifulSoup(html, 'html.parser')

# find() 메서드를 이용한 데이터 추출하기
title = soup.find(id = "title")
subTitle = soup.find(id = "subTitle")
content = subTitle.next_sibling.next_sibling

print("title = ", title.string)
print("subTitle = ", subTitle.string)
print("content = ", content.string)

 

 : find_all( )

   - 전체 데이터를 읽어오기

from bs4 import BeautifulSoup

html = """
<html>
    <body>
        <ul>
            <li><a href="http://www.naver.com">네이버</a></li>
            <li><a href="http://www.daum.net">다음</a></li>
        </ul>
    </body>
</html>
"""

# html 분석하기
soup = BeautifulSoup(html, 'html.parser')

# find_all() 메서드를 사용
links = soup.find_all("a")

for a in links:
    href = a.attrs['href']
    text = a.string
    print(text, ">", href)

 

 : find 함수를 사용해서 기상청 title과 wf만 뽑기

import urllib.request as request
import urllib.parse as parse
from bs4 import BeautifulSoup

rssUrl = "https://www.weather.go.kr/weather/forecast/mid-term-rss3.jsp"

print("url = ", rssUrl)

data = request.urlopen(rssUrl).read()

# html 분석하기
soup = BeautifulSoup(data, "html.parser")

title = soup.find("title")
print(title.string)
wf = soup.find("wf")
print(wf.string)

 

CSS 선택자를 이용한 스크레이핑

 : CSS  - Web에서 디자인을 담당

 : id - #으로 표현

 : class - .으로 표현

 : select_one() - CSS 선택자로 요소 하나의 선택자로 요소 하나를 추출

 : select() CSS - 선택자로 요소 여러 개를 리스트로 추출

 

from bs4 import BeautifulSoup

# 분석 대상 HTML 문서
html = """
<html>
    <body>
        <div id = "LecList">
            <h1>데이터 과학</h1>
        </div>
        <div id = "lecture">
            <h1>빅데이터 분석 강좌</h1>
            <ul class = "subject">
                <li>R언어 강좌</li>
                <li>머신러닝을 위한 데이터 처리</li>
                <li>파이썬으로 익히는 딥러닝이론</li>
            </ul>
        </div>
    </body>
</html>
"""

# HTML 분석하기
soup = BeautifulSoup(html, "html.parser")

# CSS 쿼리로 데이터 추출하기
h1 = soup.select_one("div#lecture > h1").string
print("h1 = ", h1)

subjects = soup.select("div#lecture > ul.subject > li")

for i in subjects:
    print("li = ", i.string)

 

 

활용 연습 : R 언어 뽑기

from bs4 import BeautifulSoup

str = """
<ul id="itBook">
    <li id="web">PHP 언어</li>
    <li id="Mobile">Android 개발</li>
    <li id="DataScience">R 언어</li>
    <li id="Database">Oracle 12g</li>
    <li id="OS">Linux 배우기</li>
    <li id="JavaScript">ReactJs</li>
</ul>
"""

soup = BeautifulSoup(str, "html.parser")


print("01 : ", soup.ul.li.next_sibling.next_sibling.next_sibling.next_sibling.string)

print("02 : ", soup.select_one("li#DataScience").string)

print("03 : ", soup.select_one("li").next_sibling.next_sibling.next_sibling.next_sibling.string)

for b in soup.select("ul#itBook > li"):
    if "R 언어" in b:
        print("04 : ", b.string)
        break
        
print("05 : ", soup.select("ul#itBook > li#DataScience")[0].string)

      
print("06 : ", soup.find(id = "DataScience").string)

print("07 : ",  soup.find(string = "R 언어"))

print("08 : ", soup.find("li").next_sibling.next_sibling.next_sibling.next_sibling.string)

for c in soup.find_all("li"):
    if "R 언어" in c:
        print("09 : ", c.string)
        break
        
print("10 : ", soup.find_all(id = "DataScience")[0].string)

print("11 : ", soup.find_all(string = "R 언어")[0].string)

 

 

반응형

'Python > python' 카테고리의 다른 글

Selenium  (0) 2020.11.09
Web site 경로를 따라가 데이터 찾기  (0) 2020.11.06
예외 처리 사용하기  (0) 2020.10.20
클래스 상속 사용하기  (0) 2020.10.19
클래스 속성과 정적, 클래스 메서드 사용하기  (0) 2020.10.19