반응형
shanepark.tistory.com/48?category=1191756
이전에 mysql 용으로 작성한 코드를, MongoDB에서 사용할 수 있게 약간의 수정을 했습니다.
RDBMS와 달리 NoSQL에서는 테이블을 미리 만들어주거나 설정해 주지 않아도 쉽게 데이터를 넣을 수 있어 훨씬 편리합니다.
'''
Created on 17 Mar 2021
@author: shane
stock table에 데이터 넣기. date는 yyyymmddHHMM 총 12 자리
MongoDB에 크롤링한 데이터 넣어보기
'''
from datetime import datetime
import time
from bs4 import BeautifulSoup
import pymongo
import requests
myclient = pymongo.MongoClient("mongodb://localhost:27017")
mydb = myclient["python"]
mycol = mydb["mystock"]
for i in range(20):
response = requests.get('https://www.sedaily.com/Stock/quote')
txt = response.text
soup = BeautifulSoup(txt, 'html.parser')
count = 0
timevar = datetime.now().strftime("%Y%m%d%H%M%S")
for info in soup.select('.tbody'):
count += 1
name = info.dt.text
price = int(info.dd.span.text.replace(",",""))
stockId = info.dd['id']
stockId = stockId[-6:len(stockId)]
mydict = {
"s_code" : stockId,
"s_name" : name,
"s_price" : price,
"in_date" : timevar
}
mycol.insert_one(mydict)
print("{0}개 column 등록 완료, {1}번 반복 완료.".format(count,i+1))
time.sleep(20)
print("프로그램 종료")
20초에 한번씩 20번 크롤링을 하게 프로그램을 작성했습니다. 6분 가량 걸리는데, sleep 타임을 60 으로 수정하고 for i in range() 부분의 range를 10 으로 수정하면 1분에 한번씩 10분동안 데이터를 받아오게 수정할 수 있습니다.
실행 한 뒤에 , 조금 기다리면 데이터들이 DB에 모두 입력이 됩니다.
이렇게 데이터를 입력하면 Key 값이 한번 쿼리를 넣을때마다 888개가 입력이 되는 단점이 있습니다.
위에서 보이듯 한개의 Object가 5개의 fields를 가지고 있습니다.
애초에 insert할때 888개의 데이터를 컬럼명으로 ( + in_date 컬럼 한개 더) , 금액을 value로 해준다면, 더 좋은 구조를 가질 수 있습니다.
새로 코드를 작성해 보았습니다.
'''
Created on 17 Mar 2021
@author: shane
stock table에 데이터 넣기. date는 yyyymmddHHMM 총 12 자리
MongoDB에 크롤링한 데이터 넣어보기
'''
from datetime import datetime
import time
from bs4 import BeautifulSoup
import pymongo
import requests
myclient = pymongo.MongoClient("mongodb://localhost:27017")
mydb = myclient["python"]
mycol = mydb["mystock02"]
for i in range(20):
response = requests.get('https://www.sedaily.com/Stock/quote')
txt = response.text
soup = BeautifulSoup(txt, 'html.parser')
count = 0
timevar = datetime.now().strftime("%Y%m%d%H%M%S")
mydict = {"in_date" : timevar}
mycol.insert_one(mydict)
for info in soup.select('.tbody'):
count += 1
name = info.dt.text
price = int(info.dd.span.text.replace(",",""))
myquery = {"in_date" : timevar}
myValue = {"$set": {name : price}}
mycol.update_one(myquery,myValue)
print("{0}개 주식 정보 등록 완료, 크롤링 {1}회 반복 완료.".format(count,i+1))
time.sleep(20)
print("프로그램 종료")
바로 코드를 실행해 보았습니다.
총 888개의 주식 이름 + _id, in_date 해서 총 890 개의 fields를 가지고 있는 것을 확인 할 수 있습니다.
이렇게 되면 key 값이 훨씬 적어지니 관리하기가 좋습니다.
이어서는 이 데이터들을 이용해 또 다시 그래프를 그려보도록 하겠습니다.
반응형
'Programming > Python' 카테고리의 다른 글
파이썬 Flask 사용법 - 1) Hello Flask (0) | 2021.03.23 |
---|---|
pymongo로 MongoDB에서 크롤링한 데이터 불러와 pyplot으로 3D 그래프 그리기 (0) | 2021.03.22 |
pymongo 이용 Python에서 MongoDB 사용하기, CRUD 예제 (0) | 2021.03.22 |
python 이용해 3차원 주식 그래프 그리기(2) (1) | 2021.03.19 |
python 이용해 3차원 주식 그래프 그리기 (0) | 2021.03.19 |