홍카나의 공부방

코인마켓캡(Coinmarketcap) API를 이용한 데이터 수집 본문

[Special Articles]

코인마켓캡(Coinmarketcap) API를 이용한 데이터 수집

홍문관카페나무 2024. 6. 16. 15:04

 

암호화폐 데이터를 수집하는 데에는 여러가지 방법이 있습니다. 그 중 하나는 코인마켓캡(coinmarketcap)에서 정보를 얻는 것입니다. 바이낸스나 업비트에서 암호화폐의 데이터를 수집하려면 그 거래소의 historical/realtime 가격 데이터 밖에 수집하지 못하는 등 해당 거래소에 상장된 암호화폐 데이터만 수집할 수 있다는 특징이 있습니다.

 

단일 거래소만의 가격 데이터만으로 충분하다면 사실 binance나 upbit의 API를 이용하면 됩니다. 그러나 코인이 상장된 여러 거래소의 가격을 합산한 평균 가격 데이터를 수집하길 원하거나, DEX에만 올라가있는 코인의 가격 데이터를 수집하길 원하거나, 가격 데이터가 아닌 다른 데이터도 수집하길 원한다면 코인마켓캡에서 수집하면 됩니다.

 

https://coinmarketcap.com/

 

Cryptocurrency Prices, Charts And Market Capitalizations | CoinMarketCap

Top cryptocurrency prices and charts, listed by market capitalization. Free access to current and historic data for Bitcoin and thousands of altcoins.

coinmarketcap.com

 


 

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 마이페이지에서 바로 확인할 수 있습니다.

API Key 확인

 

 

그 다음 포스트맨에서 다음과 같이 시도합니다.

postman으로 GET 요청을 날려본 응답

 

현재 상장된 암호화폐의 데이터를 응답으로 보내온 것을 확인할 수 있습니다.

반응형