Python

株価の高騰銘柄の出現数をスクレイピングでカウントする方法

Python

本日の高騰銘柄が以下の表のようにWebサイトで掲載されています。こういったサイトでは、ある指定の日にちの高騰銘柄を把握することができますが、一定期間の高騰銘柄が何回出現したかを把握することができないですよね。

今市場がどういった企業に注目をしているかを判断するには、一定期間の高騰銘柄が何回出現したかを把握することは重要です。そこで、スクレイピングで、一定期間の高騰銘柄が何回出現したかを把握する方法を解説します。

参照元:株ドラゴン

スクレイピングとは?

スクレイピングに関しては、こちらの記事を参考にしてみてください。

スクレイピングするサイト

  • 株ドラゴンよりスクレイピングします。

環境構築

  • Anacondaのインストール方法
  • requestsBeautifulSoupのインストール方法

Robots.txtの確認

今回は、株ドラゴンというサイトから、スクレイピングします。
スクレイピングしていいサイトかどうかを判断するためにRobots.txt確認します。
アクセスしたいURLは、https://www.kabudragon.com/ranking/です。
2009年より前のデータにはアクセスするなと記載していますので、注意しましょう。

https://www.kabudragon.com/robots.txt
User-agent: Mediapartners-Google
Disallow:

User-Agent: Baiduspider
Disallow: /
#China Baidu : www.baidu.com, www.baidu.jp

User-agent: ICC-Crawler 
Disallow: /

User-agent: Yeti
Disallow: /
#Korea Naver : www.naver.com 29/Mar/2007~

User-agent: NaverBot
Disallow: /
#Korea Naver : www.naver.com ~26/Mar/2007?

User-agent: msnbot
Crawl-delay: 120
Disallow: /company

User-Agent: MJ12bot
Crawl-Delay: 120

User-agent: SemrushBot
Disallow: /
#170525 add

User-Agent: *
Disallow: /kabuka/
Disallow: /cgi-bin/
Disallow: /chart/
Disallow: /chart2/
Disallow: /js/
Disallow: /ranking/2001
Disallow: /ranking/2002
Disallow: /ranking/2003
Disallow: /ranking/2004
Disallow: /ranking/2005
Disallow: /ranking/2006
Disallow: /ranking/2007
Disallow: /ranking/2008
Disallow: /ranking/2009
Disallow: /ranking/201
Disallow: /ranking/202
Disallow: /top/200
Disallow: /top/201
Disallow: /top/202
Disallow: /company
Sitemap: https://www.kabudragon.com/sitemap.xml

コード

スクレイピング

  • requests,BeautifulSoupでスクレイピング
  • 直近100日のデータをスクレイピング
    now = date.today():本日の日付
  • start = now - timedelta(days=100):本日の日付から100日前
  • https://www.kabudragon.com/ranking/{}/age.html'.format(date)の{}のなかに日付を%Y/%m/%dで入力
import requests
from bs4 import BeautifulSoup
import pandas as pd
import numpy as np
from datetime import datetime, timedelta,date

now = date.today()
start = now - timedelta(days=100)
now = str(now).replace('-', '/')
start = str(start).replace('-', '/')
st_date = datetime.strptime(str(start), '%Y/%m/%d')
end_date = datetime.strptime(str(now), '%Y/%m/%d')

def table(soup):
    # セレクタ
    table = soup.findAll("table",class_="rankingFrame")[1]
    trs = table.findAll("tr")
    data_files = []
    for tr in trs:
        data = []
        # 1行ごとにtd, tr要素のデータを取得してCSVに書き込み
        for cell in tr.findAll(['td', 'th']):
            data.append(cell.get_text().replace("\n",""))
        data_files.append(data)
    return data_files
  
i = 0
while st_date <= end_date:
    date = datetime.strftime(st_date, '%Y/%m/%d' )
    urlName = 'https://www.kabudragon.com/ranking/{}/age.html'.format(date)
    st_date = st_date + timedelta(days = 1)
    print(urlName)
    
    url = requests.get(urlName)
    soup = BeautifulSoup(url.content, "html.parser")
    if len(soup.find_all('tr')) > 20:
        df_all_pages = pd.DataFrame(table(soup))
        df = pd.DataFrame(df_all_pages)
        df = df.drop(0 , axis=0)
        df = df.drop(1 , axis=0)
        df_f = df.iloc[0:,0:10]
        df_f.columns = ["順位","コード","名称","市場","日付","取引値","前日比","出来高","高値","安値"]
        #df_f = df_f.reset_index() 
        #df_f = df_f.drop("index" , axis=1)

        if i ==0:
            df_fs = df_f
            i = i+1
        else:
            df_fs = pd.concat([df_fs,df_f])
            df_fs = df_fs.reset_index() 
            df_fs = df_fs.drop("index" , axis=1)
            i = i+1
    else:
        print("no-data")
        i = i+1

出力結果

2020/12/06からの株価の高騰銘柄の出現数の結果は以下です。

pd.set_option('display.max_rows', None)
df_fs

出現回数を把握

  • 出現回数は、.value_counts()で数えられる
x = df_fs['名称'].value_counts()
x_code = df_fs['コード'].value_counts()
x_df = pd.DataFrame(x)
x_new = x_df.reset_index() 
x_code = pd.DataFrame(x_code)
x_code_s = x_code.reset_index() 
x_new['コード'] = x_code_s["index"]
x_new.columns = ["会社名","頻出回数","コード"]
x_new

出力結果

セキドが直近100日でもっとも出現していることがわかります。

可視化方法

%matplotlib inline
import matplotlib.pyplot as plt
from matplotlib import rcParams
rcParams["font.family"] = "AppleGothic"#MACで日本語表示するため。WinはMS Gothicをつかってください。
rcParams['figure.figsize'] = 20,4
plt.yticks(np.arange(min(x[0:10]), max(x[0:10])+1, 1.0))
plt.plot(x.iloc[0:10],linestyle='None',marker='o')

出力結果

まとめ

スクレイピングで、一定期間の高騰銘柄が何回出現したかを把握する方法を解説しました。
高騰銘柄のデータは、株ドラゴンよりスクレピングして、pandas DataFramsに格納しました。格納したデータを.value_counts()で出現数をカウントする方法を解説しました。

Pythonについてもっと学びたい方は以下の記事も参考にしてみてください。

株式投資についてもっと学びたい方は以下の記事も参考にしてみてください。

コメント

  1. […] 株価の高騰銘柄の出現数をスクレイピングでカウントする方法本日の高騰銘柄が以下の表のようにWebサイトで掲載されています。こういったサイトでは、ある指定の日にちの高騰銘柄を […]

  2. […] […]

タイトルとURLをコピーしました