훈훈훈

파이썬 : 암호 화폐 정보 크롤러(Crawler) 만들기 본문

파이썬/Python

파이썬 : 암호 화폐 정보 크롤러(Crawler) 만들기

훈훈훈 2020. 2. 11. 12:55

파이썬(python) 언어로 암호화폐(가상화폐) 정보를 가져오는 크롤러를 만들어보았다.

크롤러 대상 사이트는 암호화폐 시가총액을 확인할 수 있는 CoinMarketCap 으로 하였다.

 

# 사이트

https://coinmarketcap.com/ko/

위 사이트 접속 시 이름(Name), 시가총액(Volume), 가격(Price), 등의 정보를 확인할 수 있다.

이제 이 각각의 정보들을 크롤러를 이용해 수집하려고 한다.

 

# 전체 코드

전체 코드는 아래와 같으며 이제 부분 부분 살펴보려고 한다.

import requests
from bs4 import BeautifulSoup

req  = requests.get('https://coinmarketcap.com/ko/')
html = req.text
soup = BeautifulSoup(html, 'html.parser')


rank   = soup.select('tr > td.cmc-table__cell.cmc-table__cell--sticky.cmc-table__cell--sortable.cmc-table__cell--left.cmc-table__cell--sort-by__rank > div')
name   = soup.select('tr > td.cmc-table__cell.cmc-table__cell--sticky.cmc-table__cell--sortable.cmc-table__cell--left.cmc-table__cell--sort-by__name > div > a')
volume = soup.select('tr > td.cmc-table__cell.cmc-table__cell--sortable.cmc-table__cell--right.cmc-table__cell--sort-by__market-cap > div')
price  = soup.select('tr > td.cmc-table__cell.cmc-table__cell--sortable.cmc-table__cell--right.cmc-table__cell--sort-by__price > a')
change = soup.select('tr > td.cmc-table__cell.cmc-table__cell--sortable.cmc-table__cell--right.cmc-table__cell--sort-by__percent-change-24-h > div')

coin_info = []

for item in zip(rank, name, volume, price, change):
    coin_info.append(
        {
            'rank'  : item[0].text,
            'name'  : item[1].text,
            'volume': item[2].text,
            'price' : item[3].text,
            'change': item[4].text
        }
    )

for i in range(0,len(coin_info)):
    print(coin_info[i])

# 모듈

import requests
from bs4 import BeautifulSoup

크롤링을 하기위해 'requests' 'BeautifulSoup' 모듈을 사용하였다. 해당 모듈은 pip install로 다운 받을 수 있다.

requests 모듈은 HTTP 통신 요청을 할때 사용되며 BeautifulSoup은 HTML 데이터를 불러오고 가공할때 사용된다.

 

# 변수 

req    = requests.get('https://coinmarketcap.com/ko/')
html   = req.text
soup   = BeautifulSoup(html, 'html.parser')

rank   = soup.select('tr > td.cmc-table__cell.cmc-table__cell--sticky.cmc-table__cell--sortable.cmc-table__cell--left.cmc-table__cell--sort-by__rank > div')
name   = soup.select('tr > td.cmc-table__cell.cmc-table__cell--sticky.cmc-table__cell--sortable.cmc-table__cell--left.cmc-table__cell--sort-by__name > div > a')
volume = soup.select('tr > td.cmc-table__cell.cmc-table__cell--sortable.cmc-table__cell--right.cmc-table__cell--sort-by__market-cap > div')
price  = soup.select('tr > td.cmc-table__cell.cmc-table__cell--sortable.cmc-table__cell--right.cmc-table__cell--sort-by__price > a')
change = soup.select('tr > td.cmc-table__cell.cmc-table__cell--sortable.cmc-table__cell--right.cmc-table__cell--sort-by__percent-change-24-h > div')

먼저 CoinMarketCap 웹 사이트로 request 후 반환되는 response 값을 text로 받은 후 파이썬에서 해석할 수 있게 'html parser'를 사용하였다.

