Crawling project
가상 화폐 가격 Crawling
- 데이터 수집의 개요
- 2017년 11월쯤 부터 가상화폐의 투자가 인기몰이를 하여, 많은 사람들이 투자를 하였고 2017년 12월에는 자고 일어나면 모든 가상화폐들이 약 2배 이상 올랐던 적이 있었다.
- 그 당시엔 가상화폐에 투자하지 않으면 바보라는 소리가 나올정도로 엄청난 투자효과를 가져왔었고, 결국엔 1 비트코인은 중형차 한대 가격까지 오르게 된다.
- 하지만 2018년 1월쯤부터 가격은 폭락하기 시작, 많은 사람들이 엄청난 손해를 보게 되었으며, 그때부터 소위 ‘존버’라는 단어가 유행되기 시작했다.
- 그 당시 많은 손해를 본 사람중 한명으로써 비트코인의 가격을 조금이라도 예측할 수 있었다면 (물론 힘들겠지만) 최소한 엄청난 손해는 보지 않았을 것으로 생각하였다.
- 일단 데이터부터 있어야, 무언가를 예측해볼수 있을것으로 판단되어 가상화폐를 크롤링해보도록 하였다.
데이터 수집의 계획 및 주기 작성
- 업비트
- 업비트라는 한국 거래소에서 제공하는 데이터로 크롤링을 하였다.
- 시간 단위와 일 단위로 크롤링 하는 코드를 작성하였다.
- 전체 코인과 지정코인, 그리고 코인의 리스트를 볼수 있게 코드를 작성하였다.
- 크롤링 하는 방법
- 일단위 (upbit_day.py)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80
import pandas as pd # version - 0.25.1 import numpy as np # version - 1.16.5 import requests # version - 2.22.0 import pymongo # version - 2.8.1 import getpass def call_code(): # coin 종류 가져오기 url = 'https://api.upbit.com/v1/market/all' response = requests.get(url) datas = response.json() # 데이터 프레임으로 변경 df = pd.DataFrame(datas) # market 기준 한화로 변경 coins_krw = df[df['market'].str.startswith('KRW')].reset_index(drop=True) return coins_krw def upbit_all(count): # 서버 접속 정보 확인 ip = input('서버ip를 입력하세요:') id_s = input('서버접속 id를 입력하세요:') pw = getpass.getpass('서버접속 pw를 입력하세요:') # server 연결 server = pymongo.MongoClient(f'mongodb://{id_s}:{pw}@{ip}:27017/') db = server.upbit_day # 마켓 코드 가져오기. url = 'https://api.upbit.com/v1/market/all' response = requests.get(url) datas = response.json() # 데이터 프레임으로 변경 df = pd.DataFrame(datas) # market 기준 한화로 변경 coins_krw = df[df['market'].str.startswith( 'KRW')].reset_index(drop=True) # 데이터프레임을 코드와 네임의 딕셔너리로 변경 a = coins_krw['market'].to_dict().values() b = coins_krw['english_name'].to_dict().values() coin_names = dict(zip(a, b)) # database에 저장(mongodb) for code, name in coin_names.items(): collection = db[name] response = requests.get( f'https://crix-api-cdn.upbit.com/v1/crix/candles/days?\ code=CRIX.UPBIT.{code}&count={count}&ciqrandom=1582871221736') datas = response.json() idx = collection.insert(datas) print(code, len(idx), end=" ") # 지정한 한개의 코인을 가져오는 함수 def upbit_coin(code, coin_englingsh_name, count): # 서버 접속 정보 확인 ip = input('서버ip를 입력하세요:') id_s = input('서버접속 id를 입력하세요:') pw = getpass.getpass('서버접속 pw를 입력하세요:') # server 연결 server = pymongo.MongoClient(f'mongodb://{id_s}:{pw}@{ip}:27017/') db = server.upbit_day # 지정된 코인 정보 가져오기 response = requests.get( f'https://crix-api-cdn.upbit.com/v1/crix/candles/days?\ code=CRIX.UPBIT.{code}&count={count}&ciqrandom=1582871221736') datas = response.json() # database에 저장(mongodb) collection = db[coin_englingsh_name] idx = collection.insert(datas) print(code, len(idx), end=" ")
- 시간 단위(upbit_hour.py)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108
import pandas as pd # version - 0.25.1 import numpy as np # version - 1.18.1 import requests # version - 2.22.0 import pymongo # version - 2.8.1 import getpass import time from datetime import datetime import getpass def call_code(): # coin 종류 가져오기 url = 'https://api.upbit.com/v1/market/all' response = requests.get(url) datas = response.json() # 데이터 프레임으로 변경 df = pd.DataFrame(datas) # market 기준 한화로 변경 coins_krw = df[df['market'].str.startswith('KRW')].reset_index(drop=True) return coins_krw def upbit_all(count): # 서버 접속 정보 확인 ip = input('서버ip를 입력하세요:') id_s = input('서버접속 id를 입력하세요:') pw = getpass.getpass('서버접속 pw를 입력하세요:') # server 연결 server = pymongo.MongoClient(f'mongodb://{id_s}:{pw}@{ip}:27017/') db = server.upbit_hour # 마켓 코드 가져오기. url = 'https://api.upbit.com/v1/market/all' response = requests.get(url) datas = response.json() # 데이터 프레임으로 변경 df = pd.DataFrame(datas) # market 기준 한화로 변경 coins_krw = df[df['market'].str.startswith( 'KRW')].reset_index(drop=True) # 데이터프레임을 코드와 네임의 딕셔너리로 변경 a = coins_krw['market'].to_dict().values() b = coins_krw['english_name'].to_dict().values() coin_names = dict(zip(a, b)) # database에 저장(mongodb) day = str(time.strftime('%Y-%m-%d', time.localtime(time.time()))) for code, name in coin_names.items(): collection = db[name] response = requests.get( f'https://crix-api-cdn.upbit.com/v1/crix/candles/minutes/60?\ code=CRIX.UPBIT.{code}&count={count}&to={day}T23:59:59Z&') datas = response.json() idx = collection.insert(datas) print(code, len(idx), end=" ") # 지정한 한개의 코인을 가져오는 함수 def upbit_coin(code, coin_englingsh_name, count): # 서버 접속 정보 확인 ip = input('서버ip를 입력하세요:') id_s = input('서버접속 id를 입력하세요:') pw = getpass.getpass('서버접속 pw를 입력하세요:') # server 연결 server = pymongo.MongoClient(f'mongodb://{id_s}:{pw}@{ip}:27017/') db = server.upbit_hour # 지정된 코인 정보 가져오기 day = str(time.strftime('%Y-%m-%d', time.localtime(time.time()))) response = requests.get( f'https://crix-api-cdn.upbit.com/v1/crix/candles/minutes/60?\ code=CRIX.UPBIT.{code}&count={count}&to={day}T23:59:59Z&') datas = response.json() # database에 저장(mongodb) collection = db[coin_englingsh_name] idx = collection.insert(datas) print(code, len(idx), end=" ") # 지정한 한개의 코인을 가져오는 함수 def upbit_coin(code, coin_englingsh_name, count): # 서버 접속 정보 확인 ip = input('서버ip를 입력하세요:') id_s = input('서버접속 id를 입력하세요:') pw = getpass.getpass('서버접속 pw를 입력하세요:') # server 연결 server = pymongo.MongoClient(f'mongodb://{id_s}:{pw}@{ip}:27017/') db = server.upbit_day # 지정된 코인 정보 가져오기 response = requests.get( f'https://crix-api-cdn.upbit.com/v1/crix/candles/days?\ code=CRIX.UPBIT.{code}&count={count}&ciqrandom=1582871221736') datas = response.json() # database에 저장(mongodb) collection = db[coin_englingsh_name] idx = collection.insert(datas) print(code, len(idx), end=" ")
- 일단위 (upbit_day.py)
- 코드 설명
- call_code() : 현재 거래중인 코인의 코드를 가져 옵니다.
- upbit_all(count) : 현재 거래중인 모든 코인의 가격(한화)정보를 가져옵니다.
- count : 입력값으로 가져올 데이터의 갯수를 입력합니다.
- ip = input(‘서버ip를 입력하세요:’) : 몽고디비에 연결할 서버ip를 입력합니다.
- id_s = input(‘서버접속 id를 입력하세요:’) : 서버접속의 id를 입력합니다.
- pw = getpass.getpass(‘서버접속 pw를 입력하세요:’) : 서버접속의 password를 입력합니다.
- upbit_coin(code, coin_englingsh_name, count) : 지정한 한개의 코인의 가격을 가져옵니다.
- code : call_code()의 market(code_name)을 지정하여 입력합니다.
- coin_englingsh_name : call_code()의 englingsh_name을 지정하여 입력합니다.
- count : 입력값으로 가져올 데이터의 갯수를 입력합니다.
- ip = input(‘서버ip를 입력하세요:’) : 몽고디비에 연결할 서버ip를 입력합니다.
- id_s = input(‘서버접속 id를 입력하세요:’) : 서버접속의 id를 입력합니다.
- pw = getpass.getpass(‘서버접속 pw를 입력하세요:’) : 서버접속의 password를 입력합니다.
서버에서 자동으로 활동하는 파일 - 시간단위 (upbit_hour_auto.py) ```python import pandas as pd # version - 0.25.1 import numpy as np # version - 1.16.5 import requests # version - 2.22.0 import pymongo # version - 2.8.1 from bs4 import BeautifulSoup # version - 4.8.0 from datetime import datetime import getpass import time
def upbit_all(count):
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32
# server 연결 server = pymongo.MongoClient('mongodb://id:pw@ip:27017/') db = server.upbit_hour_auto # 마켓 코드 가져오기. url = 'https://api.upbit.com/v1/market/all' response = requests.get(url) datas = response.json() # 데이터 프레임으로 변경 df = pd.DataFrame(datas) # market 기준 한화로 변경 coins_krw = df[df['market'].str.startswith( 'KRW')].reset_index(drop=True) # 데이터프레임을 코드와 네임의 딕셔너리로 변경 a = coins_krw['market'].to_dict().values() b = coins_krw['english_name'].to_dict().values() coin_names = dict(zip(a, b)) # database에 저장(mongodb) day = str(time.strftime('%Y-%m-%d', time.localtime(time.time()))) for code, name in coin_names.items(): collection = db[name] response = requests.get( f'https://crix-api-cdn.upbit.com/v1/crix/candles/minutes/60?\ code=CRIX.UPBIT.{code}&count={count}&to={day}T23:59:59Z&') datas = response.json() idx = collection.insert(datas) # print(code, len(idx), end=" ") upbit_all(1) ```
- 일 단위(upbit_day_auto.py) ```python import pandas as pd # version - 0.25.1 import numpy as np # version - 1.16.5 import requests # version - 2.22.0 import pymongo # version - 2.8.1 import getpass
def upbit_all(count):
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30
# server 연결 server = pymongo.MongoClient('mongodb://id:pw@ip:27017/') db = server.upbit_day_auto # 마켓 코드 가져오기. url = 'https://api.upbit.com/v1/market/all' response = requests.get(url) datas = response.json() # 데이터 프레임으로 변경 df = pd.DataFrame(datas) # market 기준 한화로 변경 coins_krw = df[df['market'].str.startswith( 'KRW')].reset_index(drop=True) # 데이터프레임을 코드와 네임의 딕셔너리로 변경 a = coins_krw['market'].to_dict().values() b = coins_krw['english_name'].to_dict().values() coin_names = dict(zip(a, b)) # database에 저장(mongodb) for code, name in coin_names.items(): collection = db[name] response = requests.get( f'https://crix-api-cdn.upbit.com/v1/crix/candles/days?\ code=CRIX.UPBIT.{code}&count={count}&ciqrandom=1582871221736') datas = response.json() idx = collection.insert(datas) print(code, len(idx), end=" ")
upbit_all(1) ```
- 코드 설명
- upbit_all(count) : 함수가 실행되면 업비트의 모든 코인의 가격정보를 가져옴
- count : 가져올 데이터의 갯수를 입력
- columns 설명
- ‘code’ : 화폐의 코드
- ‘candleDateTime’ : 국제 표준시
- ‘candleDateTimeKst’ : 한국시
- ‘openingPrice’ : 시가
- ‘highPrice’ : 고가
- ‘lowPrice’ : 저가
- ‘tradePrice’ : 현재가격정보
- ‘candleAccTradeVolume’ : 누적체결량
- ‘candleAccTradePrice’ : 누적체결대금
- ‘timestamp’ : Unix 타임스탬프, 1970년 1월1일부터 얼마나 지났는지에 대한것
- ‘prevClosingPrice’ : 전일 종가 (UTC 0기준)
- ‘change’ : 전일 종가 대비 변화금액의 여부 (RISE 오름, EVEN 변화없음, FALL떨어짐)
- ‘changePrice’ : : 전일 종가 대비 변화금액 (절대값)
- ‘signedChangePrice’ : 부호가 있는 변화금액
- ‘changeRate’ : 전일 종가 대비 변화량 (절대값)
- ‘signedChangeRate’ : 부호가 있는 변화량
- 데이터 저장
- upbit_day.py : mongodb의 upbit_day에 저장됨
- upbit_day_auto.py : mongodb의 upbit_day_auto에 저장됨
- upbit_hour.py : mongodb의 upbit_hour에 저장됨
- upbit_hour_auto.py : mongodb의 upbit_hour_auto에 저장됨
- EDA
- 일일 최고점을 보았을때 최근 하향세인것을 확인할수 있었음
- 프로젝트 회고
- 업비트에서 respone해주는 형식이 json형식이라 어렵지 않게 한것 같다.
- 추후, 업비트말고 다른 가상화폐 사이트를 scrapy로 크롤링해야겠다.