일주일만에 돌아왔당. 소마 면접을 준비해야 했기 때문에 신경을 하나도 못썼다. 그렇지만 오늘부터 다시 시작. 이번주 배포가 목표다. 부족하지만 일단 배포하고 피드백 받고 업데이트 해나가는게 더 빠를 것 같아서 그렇게 정했다. 내가 쉬는 동안 친구가 웹 프론트를 많이 수정했다. 내가 수정한게 아니니깐 나중에 허락맡고 올리도록 하겠다.
해결한 문제
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()
'프로젝트 > COHO - 코인 호재 캘린더' 카테고리의 다른 글
[Django] 코호 - 실시간 코인 호재 캘린더 PROC 10 (0) | 2021.04.01 |
---|---|
[Django] 코호 - 실시간 코인 호재 캘린더 PROC 9 (0) | 2021.03.30 |
[Django] 코호 - 실시간 코인 호재 모음 PROC 7 (0) | 2021.03.19 |
[Django] 코호 - 실시간 코인 호재 모음 PROC 6 (0) | 2021.03.19 |
[Django] 코호 - 실시간 코인 호재 모음 PROC 5 (0) | 2021.03.18 |