아나콘다 설치하기
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 |