株価の日足をスクレイピングする。
最小単位。
import pandas as pd
url = "https://finance.yahoo.co.jp/quote/1400.T/history?from=20000101&to=20220528&timeFrame=d&page=1"
df = pd.read_html(url)[0]
print(df)
これで1ページ20日分取れる。
ここから銘柄名やページをループしてデータを取得していく。
負荷を最低限にするべく、必ず十分なウェイトを取らなければならない。
スクレイピングする以上、アクセス規制も覚悟する。最悪訴訟も。
import pandas as pd
import time
df_all = pd.DataFrame()
for page in range(1,4):
url = "https://finance.yahoo.co.jp/quote/1400.T/history?from=20000101&to=20220528&timeFrame=d&page=" + str(page)
df = pd.read_html(url)[0]
df_all = pd.concat([df_all,df])
time.sleep(3)
print(page)
print(df_all)
これで3ページ60日分取得。
何日ループするべきか分からないのでBeautifulSoupで何件データあるかを取得する。
最終的にこうなった。
import pandas as pd
import time
#200ページ*3秒=10分。
#1時間で6銘柄。24時間で144銘柄。
#3600銘柄を取得するには1か月弱。
SAVE_FOLDER = "kabu_data/"
def get_data(url="https://finance.yahoo.co.jp/quote/1400.T/history?from=20000101&to=20220528&timeFrame=d&page="):
df_all = pd.DataFrame()
for page in range(1,211):
try:
new_url = url + str(page)
df = pd.read_html(new_url)[0]
time.sleep(3)
df_all = pd.concat([df_all,df])
except Exception as e:
print(str(page) + "ページではデータが見つかりませんでした。")
break
print(page)
df_all["日付"] = df_all["日付"].str.replace('年', '/')
df_all["日付"] = df_all["日付"].str.replace('月', '/')
df_all["日付"] = df_all["日付"].str.replace('日', '')
print(df_all)
TAG = url.split("quote/")[1].split("/")[0]
TAG = TAG.replace(".","_")
df_all.to_csv(SAVE_FOLDER + TAG + ".csv",encoding="cp932")
return df_all
get_data()
ページ数とか直した方がいいか。次は銘柄ループ書く。
おわり。
コメント
コメントを投稿