번외로 BeautifulSoup으로 html 코드를 파싱할때 가장 속도가 빠른 코드는 '변수명' = BeautifulSoup(req.text, "lxml") 방식으로 xml로 받는 것이 가장 빠르지만 이렇게 하기 위해서는 lmxl 모듈을 설치 ($ pip install lxml)를 해줘야하기때문에 html parser를 사용하였다.

 

그 다음 순위(rank), 이름(name), 시가총액(volume), 가격(price), 가격변화율(change) 변수를 반들어 각각 해당하는 HMTL 코드를 담은 후 soup.select( ) 메서드를 사용하여 원하는 정보를 추출하였다. 해당 모듈로 CSS selector를 찾아 HTML 요소를 추출할 수 있다.

 

각각의 변수에 담을 HTML 코드를 찾는 방법은 아래와 그림과 같이 F12(개발자 모드)에서 크롤링 대상 부분을 선택하면 자동으로 해당 코드 부분으로 이동하게된다. 그 다음 해당 부분을 Select Copy 후 원하는 변수에 담고 print( )로 찍어보면 원하는 정보가 추출된 것을 확인할 수 있다. 

아래 그림과 같이 Copy 항목에서 Copy Selector 부분을 선택하면된다.

 

# 데이터 가공

coin_info = []

for item in zip(rank, name, volume, price, change):
    coin_info.append(
        {
            'rank'  : item[0].text,
            'name'  : item[1].text,
            'volume': item[2].text,
            'price' : item[3].text,
            'change': item[4].text
        }
    )

for i in range(0,len(coin_info)):
    print(coin_info[i])

이제 클롤링한 데이터를 가공하기 위해 다음과 같이 for 문으로 리스트에 담을 수 있다.

'.text' 를 하는 이유는 원하는 텍스트 데이터만 추출하기 위해서다. 해당 기능을 사용을 안할 시 다음과 같이 데이터가 파싱된 것을 볼 수 있다.

 

# 실행 

(base) Waveui-MacBookPro:09.크롤링 wave$ python ./my_test2.py
{'rank': '1', 'name': 'Bitcoin', 'volume': '$177,935,303,199', 'price': '$9,770.88', 'change': '-3.43%'}
{'rank': '2', 'name': 'Ethereum', 'volume': '$24,165,305,272', 'price': '$220.39', 'change': '-3.11%'}
{'rank': '3', 'name': 'XRP', 'volume': '$11,823,692,147', 'price': '$0.270512', 'change': '-3.83%'}
{'rank': '4', 'name': 'Bitcoin Cash', 'volume': '$8,143,875,269', 'price': '$445.71', 'change': '-0.50%'}
{'rank': '5', 'name': 'Bitcoin SV', 'volume': '$6,400,072,773', 'price': '$350.32', 'change': '1.46%'}
{'rank': '6', 'name': 'Litecoin', 'volume': '$4,704,889,560', 'price': '$73.45', 'change': '-4.30%'}
{'rank': '7', 'name': 'Tether', 'volume': '$4,639,730,322', 'price': '$0.999432', 'change': '-0.49%'}
{'rank': '8', 'name': 'EOS', 'volume': '$4,618,164,824', 'price': '$4.85', 'change': '-1.95%'}
...
{'rank': '98', 'name': 'Energi', 'volume': '$48,022,028', 'price': '$1.85', 'change': '-5.75%'}
{'rank': '99', 'name': 'Huobi Pool Token', 'volume': '$47,848,035', 'price': '$0.009497', 'change': '28.08%'}
{'rank': '100', 'name': 'Aion', 'volume': '$47,700,628', 'price': '$0.121953', 'change': '-12.32%'}

해당 코드를 실행하면 다음과 같이 정상적으로 데이터를 파싱해오는 것을 볼 수 있다.

Comments