ブログ自動投稿目指して試行錯誤するシリーズ
前回はこちら。
今回はWebスクレイピングをしてみます。ようやくそれっぽいことを。。。
やってみること
自動化するにあたって、まずは立会外分売の情報を取得することは必須。
各種証券会社のページに情報が載ってますが、ここではSBI証券のページからデータを頂いてみようかと思います。
立会外分売の情報はどこの証券会社のホームページにも載ってるので別にどこの証券会社でも良いのです。
SBI証券だとSBI証券独自の立会外トレードというものもあるので、ついでにその情報も取れたらなーくらいの理由です。
ホームページにアクセスすると立会外分売の情報がこんな感じで載ってます。

ここから必要な情報を抜き出せれば目的達成です。
今回は分売実施予定の会社名を取得することを目標にします。

会社名が取得できれば、同じような感じで予定日とか株数とかも取得できるんじゃないかと。
ライブラリのインストール
google先生に
python スクレイピング
みたいな感じに問い合わせると、BeautifulSoupというライブラリとrequestsというライブラリを使うようなので、まずはインストール。
ライブラリのインストールはコマンドプロンプト上で
pip install ライブラリ名
と入力したらライブラリをインストールできるようです。
requestsライブラリをインストールする場合は
pip install requests
ですね。これを実行します。

VSCodeにターミナルがあったのでそこに打ち込みました。
実行するとインストールっぽいメッセージが流れて終了。
同じくBeautifulSoupもインストール。
pip install beautifulsoup4
これで準備完了です。
HTML情報の取得
実際にやってみます。
まずはライブラリをインポート
import requests
from bs4 import BeautifulSoup
requestはimportだけで、BeautifulSoupはfrom bs4というのが頭についてます。
これはbs4というライブラリ群からBeautifulSoupというライブラリをインポートするぞということっぽいです。requestはライブラリ単品なんでライブラリ群指定しなくてもOKと。
次にrequestsライブラリでサイトにアクセスしてサイトの情報を取得。取得したいURL(今回の場合はSBI証券の立会外分売のページ)を指定します。
urlStr = "https://www.sbisec.co.jp/ETGate/?_ControlID=WPLETmgR001Control&_DataStoreID=DSWPLETmgR001Control&burl=search_domestic&dir=offfloor%2F&file=domestic_offfloor_01.html&cat1=domestic&cat2=offfloor&getFlg=on"
htmlObj = requests.get(urlStr)
requestsライブラリのgetメソッドを使うとサイトのHTMLの情報が全部とれるので、これをBeautifulSorpで解析します。
contObj = BeautifulSoup(htmlObj.content, "html.parser")
contObjを表示するとこんな感じでした。
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html lang="ja">
<head>
<meta content="text/html; charset=utf-8" http-equiv="Content-Type"/>
<meta content="text/css" http-equiv="Content-Style-Type"/>
<meta content="text/javascript" http-equiv="Content-Script-Type"/>
<meta content="IE=edge" http-equiv="X-UA-Compatible"/><!--gethtmlコンテンツ開始-->
<!-- visitor/header_domestic_001.html/// -->
<meta content="SBI証券,SBI,エスビーアイ,ネット証券,証券,株,株式,信用取引,PTS,IPO,株主優待,ETF,テーマ投資" name="keywords"/>
<meta content="株の取引ならSBI証券。現物、信用、PTS、IPO、PO、立会外分売、単元未満株、ETF/REIT、貸株などをご紹介。テーマ株取引や立会外トレードなどSBI証券独自のサービスも。初心者にも人気の株主優待に関する情報も充実。" name="Description"/>
<title>国内株式|SBI証券</title>
<!--- Launch by Adobe/// --->
<script src="//assets.adobedtm.com/launch-EN258cdfd1f9de47b58a8d36e5377be22c.min.js"></script>
<!--- ///Launch by Adobe --->
<!-- ///visitor/header_domestic_001.html -->
<!--gethtmlコンテンツ終了-->
<script src="/JavaScript/WPLCommon.js?20210109" type="text/javascript"></script><script
:
(以降省略)
1300行以上とむちゃくちゃ長いですが、HTMLの情報が無事に取れました。
この中から立会外分売実施予定の会社名が書かれている箇所を探すと・・・
<!--▽エンビプロ・ホールディングス-->
<div class="md-l-mainarea-01 md-l-utl-mt15">
<table class="md-l-table-01"><colgroup><col width="*"/><col width="20%"/><col width="20%"/><col width="20%"/><col width="20%"/></colgroup>
<thead><tr><th colspan="5">
<p class="alL"><a href="/ETGate/WPLETsiR001Control/WPLETsiR001Ilst10/getDetailOfStockPriceJP?OutSide=on&getFlg=on&stock_sec_code_mul=5698&exchange_code=TKY">エンビプロ・ホールディングス</a><span class="normal" style="padding:0 10 0 10;">(5698)東証</span>
<span class="normal"><img alt="新しいウィンドウで開きます。" class="vaM" height="11" src="//sbisec.akamaized.net/sbisec/images/base/i_popup_03.gif" width="14"/><a href="https://www.envipro.jp/" target="_blank">WEBサイト</a></span>
</p></th></tr></thead>
<tbody><tr><td class="vaM alC" rowspan="3">
<img alt="エンビプロ・ホールディングス" src="//sbisec.akamaized.net/sbisec/images/base/g_offfloor_logo_5698TKY.gif" title="エンビプロ・ホールディングス"/></td>
<th><p>実施予定日</p></th><td style="background-color:#FFFFCC;"><p class="alC">5/24</p></td>
<th><p>実施株数</p></th><td><p class="alR">140,000株</p></td></tr>
<tr><th><p>実施日前営業日終値</p></th><td><p class="alR">1,016円</p></td>
<th><p>最低申込株数</p></th><td><p class="alR">100株</p></td></tr>
<tr><th><p>分売価格(割引率)</p></th><td><p class="alR">991円(2.46%)</p></td>
<th><p>申込上限株数</p></th><td><p class="alR">1,000株</p></td></tr>
</tbody></table></div>
<!--△エンビプロ・ホールディングス-->
ありましたね。
あとはこの超長いHTMLから上手いこと会社名だけ引き抜ければ今回の目標達成です。
指定したタグの情報を取得
改めてホームページを見てます。これを見る限り、会社名はテーブルのヘッダとして設定されているように見えます。
そこで、find_allメソッドを使用してtheadタグを検索し、記載されているテキストをすべて引き抜いてみます。
theadObj = contObj.find_all("thead")
実行した結果を出力してみます。
エンビプロ・ホールディングス(5698)東証
WEBサイト
旭コンクリート工業(5268)東証
WEBサイト
ヤマザキ(6147)東証
WEBサイト
メタルアート(5644)東証
WEBサイト
ピエトロ(2818)東証
WEBサイト
一正蒲鉾(2904)東証
WEBサイト
お、なんかそれっぽく取れました!あとはテキストをいい具合に編集したら大丈夫そうです。
ということで、人生初のWebスクレイピングでしたが無事に目標は達成しました。
ちゃんとした関数として実装してないですが、やれることは分かったので実装もできそうです。
株価とか分売実施日も同じような感じで引き抜けると思うんですが、会社名と上手く紐づけられるかどうか、試してみないとダメですが。。。
でも正直こんな簡単にスクレイピングできると思ってなかったなー。
Pythonの便利さがちょっとだけ分かったかもしれません。
コメント