SBI 증권 포트폴리오 페이지 스크래핑
6719 단어 pandas파이썬셀레늄BeautifulSoup
소개
myTrade를 애용하고 있었지만, 1/9에 지원 종료라는 것으로, 여러가지 앱을 찾았습니다만, 적절한 앱이 없고, 스스로 SBI의 포트폴리오의 페이지를 스크래핑 해, Google spread sheet에서 데이터를 관리하기로 결정했습니다.
따라서 이 페이지에서는 다음 두 가지 프로그램을 소개합니다.
1. SBI 증권 포트폴리오 페이지 스크래핑
2. 스크래핑된 데이터를 Google spread sheet에 기록
↓이런 느낌에 씁니다.
환경
절차
환경 구축
전제:
* 파이썬이 설치되어 있습니다.
* pip가 설치되어 있습니다.
1. 필요한 모듈 설치
pip install selenium
pip install pandas lxml html5lib BeautifulSoup4
Google 크롬 버전에 해당하는 ChromeDriver를 다운로드하여 PATH가 통과한 곳에 놓습니다. (참고 : Mac에서 PATH 통과)
다운로드하는 ChromeDriver 버전은 사용중인 Google Chrome 버전과 일치합니다.
일치하는 것이 없으면 가장 가까운 것.
2.Google 설정
↓의 페이지가 훌륭하기 때문에 그대로 한다
htps : // 타누는 ck. 코 m / 오라 라 - sp Rea d shi / t / # Go g _ C ぉ d_P t t rm
코드
1.import
import time
import datetime
import gspread
import json
import pandas
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
from bs4 import BeautifulSoup
from oauth2client.service_account import ServiceAccountCredentials
2. 스크래핑하는 부분
class Result():
def __init__(self, fund, amount):
self.fund = fund
self.amount = amount
def convert_to_list(data_frame, custody):
data_frame = data_frame.iloc[:, [1, 10]]
data_frame.drop([0], inplace=True)
data_frame.columns = ['funds', 'amount']
results = []
row_num = data_frame.shape[0]
for i in range(row_num):
index = i + 1
fund = data_frame.at[index, 'funds']
amount = data_frame.at[index, 'amount']
results.append(Result(custody + ':' + fund, amount))
return results
def get_stocks():
options = Options()
# ヘッドレスモード(chromeを表示させないモード)
options.add_argument('--headless')
# ChromeのWebDriverオブジェクトを作成
driver = webdriver.Chrome(options=options)
# SBI証券のトップ画面を開く
driver.get('https://www.sbisec.co.jp/ETGate')
# ユーザーIDとパスワードをセット
input_user_id = driver.find_element_by_name('user_id')
input_user_id.send_keys('xxxx')
input_user_password = driver.find_element_by_name('user_password')
input_user_password.send_keys('yyyy')
# ログインボタンをクリックしてログイン
# body の読み込みは非同期っぽいので少しsleepする
driver.find_element_by_name('ACT_login').click()
time.sleep(5)
driver.find_element_by_link_text('ポートフォリオ').click()
# 文字コードをUTF-8に変換
html = driver.page_source #.encode('utf-8')
# BeautifulSoupでパース
soup = BeautifulSoup(html, "html.parser")
table = soup.find_all("table", border="0", cellspacing="1", cellpadding="4", bgcolor="#9fbf99", width="100%")
df_stocks = pandas.read_html(str(table))[0]
stocks = convert_to_list(df_stocks, '特定')
df_nisa = pandas.read_html(str(table))[1]
nisa = convert_to_list(df_nisa, 'NISA')
result = []
for s in stocks:
result.append(s)
for n in nisa:
result.append(n)
driver.quit()
return result
3.spread sheet에 쓰기
def write(stocks):
scope = ['https://spreadsheets.google.com/feeds','https://www.googleapis.com/auth/drive']
#認証情報設定
#ダウンロードしたjsonファイル名をクレデンシャル変数に設定(秘密鍵、Pythonファイルから読み込みしやすい位置に置く)
credentials = ServiceAccountCredentials.from_json_keyfile_name('zzzzz.json', scope)
#OAuth2の資格情報を使用してGoogle APIにログインします。
gc = gspread.authorize(credentials)
#共有設定したスプレッドシートキーを変数[SPREADSHEET_KEY]に格納する。
SPREADSHEET_KEY = 'hogehoge'
#共有設定したスプレッドシートのシート1を開く
worksheet = gc.open_by_key(SPREADSHEET_KEY).sheet1
headers = worksheet.row_values(1)
dates = worksheet.col_values(1)
new_row_num = len(dates) + 1
worksheet.update_cell(new_row_num, 1, datetime.datetime.today().strftime('%Y/%m/%d'))
for stock in stocks:
for i in range(len(headers)):
if headers[i] == stock.fund:
worksheet.update_cell(new_row_num, i + 1, stock.amount)
4.↑의 페이지를 조합한다
def main():
# ポートフォリオをスクレイピングして書き込むデータを取得する
stocks = get_stocks()
# 取得したデータをスプレッドシートに書き込む
write(stocks)
if __name__ == "__main__":
main()
리스펙트 페이지:
htps : / / 하토. 요코하마/sc라핀 g_s비_인ゔㅇ st면 t/
파이썬 + selenium :
htps : // 코 m / 현기증 / ms / 20 02161 7 7 18d8 693
h tps:// 퀵했다. 작은 m / 우마 / MS / 896C49d46585 그림 32 f7b1
Reference
이 문제에 관하여(SBI 증권 포트폴리오 페이지 스크래핑), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/t_okumura/items/e1900105fe046992f808텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)