ハシカケ-実現したいことから学べるプログラミングサイトプログラミングを実現したいことから逆算して学べるサイトです。2020.04.29みなさん仕事や勉強で、何かについてのデータを集めて記録する作業をした経験はありませんか。前まで自分もWebサイトと睨めっこしながら、データを探してはコピーペーストを繰り返していました。Pythonを使えば、Webサイトへのアクセスもexcelファイルの操作も自動化できます。手作業で行っていたら数時間かかるようなデータ収集も一瞬で終わらせることが可能です。今回は株価のデータをスクレイピングして、Excelファイルに保存するプログラムです。プログラムを実行すると、株価データをまとめたExcelファイルが数秒で作成されます。td.text#ワークブックをExcelファイルとして保存wb.save(str(title)+'.xlsx')禁止されているサイトはスクレイピングしないサイトによってはWebブラウザ以外からのアクセスや、スクレイピングを許可していない場合があります。株価を調べるにしても、Yahoo!ファイナンスではスクレイピングは禁止されています。スクレイピングを禁止していないサイトから行いましょう。今回はスクレイピングを許可している株式投資メモさんのデータをお借りします。(現在アクセスすると403エラーが出るようになっています。株式投資、システムトレードや株価分析に有益な情報を多数配信!CSVダウンロード無料。kabuoji3.comrobots.txtでスクレイピングOKかチェックWebページがスクレイピングOKか確認するには、robots.txtをチェックします。robots.txtとは、ページのコンテンツをスクレイピングされないようにするファイルです。robots.txtの内容がAllowの場合、スクレイピングが許可されています。robots.txtの内容がDisallowの場合、ツールなどを使ったアクセスを禁止しています。株式投資メモさんのrobots.txtにアクセスして確認したところ、Allowと書かれていたのでOKです。プログラム実行前に必要な準備PythonでWebページをスクレイピング・Excelファイルを操作するには、外部ライブラリのインストールが必要です。openpyxl↑の3つを実行して、プログラムを実行する前にインストールしておきます。調べたい年号プログラムのソースコードに、調べたいデータの銘柄・年号を記述しておきます。変数codeには、チェックしたい株式の銘柄コードを記入します。変数yearには、チェックしたい期間の年号を記入します。今回は例として、バンダイナムコホールディングスさんの株価を調べてみようと思います。2019変数codeと変数yearはそれぞれ、銘柄コードの7832と調べたい年の2019を記入します。serverというエラーが表示されてしまうことがあります。簡単にいうと、「アクセスしたページは存在しますがあなたには見せません」という意味のエラーです。このエラーの原因は、ヘッダーにユーザーエージェントを記載せずにリクエストすることにあります。ヘッダーとは、ページにアクセスする際にやり取りする注意書きのようなデータユーザーエージェントは、どのようなプログラムや環境でアクセスしているかという情報ですので、こちらが何者であるかユーザーエージェントで自己紹介をする必要があります。ユーザーエージェントの確認方法エラーを回避するために、以下の処理でユーザーエージェントを指定してください。「確認くん」にアクセス確認くんwww.ugtop.comソースコードにコピーペーストページ内の「現在のブラウザ」という部分がユーザーエージェントの情報になります。プログラムのコードのheaders部分に、以下の例のように情報をコピーペーストします。"}プログラムについての解説ここからはプログラムのソースコードについて1行ずつみていきます。openpyxl今回のプログラムで使うライブラリをインポートします。調べたい年号プログラム実行前に記入した銘柄コードと年号が2つの変数にセットされます。変数codeは7832、変数yearは2019となります。今回のページ株式投資メモさんでは株価データを、https://kabuoji3.com/stock/銘柄コード/年というパターンのURLで公開しています。"https://kabuoji3.com/stock/"+str(code)+"/"+str(year)+"/"銘柄(変数code)と年(変数year)を代入することで、スクレイピングしたい株価のURLが完成します。して完成した、今回調べたい株価データのURLを変数urlとします。(例)バンダイナムコホールディングス(銘柄コード7832)の2019年のデータを調べたい場合https://kabuoji3.com/stock/7832/2019というURLが作成されます。headers).content)まずrequests.get()で、指定した銘柄コードの株価のページにアクセスします。変数urlでアクセスするURLを指定、変数headerでユーザーエージェントを送信しています。返り値のResponseオブジェクトから、content属性でバイナリデータを取り出します。そのバイナリデータをBeautifulSoup()でパースして、BeautifulSoupオブジェクトを作成します。これでWebページをhtml要素ごとに分けて、解析しやすいように整理できました。株価を調べたい会社の名前を取得さっそくBeatufulSoupオブジェクトから欲しい情報だけを取り出してみます。ページのhtml要素を使って絞り込んで、調べたい会社の名前を取得します。soup.select_one("span.jp").textsoup.select_one()で、BeatufulSoupオブジェクトから指定した要素だけを取り出します。class=”jp”>という要素に会社名があるようです。そこで今回は(“span.jp”)と指定して、会社名のspanクラスだけを取り出しています。spanクラスを取得したら、text属性で文字列を取り出して、会社名を変数titleとします。(株)バンダイナムコホールディングス」という文字列になります。取り出した株価のデータを記入するため、先にワークブックを準備しておきます。openpyxl.Workbook()Workbook()で、空のワークブックを新規作成して、変数wbとします。wb.activewb.activeで、ワークブック内のアクティブなワークシートを選択して、変数wsとします。str(title)ws.titleで、ワークシートの名前を変更します。先ほど取得した会社名(変数title)がワークシートの名前になります。'終値調整'ワークシートの1番上の行(A1〜G1)に見出しの値を記入します。ws[‘セル番号’].value()で、それぞれ指定したセルに値を入力します。(株)バンダイナムコホールディングス」というワークシートが作成されます。ページから株価を取り出すさっきと同じようにBeatufulSoupオブジェクトから欲しいデータだけを取り出します。今度は株価のデータを取り出したいので、株価がhtml内でどの要素にあるかを調べます。デベロッパーツールでhtml構造を確認してみると、<tr>タグの要素に、日付〜終値調整までその日の株価についての全データがあることがわかります。soup.find_all('tr')まずはsoup.find_all()で、ページにあるtrタグを全て取り出します。すると、ページにある1年分全ての株価データが取得できます。取り出したtrタグの一覧リストを、変数tag_trとします。range(1,len(all_tr)):for文で、ページにあるtrタグの個数を1つずつ取り出してループ処理します。len(all_tr)は、リスト型(変数all_tr)の要素数なので、ページにあるtrタグの個数。range(1,len(all_tr))は、「1からtrタグの個数までの数値」を集めたリストになります。all_tr[i].find_all('td')tag_tr[i]で、ページ内のtrタグの一覧リスト(変数all_tr)からi番目のtrタグを1つ取り出します。つづいてfing_all()で、取り出したtrタグにあるtdタグを全て抽出します。して取得した、1つのtrタグ内にあるtdタグを全て集めたリストを変数trとします。これで変数trに指定した1日分の株価データを取り出すことができました。1日の全データから各データを取り出す変数trはある1日の日付〜終値調整のデータを全てまとめたリストです。リストにある1日分の株価データをそれぞれの項目ごとに取り出して処理します。1):enumerate()を使ったfor文で、リストからインデックス番号とデータの値を1セットずつ取り出します。1)で1から数えるようにしました。変数n=リスト内でのインデックス番号(※1から数え始める)変数td=リストから取り出したデータの数値(tdタグ)デベロッパーツールでわかるように、trタグとtdタグは下のような関係になっています。<td>終値調整</td></tr>たとえば変数n=1の場合、1番目のtdタグである日付の数値が変数tdに取り出されます。column=n)ws.cell()で、ワークシート上にあるセルを1つ指定して、変数new_cellとします。データを記入するセルは、以下のようにして行・列で指定しています。i+1ワークシートにあるデータを記入したいセルの行を決めます。1行目は見出しがあるので、2行目以降に記入するため、i+1とします。nワークシートにあるデータを記入したいセルの列を決めます。変数nと同じ数、n列目のセルが指定されます。td.textnew_cell.valueで、指定したセル(変数new_cell)に取り出したデータの数値(変数td)を記入します。(i番目のtrタグにあるn番目のtdタグ)のデータが、(n列・i+1行)のセルに記入されます。その後、全てのデータ(変数all_trにある全てのtdタグ)を記入するまで同じ処理を繰り返します。全てのデータを記入したら、最後にExcelファイルとして保存します。Excelファイルに保存して完成36行目:wb.save(str(title)+'.xlsx')wb.saveで、ワークブックをExcelファイルとして保存します。引数の変数titleは会社名を表すので、「会社名.xlsx」というファイル名で保存されます。プログラムを実行すると、株価データをまとめたExcelファイルが作成されます。プログラムの解説はここまでになります。本記事は、こんな悩みを解決する内容です。if文は「制御構文」と言われる、記述することでプログラムの動きをコントロールする構文...PythonPythonのSeleniumでWebブラウザ自動操作する基礎からの使い方チートシートSeleniumライブラリでは、PythonからWebブラウザを自動制御することができます。クリック操作やキーボード入力もできるので、ID・パスワードを入力して会員制サイトに自動ログインすることも可能です。どこを操作したいか?・どん...PythonPythonで画像にテキストを入れて複数のアイキャッチを一括で作るプログラム今回のPythonのプログラムは複数の画像にテキストを一気に入れて、アイキャッチ画像を作るプログラムです。実は、このブログのアイキャッチも全部プログラムで一気に作っています。「Pythonをインストールしたはいいけれど、ライブラリをまともに使ったことがない。本記事は、こんな悩みを持ったPython初学者のための内容です。じつはPythonプログラムの基本的なルールはたった3種類。簡単なプログラミング言語なので、初学者にオススメなんです。コメントをキャンセルメールアドレスが公開されることはありません。*サイト次回のコメントで使用するためブラウザーに自分の名前、メールアドレス、サイトを保存する。ハシカケとは?Hashikakeハシカケは、改善したい、効率化したいなどの実現したいことからプログラミングを学ぶことができるサイトです。ハシカケ-実現したいことから学べるプログラミングサイト.ホーム検索トップサイドバーハシカケとは?Hashikakeハシカケは、改善したい、効率化したいなどの実現したいことからプログラミングを学ぶことができるサイトです。株価を調べたい会社の名前を取得データを記入するワークシートを作成ページから株価を取り出す指定した年の全データを取り出す1日ごとの株価データを1つずつ取り出す1日の全データから各データを取り出すデータを記入するセルを指定セルに株価を記入するExcelファイルに保存して完成タイトルとURLをコピーしました。