|
1
Korea Stock Crawl Code
import requests
from bs4 import BeautifulSoup
url = ' https://finance.naver.com/sise/sise_market_sum.nhn?sosok=0&page='
def get_data(page):
res = requests.get(url + str(page))
soup = BeautifulSoup(res.text, 'html.parser')
table = soup.find('table', {'class': 'type_2'})
return [{'Company': row.find_all('a')[0].text.strip(),
'Current Price': row.find_all('td')[1].text.strip(),
'Change': row.find_all('span')[1].text.strip(),
'Ratio': row.find_all('td')[3].text.strip(),
'Volume': row.find_all('td')[5].text.strip()}
for row in table.find_all('tr')[1:]]
# get data for first 10 pages
data = []
for page in range(1, 11):
data += get_data(page)
print(data)
# save data to csv file
import csv
with open('stock.csv', 'w', encoding='utf-8', newline='') as f:
fieldnames = ['Company', 'Current Price', 'Change', 'Ratio', 'Volume']
writer = csv.DictWriter(f, fieldnames=fieldnames)
writer.writeheader()
for row in data:
writer.writerow(row)
2
Google Finance에서 주식 데이터를 크롤링하는 것은 가능합니다. 아래는 Python으로 주식 데이터를 크롤링하는 예제 코드입니다.
import pandas as pd
import datetime as dt
start = dt.datetime(2020, 1, 1)
end = dt.datetime(2022, 1, 1)
df = pd.DataFrame(pd.read_html(" https://finance.google.com/finance/historical?q=KRX:005930&startdate=Jan+1%2C+2020&enddate=Jan+1%2C+2022&num=30 ")[0])
df = df[['Date', 'Close*']]
df = df.set_index('Date')
df.index = pd.to_datetime(df.index)
df = df.sort_index()
print(df.head())
위 코드는 2020년 1월 1일부터 2022년 1월 1일까지의 삼성전자 종가 데이터를 크롤링하여 Pandas DataFrame 형태로 반환합니다. 원하는 기간의 데이터와 기업의 코드를 수정하시면 됩니다.
3
구글스프래드 시트로 주식 크롤링. 저가, 시가, 종가, 고가, 회전율, 거래대금, 거래량, 총주식수.
function getStockData(ticker) {
var url = " https://finance.google.com/finance/getprices?q= " + ticker + "&i=60&p=10d&f=d,c,o,h,l,v";
var response = UrlFetchApp.fetch(url);
var data = response.getContentText();
var rows = data.split("\n");
var result = [];
for (var i = 7; i < rows.length; i++) {
var cells = rows[i].split(",");
result.push([new Date(1000 * cells[0]), parseFloat(cells[1]), parseFloat(cells[2]), parseFloat(cells[3]), parseFloat(cells[4]), parseInt(cells[5])]);
}
return result;
}
위 코드는 Google Apps Script의 UrlFetchApp을 사용하여 구글 파이낸스에서 제공하는 주식 데이터 API를 호출하여 가져옵니다. 원하는 주식 회사의 티커를 입력하시면 됩니다.
이 코드를 사용하려면 Google Apps Script 프로젝트를 생성하셔야 합니다. Google Spreadsheets에서 Tools > Script editor 메뉴를 선택하여 프로젝트를 생성할 수 있습니다. 생성된 프로젝트에서 위 코드를 붙여넣고, Spreadsheets에서 만든 함수를 사용하시면 됩니다.
4
구글 스프레드시트를 사용한 한국 주식 크롤링에 대한 코드는 다음과 같이 작성할 수 있습니다:
function myFunction() {
var sheet = SpreadsheetApp.getActiveSheet();
var symbol = "삼성전자";
var url = " https://finance.naver.com/item/sise_day.nhn?code= " + symbol;
var data = [];
var response = UrlFetchApp.fetch(url);
var html = response.getContentText();
var temp = html.split("<tbody>");
var temp1 = temp[1].split("</tbody>");
var table = temp1[0];
var tr = table.split("<tr>");
for (var i = 2; i < tr.length - 1; i++) {
var td = tr[i].split("<td>");
var date = td[2].split("</td>")[0];
var start = td[3].split("</td>")[0].replace(",", "");
var high = td[4].split("</td>")[0].replace(",", "");
var low = td[5].split("</td>")[0].replace(",", "");
var end = td[6].split("</td>")[0].replace(",", "");
var volume = td[7].split("</td>")[0].replace(",", "");
var turnover = td[8].split("</td>")[0].replace(",", "");
var total_shares = td[9].split("</td>")[0].replace(",", "");
data.push([date, start, high, low, end, volume, turnover, total_shares]);
}
data.reverse();
var numRows = data.length;
var numCols = data[0].length;
sheet.clearContents();
sheet.getRange(1, 1, numRows, numCols).setValues(data);
}
5
구글 스프레드시트 API를 사용한 한국 주식 1년간 정보 크롤링을 위해서는 먼저 API 키를 발급받아야 합니다. API 키를 발급받은 후, 다음과 같은 과정을 거쳐야 합니다.
위의 과정에서 사용할 수 있는 언어는 Python입니다. 아래는 구글 스프레드시트 API를 사용한 크롤링 예제 코드입니다.
import gspread
from oauth2client.service_account import ServiceAccountCredentials
# API key 발급 및 인증
scope =
6
*google api 사용은 하루에 2,500건, 초당 10건의 요청에 한해서만 무료라고 합니다.
그 이상 사용하려면 유료로 전환해야 한다고 합니다.
1. 구글 로그인을 합니다.
2.Google API 콘솔 이동
3.프로젝트 등록 ( 프로젝트 만들기 > 만들기 )
최초로 들어오면 프로젝트가 없습니다.
프로젝트가 있을 경우 Google APIs 옆 프로젝트 선택에서 프로젝트 선택하면 됩니다.
프로젝트 이름을 변경하면 아래 프로젝트ID값이 변경이 됩니다.
수정 버튼을 눌러 ID값을 수정할 수 있는 것 같지만 어떠한 규칙에 의해 변경하는 것 같습니다. 저는 하지 않았습니다.
만들기 클릭
4.API 및 서비스 사용 설정
방금 만든 프로젝트 (My project01) 선택된 모습이 보입니다.
API 및 서비스 사용 설정 클릭
이런 API 선택 창이 뜨는데, 왼쪽 사이드 바에서 사용하려는 API를 선택합니다.
저는 Maps를 사용하기 위해 클릭했습니다.
만약 옆에서 찾는 것이 어렵다면.
검색 창에서 내가 사용하려는 API를 검색하면 됩니다.
저는 Maps를 사용하기 위해 Javascript maps를 검색하였습니다.
검색 결과에 나온 API 타일을 클릭해줍니다.
이동한 Maps 페이지에서 사용 설정 클릭하여 Maps Javascript API 설정 페이지로 이동합니다.
Maps 설정 페이지 인지 확인 한 번하고..
사용자 인증 정보를 클릭합니다.
API KEY를 받기 위해, 사용자 인증 정보 인증키 클릭하면 선택 항목이 보입니다.
여기서 API 키를 선택해 줍니다.
API키 생성 완료!
간단하죠?
API 키가 보입니다.
사용자 인증 정보 페이지에 가면 API키가 만들어 진 것이 확인 가능하고 옵션 수정도 가능합니다.
여기서 노란 경고창이 뜬 이유는 애플리케이션 제한 사항을 설정하라는 부분입니다.
무시하고 사용해도 되지만 제한사항 설정을 할 경우 내가 설정한 곳 이외에서 내 인증키를 사용하지 못합니다.
5. 리퍼러 설정
API 설정에서 애플리케이션 제한 사항을 선택해줍니다.
웹에서 사용할 것이기 때문에 HTTP 리퍼러(웹사이트)를 체크하면 도메인 입력칸이 나오는데
내가 key를 사용하는 곳의 도메인 주소를 입력해줍니다.
*리퍼러를 설정 할 경우 다른 애플리케이션에서 이 키를 사용할 수 없게 합니다.
Google Sheet 연동하기 (feat. Google API)
서론
이번 토이 프로젝트로 데이터베이스를 구글 스프레드시트를 이용해서 하려고 했다. 따라서 구글 스프레드시트 연동을 위해서 공식문서와 블로그들을 찾아봤는데 뭔가 되게 비약적이고 불친절한 부분들이 많아서 쉽게 따라하기가 개인적으로는 버거웠다.
그래서 파편화된 정보들을 모아서 보다 손쉽게 구글 스프레드시트 연동을 할 수 있도록 글을 작성하기로 했다. (요즘 글 안쓴지도 오래된 것 같아서 좋은 타이밍이었던 것 같다.) 따라서 초보자들도 손쉽게 이용할 수 있도록 글을 작성할 예정이다.
본론
들어가기에 앞서 내가 사용하는 언어와 라이브러리는 다음과 같다.
구글 스프레드시트 한정으로는 google-spreadsheet 라는 라이브러리도 따로 존재해서 (깃허브 스타나 다운로드 숫자도 준수해서 사용할만 라이브러리 인 것 같다.) 상황에 맞게 자기가 편하게 쓸 수 있는 라이브러리를 사용하면 될 것 같다.
구글 클라우드 프로젝트 생성
먼저 구글 API를 이용하기 위해서 구글 클라우드 프로젝트 생성을 해주어야 한다. (돈 안듦)
구글 로그인 후 구글 클라우드 플랫폼 홈페이지에 접속해서 콘솔 버튼을 클릭해준다.
콘솔로 접속 후 IAM 및 관리자 > 프로젝트 만들기 를 클릭한다.
원하는 프로젝트명을 입력한 후 만들기 버튼을 클릭할 수 있도록 한다.
프로젝트에 구글 스프레드시트 추가하기
그러고나면 프로젝트 하나가 생성이 되는데 API 개요로 이동 을 클릭한다. 만약 지금 생성한 프로젝트가 보이지 않는다면 상단의 드롭다운 버튼을 눌러서 자신이 생성한 프로젝트로 이동할 수 있도록 한다.
왼쪽 탭에서 라이브러리 를 클릭해서 구글 스프레드 시트(spread sheet)를 검색할 수 있도록 한다.
검색해서 나온 google spredsheet를 클릭해서 사용 버튼을 클릭한다.
서비스 계정 생성하기
사용 버튼을 클릭 한 후 조금 기다리면 다음 화면으로 이동되는데 여기서 사용자 인정 정보 탭을 클릭 한 후 + 사용자 인증 정보 만들기 > 서비스 계정 을 클릭할 수 있도록 한다.
다음 이미지를 참고해서 서비스 계정을 생성할 수 있도록 한다.
저는 여기서 구글 스프레드시트 Read 만 할 예정이라 뷰어만 할 수 있는 역할을 주었는데 역할은 보시고 자신이 필요한 역할을 넣어주시면 됩니다. 그리고 완료 를 누르고 마무리 해줄 수 있도록 합니다.
다음과 같이 서비스 계정이 생성이 되는데 이메일 부분을 복사해서 자신이 사용하고자하는 구글 스프레드시트에 공유를 넣어줄 수 있도록 한다.
Credential 파일 다운로드 받기
마지막으로 코드에서 Google API 사용 하기위해서 인증을 해주어야 하는데 그때 사용할 JSON 파일을 다운로드 받아야 한다.
다시 사용자 인증 정보 로 돌아가서 서비스 계정 의 이메일 부분을 클릭할 수 있도록 한다.
그 다음 키 > 키 추가 > 키 만들기를 누를 수 있도록 한다.
JSON 타입으로 설정한 후 만들기 버튼을 클릭하면 파일이 다운로드 된다.
이제 그 파일을 가지고 코드에서 인증을 진행해보도록 하겠다.
Google API 코드 작성하기
먼저 저의 경우 Nest.js StandAlone Application 을 이용해서 코드를 작성하였습니다. (각자 원하는 환경에서 구축하면 될 것 같습니다.)
googleapis 라이브러리 다운로드npm install googleapis
다음 명령을 이용해서 라이브러리를 다운로드 받을 수 있도록 한다.
googleapis 인증하기
다음과 같이 코드를 작성할 수 있도록 한다.
import { NestFactory } from '@nestjs/core'; import { AppModule } from './app.module'; // 위에서 다운로드 받은 json 파일을 import 한다 (저는 이름을 변경했습니다.) import { client_email, private_key } from '../credentials.json'; import { google } from 'googleapis'; async function bootstrap() { // json 파일을 가지고 인증할 때 다음과 같이 사용합니다. // scope는 spread sheet만 주었습니다. const authorize = new google.auth.JWT(client_email, null, private_key, [ 'https://www.googleapis.com/auth/spreadsheets', ]); // google spread sheet api 가져오기 const googleSheet = google.sheets({ version: 'v4', auth: authorize, }); // 실제 스프레드시트 내용 가져오기 const context = await googleSheet.spreadsheets.values.get({ spreadsheetId: 'spread sheet ID', range: 'A1:A3', }); } bootstrap();
조금만 부가설명을 하자면 3가지 정도 할 수 있을꺼 같습니다.
"resolveJsonModule": true
위에 context 값을 다음과 같이 찍어보면 데이터를 확인할 수 있다.
console.log(context.data.values);
결론
아무것도 모르는 사람들도 쉽게 사용할 수 있도록 최대한 캡쳐도 많이하고 자세하게 적어보았다. 이외의 작업들은 열심히 구글링을 통해서 찾아보시면 될 것 같다! (무책임한거 아님 ㅎㅎ)
그럼 이만 총총