Programming/Python

pymongo와 BeautifulSoup 이용해서 python에서 크롤링 하기

📝 작성 : 2021.03.22  ⏱ 수정 : 
반응형

shanepark.tistory.com/48?category=1191756

 

python 이용해 3차원 주식 그래프 그리기

3차원 공간에 파이썬을 이용해 주식가격의 변동을 기록한 그래프를 그리는 프로그램을 작성해보았습니다. 일단 주식가격에 대한 데이터를 주기적으로 크롤링 해 와서 데이터베이스에 저장을

shanepark.tistory.com

 

이전에 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 값이 훨씬 적어지니 관리하기가 좋습니다.

이어서는 이 데이터들을 이용해 또 다시 그래프를 그려보도록 하겠습니다.

반응형