当然SBI証券のページ構成が変わったら使えなくなります。
import csv
import requests
from bs4 import BeautifulSoup
import pandas as pd
url = "https://search.sbisec.co.jp/v2/popwin/info/stock/pop6040_usequity_list.html"
response = requests.get(url)
response.encoding = response.apparent_encoding #エンコーディング指定。これないと日本語文字列が文字化けする
soup = BeautifulSoup(response.text, "html.parser")
# テーブルから必要な列(ティッカー)を抽出
stock_tickers = []
etf_tickers = []
adr_tickers = []
with open("tickers.csv", "w", newline="") as csvfile:
writer = csv.writer(csvfile)
tables = soup.find_all("table", class_="md-l-table-01")
#普通株式 収集
table = tables[0]
df = pd.read_html(str(table))[0]
if 'ティッカー' in df.columns: # ティッカー列がある場合
stock_tickers += df['ティッカー'].tolist()
#ETF 収集
table = tables[1]
df = pd.read_html(str(table))[0]
if 'ティッカー' in df.columns: # ティッカー列がある場合
etf_tickers += df['ティッカー'].tolist()
#CSV出力
for ticker in stock_tickers:
writer.writerow([ticker, "stock"])
for ticker in etf_tickers:
writer.writerow([ticker, "etf"])
#ADR 収集
tables = soup.find_all("table", summary="layout" )
for table in tables:
df = pd.read_html(str(table))[0]
if 'ティッカー' in df.columns: # ティッカー列がある場合
adr_tickers += df['ティッカー'].tolist()
#CSV出力
for ticker in adr_tickers:
writer.writerow([ticker, "adr"])