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

[Django] 코호 - 실시간 코인 호재 모음 PROC 8

모영이 2021. 3. 29. 17:21

일주일만에 돌아왔당. 소마 면접을 준비해야 했기 때문에 신경을 하나도 못썼다. 그렇지만 오늘부터 다시 시작. 이번주 배포가 목표다. 부족하지만 일단 배포하고 피드백 받고 업데이트 해나가는게 더 빠를 것 같아서 그렇게 정했다. 내가 쉬는 동안 친구가 웹 프론트를 많이 수정했다. 내가 수정한게 아니니깐 나중에 허락맡고 올리도록 하겠다.

 

해결한 문제

Django ORM과 크롤링 파이썬 파일 연결

아래의 사이트에서 참고했다. 캡쳐한 결과는 조금 신나서 막했었다.

beomi.github.io/2017/03/01/HowToMakeWebCrawler-Save-with-Django/

 

마주친 문제

솔직히 아직 장고 사용법을 잘 모르겠다. 하지만 계속 이렇게 하다보면 언젠가는 알지 않을까 싶었다.

 

해결 해야 할 문제

이제 다른 사이트 크롤링으로 넘어가야겠다. 그리고 여기서 발생할 문제를 예측하자면 멀티프로세스 적용할 때 백퍼 한번 걸릴 것 같다.

 

전체코드

import json
import os
import sys
from urllib.request import urlopen
from bs4 import BeautifulSoup
import multiprocessing
import time
import re
import os
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "websaver.settings")
import django
django.setup()
from parsed_data.models import BlogData


month = {'Jan': 1, 'Feb': 2, 'Mar': 3, 'Apr': 4, 'May': 5, 'Jun': 6, 'Jul': 7, 'Aug': 8, 'Sep': 9, 'Oct': 10, 'Nov': 11,
         'Dec': 12}


def getPageNumberFromcoinmarketcal():
    html = urlopen("https://coinmarketcal.com/en/")
    soup = BeautifulSoup(html, "html.parser")
    coin_maxpage_data = soup.select("a[class='page-link rounded']").pop()
    coin_maxpage = re.findall("\d+", str(coin_maxpage_data))
    return int(coin_maxpage.pop())


def packingDataFromcoinmarketcal(page_number, result):
    proc = os.getpid()
    url = "https://coinmarketcal.com/en/" + "?page=" + str(page_number)
    html = urlopen(url)

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

    # 정보 -> 이름, 호재 시간, 추가된 시간, 제목, 상세내용
    coin_key_data = soup.select("article.col-xl-3.col-lg-4.col-md-6.py-3 > div.card.text-center > div.card__body > a.link-detail")
    coin_name_data = soup.select("article.col-xl-3.col-lg-4.col-md-6.py-3 > div.card.text-center > div.card__body > h5.card__coins > a.link-detail")
    coin_goodnewstime_data = soup.select("h5[class = 'card__date mt-0']")
    coin_addedtime_data = soup.select("p[class = 'added-date']")
    coin_title_data = soup.select("article.col-xl-3.col-lg-4.col-md-6.py-3 > div.card.text-center > div.card__body > a.link-detail > h5.card__title.mb-0.ellipsis")
    coin_detail_data = soup.select("p[class = 'card__description']")

    min_len = min(len(coin_name_data), len(coin_goodnewstime_data), len(coin_addedtime_data), len(coin_title_data),
                  len(coin_detail_data))

    # 전처리 이름[이름, 태그], 호재 시간[년, 월, 일], 추가된 시간[년, 월, 일], 제목[문자열], 상세내용[문자열]
    # 전처리 후 패킹
    for i in range(0, min_len):
        #딕셔너리 키 값
        coin_key = str(coin_key_data[i])
        coin_key = coin_key[coin_key.find('href="') + 6 : coin_key.find('" title')]
        # 이름 전처리
        coin_name = ' '.join(coin_name_data[i].string.split())
        coin_name = [coin_name[0: coin_name.find('(') - 1], coin_name[coin_name.find('(') + 1: coin_name.find(')')]]
        # 호재 시간
        coin_goodnewstime = coin_goodnewstime_data[i].string.split()
        coin_goodnewstime = coin_goodnewstime[:3]
        coin_goodnewstime[1] = str(month[coin_goodnewstime[1]])
        coin_goodnewstime.reverse()
        # 추가된 시간
        coin_addedtime = coin_addedtime_data[i].string.split()
        coin_addedtime = coin_addedtime[1:]
        coin_addedtime[1] = str(month[coin_addedtime[1]])
        coin_addedtime.reverse()
        # 제목
        coin_title = str(coin_title_data[i].string)
        # 상세내용
        coin_detail = ' '.join(coin_detail_data[i].string.split())
        coin_detail = coin_detail[0 : len(coin_detail) - 1]

        # 패킹
        item_coin = {
            'name': coin_name,
            'goodnewstime': coin_goodnewstime,
            'addedtime': coin_addedtime,
            'title': coin_title,
            'detail': coin_detail
        }
        result[coin_key] = item_coin


if __name__ == '__main__':
    start_time = time.time()
    manager = multiprocessing.Manager()
    result = manager.dict()
    indxs = [i for i in range(1, getPageNumberFromcoinmarketcal() + 1)]
    procs = []

    for i, v in enumerate(indxs):
        proc = multiprocessing.Process(target=packingDataFromcoinmarketcal, args=(v, result))
        procs.append(proc)
        proc.start()

    for proc in procs:
        proc.join()

    for t, l in result.items():
        BlogData(title=t, link=l).save()