프로젝트/COHO - 코인 호재 캘린더

[COHO] (React.js, Django) 코인 거래소 크롤링

모영이 2021. 5. 25. 17:46

체크 포인트 03 - Python 크롤링

우선 거래소별 정렬을 하기 위해서 거래소별 코인 종목 리스트가 필요했다. 하지만 업비트를 제외한 국내 거래소에서는 api로 종목을 알수 없는 구조여서 크롤링을 하기로 했다. 몇 가지 문제점은 5초간 blocking하는 거래소들이 많은데, 여기서 크롤링을 실패해서 다른 사이트를 찾아서 해결했다. 또한 동적으로 크롤링을 해야해서 selenium을 사용했는데 배포단계에서 이를 어떻게 할지 모르겠다.

 

총 4개의 거래소를 크롤링했다. 업비트, 빗썸, 코인원, 코인빗 이렇게 한국어 패치도 했다. 

 

업비트

from urllib.request import Request, urlopen
from bs4 import BeautifulSoup
import re
import requests

def do_crawl():
    url = "https://api.upbit.com/v1/market/all"

    querystring = {"isDetails":"false"}

    headers = {"Accept": "application/json"}

    response = requests.request("GET", url, headers=headers, params=querystring).json()
    
    # print(response)
    result = { }
    for item in response:
        coin_data = item
        # print(coin_data)
        coin_korean = coin_data['korean_name']
        coin_symbol = coin_data['market'][coin_data['market'].find('-') + 1 : ]
        # print(coin_symbol)
        result[coin_symbol] = coin_korean
        # result.append({ 'coinKorean': coin_korean, 'coinSymbol': coin_symbol })
    print("upbit do_crawl 완료")
    
    return result

 

빗썸

from urllib.request import Request, urlopen
from bs4 import BeautifulSoup
import re

def do_crawl():
    req = Request('https://www.bithumb.com/trade/order/BTC_KRW', headers={'User-Agent': 'Mozilla/5.0'})
    html = urlopen(req).read()

    # # 사이트에 문제가 있으면 함수 종료
    # if html.status != 200:
    #     return
    soup = BeautifulSoup(html, "html.parser")

    # 정보 -> 이름, 호재 시간, 추가된 시간, 제목, 상세내용
    crawl_data = soup.select("span[class = 'coinSymbol sort_coin']")

    result = { }
    for item in crawl_data:
        coin_data = str(item)
        # print(coin_data)
        coin_korean = coin_data[coin_data.find('data-sorting=') + 14 : coin_data.find('>') - 1]
        coin_symbol = coin_data[coin_data.find('">') + 2 : coin_data.find('/')]
        result[coin_symbol] = coin_korean
    print("bitsum do_crawl 완료")
    
    return result

 

코인빗

from selenium import webdriver 
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
import json

def do_crawl():
    options = webdriver.ChromeOptions()
    options.add_experimental_option('excludeSwitches', ['enable-logging'])

    driver = webdriver.Chrome(options=options, executable_path="./chromedriver")
    driver.implicitly_wait(3)
    driver.get("https://coinbit.co.kr/")
    crawl_data = driver.find_elements_by_class_name('coin-name')

    result = { }
    for item in crawl_data:
        coin_data = str(item.text)
        coin_data = " ".join(coin_data.split())
        coin_data = coin_data.split(' ')
        
        coin_symbol = coin_data.pop().replace("·","")
        coin_symbol = coin_symbol[:coin_symbol.find('/')]

        if(len(coin_data) == 1):
            result[coin_symbol] = coin_data[0]
        else:
            result[coin_symbol] = ""

    with open('coinbit.json', 'w', encoding='utf-8') as make_file:
        json.dump(result, make_file, indent="\t")

def read_json():
    with open('coinbit.json', 'r') as f:
        json_data = json.load(f)
        print("coinbit read_json 완료")
        return json_data

# do_crawl()
# read_json()

 

코인원

from selenium import webdriver 
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
import json

def do_crawl():
    options = webdriver.ChromeOptions()
    options.add_experimental_option('excludeSwitches', ['enable-logging'])

    driver = webdriver.Chrome(options=options, executable_path="./chromedriver")
    driver.implicitly_wait(3)
    driver.get("https://wisebody.co.kr/coinone")
    crawl_data = driver.find_elements_by_class_name('coinName')

    result = { }
    for item in crawl_data:
        coin_data = str(item.text)
        coin_data = " ".join(coin_data.split())
        coin_data = coin_data.split(' ')
        if(len(coin_data) == 2):
            result[coin_data[0]] = coin_data[1]
        else:
            result[coin_data[0]] = ""
    with open('coinone.json', 'w', encoding='utf-8') as make_file:
        json.dump(result, make_file, indent="\t")

def read_json():
    with open('coinone.json', 'r') as f:
        json_data = json.load(f)
        print("coinone read_json 완료")
        return json_data
# do_crawl()
# read_json()

 

다음할일 배포