일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- 데이터엔지니어링
- redshift
- TIL
- 데이터 엔지니어링
- PYTHON
- 종류
- AWS
- 가상환경
- 데이터 파이프라인
- http
- airflow
- 컴퓨터네트워크
- 컴퓨터 네트워크
- 파이썬
- Django
- 데이터 웨어하우스
- 데이터베이스
- TCP
- Docker
- S3
- airflow.cfg
- sql
- linux
- 데브코스
- dockerfile
- HADOOP
- 운영체제
- 자료구조
- 정리
- Go
- Today
- Total
홍카나의 공부방
코인마켓캡(Coinmarketcap) API를 이용한 데이터 수집 본문
암호화폐 데이터를 수집하는 데에는 여러가지 방법이 있습니다. 그 중 하나는 코인마켓캡(coinmarketcap)에서 정보를 얻는 것입니다. 바이낸스나 업비트에서 암호화폐의 데이터를 수집하려면 그 거래소의 historical/realtime 가격 데이터 밖에 수집하지 못하는 등 해당 거래소에 상장된 암호화폐 데이터만 수집할 수 있다는 특징이 있습니다.
단일 거래소만의 가격 데이터만으로 충분하다면 사실 binance나 upbit의 API를 이용하면 됩니다. 그러나 코인이 상장된 여러 거래소의 가격을 합산한 평균 가격 데이터를 수집하길 원하거나, DEX에만 올라가있는 코인의 가격 데이터를 수집하길 원하거나, 가격 데이터가 아닌 다른 데이터도 수집하길 원한다면 코인마켓캡에서 수집하면 됩니다.
requests를 사용한 접근 시도
데이터를 수집하는데 먼저 Python의 requests 패키지와 bs4 패키지를 이용한 웹 스크래핑을 시도했습니다. API를 이용하게 되면 Pricing 정책이 있을 수도 있고, 제가 구현하고자 하는 것은 일회성 데이터 수집으로, 스케줄링해서 계속 서버에 요청을 넣는 것도 아니니까요. 스크래핑으로도 충분하겠다 싶었습니다.
https://coinmarketcap.com/?page=1
코인마켓캡의 경우 page 파라미터를 숫자 단위로 넣어주면 기본적으로 100개의 암호화폐를 시가총액 순위별로 끊어서 나타내줍니다. 예를 들어서, page파라미터의 값이 2면 101위~200위의 암호화폐 정보가 나타납니다. 이를 이용해서 1000위 까지의 암호화페 이름을 수집하려고 했습니다. 아래는 파이썬의 동시성 프로그래밍(코루틴) 방식을 이용한 간단한 수집 코드 예시입니다.
from bs4 import BeautifulSoup
import requests
import time
def fetch(session, url):
with session.get(url) as response:
html = response.text
soup = BeautifulSoup(html, 'html.parser')
ticker = soup.find_all('p', 'sc-71024e3e-0 ehyBa-d')
result = []
for tic in ticker:
result.append(tic.text)
print(len(result), result)
def main():
BASE_URL = "https://coinmarketcap.com/"
urls = [f"{BASE_URL}?page={i}" for i in range(1, 10)]
with requests.Session() as session:
[fetch(session, url) for url in urls]
if __name__ == "__main__":
start = time.time()
main()
end = time.time()
print(f"{end - start:.5f} sec.")
soup.find_all에 들어가는 파라미터는 해당 url에서 암호화폐의 이름이 html의 위 태그에 들어가있어서 저렇게 수집을 하였습니다. 사용자에 따라서 태그와 클래스명은 바뀔 수 있음을 유념 바랍니다.
async/await 를 이용한 비동기 방식을 이용하지 않아도 됩니다. 비동기 방식으로 코드를 작성하여 수집을 하게 되면 1위부터 내림차순으로 response를 받는 것을 보장하지 않으므로.. 정렬 코드를 또 작성해줘야 합니다. 동기적으로 코드를 작성해도 그렇게 큰 시간 차이가 나지 않습니다.
그런데 출력을 해보면 1페이지당 100개의 코인 정보가 표시되니까 100개를 긁어와야 하는데, 위와 같이 10개의 데이터만 긁어옴을 확인하실 수 있습니다. 코인마켓캡은 아마 동적 로딩을 활용하는 것 같습니다. 이는 웹 페이지가 로드 될 때 초기 일부 데이터만 로드하고, 사용자가 스크롤을 내리면 추가적으로 데이터를 가져오는 방식을 의미합니다. 이러면 단순하게 html을 파싱해서 데이터를 가져올 수 없습니다.
그래서 API를 활용하기로 결정했습니다. 코인마켓캡의 API 가격 정책 중 Free를 살펴보면 한 달에 10,000 call credit을 가지는 것을 볼 수 있습니다. 저는 무료 사용으로 충분하므로, BASIC API를 사용하기로 했습니다.
코인마켓캡 API 사이트에 가입하고, 아래 api docs를 활용하여 가격 데이터를 가져와봅시다.
https://coinmarketcap.com/api/documentation/v1/
그리고 요청시 header에 본인의 API Key를 포함시켜야 하는데, 본인의 코인마켓캡 API 마이페이지에서 바로 확인할 수 있습니다.
그 다음 포스트맨에서 다음과 같이 시도합니다.
- url : https://pro-api.coinmarketcap.com/v1/cryptocurrency/listings/latest
- (헤더) X-CMC_PRO_API_KEY : 위 페이지의 API Key
- (헤더) Accept : {본인이 받을 response 형식 : 예를 들어서 application/json}
현재 상장된 암호화폐의 데이터를 응답으로 보내온 것을 확인할 수 있습니다.
'[Special Articles]' 카테고리의 다른 글
[Airflow Special] 비트코인 가격 수집 DAG 예시로 알아보는 Trigger Rule (1) | 2024.03.23 |
---|