크롤링 데이터 다루기(코인 데이터-by.coinmarketcap) 비전공자 위한 1팁

데이터 다루기 실제 사이트 도전


API 로 코인마켓캡 크롤링

코인마켓캡 api 사용으로 코인 크롤링으로 따로 학습 복습을 해봤다.

url = 'https://pro-api.coinmarketcap.com/v1/cryptocurrency/listings/latest'
# 이 주소는 API DOCUMENTATION 에서 서버 url 을 제공해줘서 원하는 자료가 있는 주소 copy를 해왔다.

headers = {
    'Accepts': 'application/json',
    'X-CMC_PRO_API_KEY': 'API 키 할당 받아서 넣는 곳',
}
# 사이트를 읽어보니? 권고로 X-CMC로 request 를 받아야 크롤링이 가능하다로 받아들여졌다. 

parameter1 = {
  'start':'1',
  'limit':'20',
  'convert':'USD',
  'sort': 'market_cap',
  'sort_dir': 'desc',
}

parameter2 = {
  'start':'21',
  'limit':'40',
  'convert':'USD',
  'sort': 'market_cap',
  'sort_dir': 'desc',
  'price_max': '100'
}

# API free basic 쓰는 것이라면 월 credits 가 정해져 있다. (크롤링 할 때, endpoint 가 정해져 있고, parameter 안에서도 갯수가 정해져 있다.) : 파라미터 변수를 늘려본 이유

리밋(limit)을 처음부터 20~40 정도로 설정하고, ‘convert’를 미화(USD)가 아니라 원화로 각각 받아 처리할까 고민했지만, 요청(request)을 너무 많이 보내게 될 것 같아 다른 방법을 선택했다. 결국, 모든 데이터를 영어로 통일하되, 많이 사용하는 언어로 구성하기로 했다.

이 parameter 1, 2 안 데이터는 다른 사이트처럼 Tensor … 딕셔너리안

여기까지도 많은 난관이 있었다. 컴퓨터 뇌를 이해해보기란 조금 아직은 어색하다. 그래도 재미있어서 시간가는 줄 모르며 열심히 사이트를 뒤적거리며 데이터를 읽어봤다.

결과 가져와보기

response = requests.get(url, headers=headers, params=parameter1)
data = response.json()

response_2 = requests.get(url, headers=headers, params=parameter2)
data_2 = response.json()


# 드디어 자료 합치기

datas = data['data']+data_2['data']
df = pd.json_normalize(datas)

요청을 받아온 데이터를 처리해 데이터프레임으로 만들었다. 데이터프레임은 json_normalize 로 만들었다. 그러면 원래 딕셔너리안의 딕셔너리 안의 키가 있으면 자료구조상 (딕셔너리 안 딕셔너리라는 중첩) 오류가 같은 컬럼에 정리된 형태로 확인할 수 있었다.

아래 샘플을 보면,

변수[data][quote][USD]‘와 같은 깊이 있는 키에서 자료를 하나씩 추출해 데이터프레임에 넣어야 표를 눈으로 확인할 수 있었다. 하지만 json_normalize를 사용하면 이런 복잡한 작업 없이도 간단히 데이터를 정리할 수 있었다.

이 방법이 효과적이었던 이유는, 딕셔너리 중첩 구조를 평평하게 만들어 필요한 데이터만 깔끔하게 정리할 수 있기 때문이다. 이로 인해 후속 작업에서 데이터를 더 효율적으로 다룰 수 있었다.

그래서 출력을 할 때는, quote.USD.price 등 원하는 것을 읽어볼 수 있다. 크롤링을 하고 데이터를 보는 실습을 많이 안해봤는데 혼자 스스로 찾아가며 해보니 재미있다. 그래서 아래 출력해본 예시도 가져와 볼 수 있었다.

스스로 찾아가며 작업을 진행하니 꽤 재미있었다. 그래서 아래 출력 예시도 가져와 볼 수 있었다.

맨 오른쪽에 있는 컬럼명을 보면 .으로 구분되어 딕셔너리 안의 딕셔너리 구조가 컬럼으로 정리된 것을 확인할 수 있었다. 덕분에 복잡한 중첩 구조도 데이터프레임 형태로 한눈에 볼 수 있게 됐다. 이번에 크롤링한 사이트가 특정 코인마켓캡 API라서 이런 방식이 이곳에만 적용되는 건지 확신할 수는 없지만, ㅠㅠ 언젠가 다른 API에서도 실험해봐야겠다는 생각이 든다.


나보다 더 초보인 분을 위해서

headers = headers 에 관해

뭔지 모르고 그냥 따라 하기만 하는데도 정신이 없었다. 그래서 궁금했다. ‘headers = headers 뭐지…? 쌤 이게 무슨 뜻이에요?’

초보는 이 말을 들음 아니 비전공자!!는 몇 명이 그럴 것 같다. 실제로 몇 명 봤으니까. 나도 물어봤던 질문. 근데 선생님, 강사님들은 이 질문을 이해 못하신다. ㅠㅠ

“이게 뭐냐뇨? 어떤 것에 대한 질문인지 잘 모르겠어요. 다시 한 번 물어봐 줄래요?”라는 답변을 들을 때가 이 질문 말고도 완전 많다. 흐유.. 나만 그런건가 싶기도 했다.

requests.get 에서 인자로 headers 로 입력이 들어가야 하니까 이게 이거다 였던 것이다 ㅠㅠㅠ 이렇게 알려주실 분은 없었다. 그냥 문과생에 다른 일을 해오던 나에겐 뭐지 왜 이 단어 = 단어 이렇게 같은거를 뜬금없이 쓴거지? …. = 이거 뭐지?…. 가 된것이다. 한 줄 한 줄 자체가 새로운 반응?을 만드는 새로운 코드를 입력한다. 라는 틀에 박힌 생각에서 이제 벗어났다.


생각보다 블로그 쓰는게 쉽지 않다고 느껴진다. 꾸준함이 필요하고, 다들 자동화로 블로그를 쓴다는데 그건 사실 좋지 못한 방법이라 생각이 든다. 아이디어나 일부 몇 줄은 그렇게 하는게 가독성에 좋고 깔끔하지만 그 글들도 결국 알고리즘으로 태어난 글이라 자기도 컴퓨터 뇌에서 나왔구나 걸러 낼 것이라 생각이든다.

알고리즘은 결국 수학에서 나온 것이란 것인데 그 숫자가 결국 컴퓨터에서 글과 자료 그 외 모든게 숫자라니까 어쩔 수 없이 완전한 자동화는 블로그에 좋지 못한 영향이 되지 않을까? 가짜 글이라는 것으로..? 완전하지 않아도 적당히 활용은 좋다고 생각한다. 그러나 결국 활용해도 수정이 필요하고 검토가 필요한데, 생각보다 수정도 오래걸려서 처음부터 쓰는 것과 시간이 의외로 비슷하지 않을까?