데이터 수집은 데이터를 데이터 웨어하우스 또는 기타 저장 솔루션에 넣기 전에 데이터를 수집하고, 필터링하고, 정리하는 과정으로되어 있다.
빅데이터의 수집은 일반적으로 네 가지 V로 설명된다.
- Volume(규모): 데이터의 양
- Velocity(속도): 데이터가 생성되고 처리되는 속도
- Variety(다양성): 데이터의 형식과 종류
- Value(가치): 데이터의 유용성과 중요성
데이터 수집은 데이터를 아래의 방법 중 하나로 얻을 수 있다.
1. 무료로 찾거나 데이터를 구매하는 방법
2. 전문 웹 스크래핑 기술을 사용하거나 간단히 복사 붙여넣기 하는 방법
3. 판매 보고서와 같은 내부 소스 또는 외부 저널이나 웹사이트에서 데이터를 얻는 방법
이 과정을 통해 수집된 데이터는 분석을 위해 데이터 웨어하우스 또는 다른 저장소에 저장된다.
가상환경 설정
가상환경을 만들어야하는 이유는 다음을 참고하면 된다
https://leedominico.tistory.com/2
아나콘다 jupyter notebook 가상 환경 만들기
먼저 왜 가상 환경을 만들어야 할까? 기본적으로 파이썬이나 다른 라이브러리들은 수시로 업데이트가 되는데 이러한 것들 중에서 서로 얽혀있는 경우가 있어서 원래는 잘 되다가 나중에 업데이
leedominico.tistory.com
# 가상 환경 설정
python3 -m pip install --user -U virtualenv
virtualenv venv
source venv/bin/activate
크롤링
크롤링은 일반적으로 대규모 데이터 세트를 다루는 것을 의미하며, 이 경우 사용자가 자체 크롤러(또는 봇)를 개발하여 웹 페이지의 가장 깊은 부분까지 크롤링한다.
크롤링을 통해 수집된 데이터는 다음과 같은 특징을 가진다.
- 대규모 데이터 처리: 수집해야 할 데이터의 양이 매우 크기 때문에, 효율적인 데이터 처리 및 저장이 필요하다.
- 자체 크롤러 개발: 상용 도구 대신, 특정 요구 사항에 맞춘 맞춤형 크롤러를 개발하여 사용한다.
- 깊은 웹 탐색: 표면적인 웹 페이지뿐만 아니라, 로그인 후 접근 가능한 페이지, 동적 콘텐츠 등 깊숙한 곳의 데이터까지 수집한다.
이를 통해 매우 다양한 소스에서 방대한 양의 데이터를 자동으로 수집할 수 있으며, 이러한 데이터는 분석 및 연구에 중요한 자원이 된다.
아래는 기상청에서 크롤링 하는 예시로 아래의 RSS서비스를 이용해서 정보를 받아올 수 있다.
https://www.weather.go.kr/w/pop/rss-guide.do
RSS 서비스 안내
RSS(Really Simple Syndication, Rich Site Summary)란 블로그처럼 컨텐츠 업데이트가 자주 일어나는 웹사이트에서, 업데이트된 정보를 쉽게 구독자들에게 제공하기 위해 XML을 기초로 만들어진 데이터 형식입
www.weather.go.kr
#! /usr/bin/env python3
import sys
import urllib.request as req
import urllib.parse as parse
if len(sys.argv) <= 1:
print("USAGE: download-forecast-argv <Region Number>")
sys.exit()
regionNumber = sys.argv[1]
url = f"http://www.kma.go.kr/weather/forecast/mid-term-rss3.jsp?stnId={regionNumber}"
data = req.urlopen(url).read()
text = data.decode("utf-8")
print(text)
코드 앞에 주석처리된 부분은 shebang으로 이는 어떤 언어로 쓸지, 스크립트 파일이 어디서 돌아갈지 등을 미리 선언 한다.
스크래핑
스크래핑은 데이터를 추출하는 과정을 의미하며, 꼭 웹에서만 이루어지지 않고 로컬 머신, 데이터베이스, 또는 인터넷에서 정보를 추출하는 것을 포함한다.
인터넷에서의 경우, 단순히 페이지의 "다른 이름으로 저장" 링크를 통해 데이터를 저장하는 것도 데이터 스크래핑의 일부로 간주될 수 있다.
스크래핑의 주요 특징
다양한 소스: 로컬 파일 시스템, 데이터베이스, API, 웹 페이지 등 다양한 소스에서 데이터를 추출할 수 있다.
자동화: 반복적인 데이터 추출 작업을 자동화하여 효율성을 높인다.
다양한 도구 사용: Python의 BeautifulSoup, Scrapy 등 다양한 도구와 라이브러리를 사용하여 데이터를 스크래핑할 수 있다.
데이터 형식: HTML, XML, JSON 등 다양한 형식의 데이터를 처리할 수 있다.
BeautifulSoup은 HTML 및 XML 파일에서 데이터를 추출하는 데 사용되는 파이썬 라이브러리이다.
이 라이브러리는 선호하는 파서와 함께 작동하여 구문 분석 트리를 탐색, 검색 및 수정하는데 직관적인 방법을 제공한다.
이를 활용해 똑같이 기상청 사이트에서 스크래핑해 보면 다음과 같다.
import requests
from bs4 import BeautifulSoup
def main():
url = "http://www.kma.go.kr/weather/forecast/mid-term-rss3.jsp"
response = requests.get(url) # 기상청 사이트에 GET요청 보내고 응답 받음
soup = BeautifulSoup(response.content, 'html.parser') # 받은 응답을 HTML파서로 파싱하여 soup객체에 저장
# 모든 location태그에서 도시이름, 날짜, 시간을 가져옴
for location in soup.find_all('location'):
city = location.find('city').get_text()
for data in location.find_all('data'):
date_time = data.find('tmef').get_text()
if date_time.endswith("00:00"): # 만약 예보 시간이 00:00인 경우 정보 출력
weather = data.find('wf').get_text()
print(f"[{date_time}] {city} : {weather}")
if __name__ == "__main__":
main()
그 뿐만 아니라 네이버 증권에서 미국 달러 가격 스크래핑을 하면 다음과 같이 할 수 있다.
from bs4 import BeautifulSoup
import urllib.request as req
import ssl
import datetime
url = "https://finance.naver.com/marketindex/"
html = req.urlopen(url).read()
soup = BeautifulSoup(html, 'html.parser')
# 현재 날짜와 시간을 'YYYY-MM-DD HH:MM' 형식의 문자열로 변환하여 now 변수에 저장
now = datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S')
# CSS 선택자를 사용하여 HTML에서 현재 미국 달러 환율 값을 나타내는 span 태그를 선택
price = soup.select_one("#exchangeList > li.on > a.head.usd > div > span.value")
print("DATE: " + now + " 미 국 USD : " + price.string)
그리고 추가적으로 HTML문자열을 사용자가 정의한 다음에 해당하는 내용에서 원하는 부분을 정규식을 사용해서 추출할 수 있다.
#! /usr/bin/env python3
from bs4 import BeautifulSoup
import re
# HTML문자열 정의
html = """
<ul>
<li><a href="hoge.html">hoge</li>
<li><a href="https://example.com/fuga">fuga*</li>
<li><a href="https://example.com/foo">foo*</li>
<li><a href="https://example.com/aaa">ada</li>
</ul>
"""
soup = BeautifulSoup(html, 'html.parser')
href_reg = re.compile(r"^https://") # 정규식으로 https://d으로 시작하는 부분 찾기
for a in soup.find_all('a', href=href_reg):
print(a.attrs['href']) # 링크의 url출력
print(a.get_text()) # 링크 텍스트 출력