病みそで病まないSEのサラリーマン脱出奮闘記

毎日病みそうで会社勤めからなんとか脱出を図ろうとするSEのブログ

副業を初めて会社を辞める準備を始めるぞ。CrowdWorksとかリアルワールドで簡単な開発請負とかやってみたい。まずはrubyで簡単なスクレイピングの練習。

f:id:infoprocesmaster:20170711161017j:plain


こんにちは。病み病みサラリーマンです。

しばらく、ブログを放置してしまいました。

放置している間、会社を辞めるために何をやる必要があるかを考えてました。

ある程度の収入の見通しがないと、会社も辞めれないし、独立するにしても、転職するにしてもうまくいくとは限らないし。

で、今流行り?の副業をやってみようと考えました。

今だと、リアルワールドとかCrowdWorksとかサイトで手軽に在宅でできる副業が見つかるので、どんな仕事があるかみてみました。

システム開発系に絞ると、簡単なWEBサイト構築とか、スマホゲームの作成とかが多いですね。その中で、意外と多いのがWEBからのデータ抽出ツールの作成依頼!!

いわゆる、WEBスクレイピングという技術を使う仕事がわりと多いことに気づきました。

なんで、手始めにWEBスクレイピングで何ができるか?どのぐらいの難易度かを確認するためにWEBスクレイピングで簡単なデータ抽出ツールを作成してみることにしました。

手始めにyahooファイナンスから必要なデータを取得してみる

やりたいこと

yahooファイナンスの画面から、指定した銘柄の「売上高」、「営業利益」、「経常利益」、「当期利益」を抽出してくる。
ソースコードは下記のような感じ。
これをファイル名「yahoo.rb」とかで保存して、コマンドプロンプトから

C:\Users\XXXXX\Desktop\ruby>ruby yahoo.rb

って感じで実行すればOK。

require 'mechanize'#mechanizeライブラリを使う宣言

agent = Mechanize.new#①Mechanizeオブジェクトを生成してagent変数に設定する
agent.agent.http.ca_file = 'C:/Users/XXXXXX/Desktop/ssl.pem'#②セキュリティ証明書ファイルを指定する

comp_code = [9984, 9449, 7774 ]#③データ抽出したい銘柄コードを指定して配列comp_codeに設定
comp_code.each do |x|#④comp_code配列の1要素がx変数に入りdo~endの処理をループする
  
	puts "銘柄コード:#{x}"#⑤情報を出力する銘柄コードを表示
	page = agent.get("http://profile.yahoo.co.jp/independent/#{x}")#⑥対象の画面のURLを指定して該当のページのhtmlをpage変数に格納
	table_tr = page.search('table.yjMt tr')#⑦page変数に格納されているhtmlからcssセレクタを指定して要素を検索。tableタグのクラス名「yjMt」のtrタグを探して!って意味
					    #<table class="yjMt">タグで囲まれているtrタグを1要素として探してって意味

 #⑧下記は各要素を出力
  print "#{table_tr[5].text()}".gsub(/\n(\s| )*\n/, "\n").gsub(/(\r\n|\r|\n)/, ",")#改行を","に置換
  puts
  print "#{table_tr[6].text()}".gsub(/\n(\s| )*\n/, "\n").gsub(/(\r\n|\r|\n)/, ",")#改行を","に置換
  puts
  print "#{table_tr[7].text()}".gsub(/\n(\s| )*\n/, "\n").gsub(/(\r\n|\r|\n)/, ",")#改行を","に置換
  puts
  print "#{table_tr[8].text()}".gsub(/\n(\s| )*\n/, "\n").gsub(/(\r\n|\r|\n)/, ",")#改行を","に置換"
   
  puts
  puts

  sleep(1) #SLEEP1秒
  
end


途中、ちょっと躓いたけど、なんとかできた。
ソースの解説は、コメントみればそのまんまなんだけど、Mechanizeってライブラリが超優秀だからこいつ使えば簡単にできる。

①Mechanizeオブジェクトを生成。
②セキュリティ証明書ファイルを指定する。ファイル作成方法はググればすぐでてくる。これがないとサイト先でエラーとなってスクレイピングができない。
③データ抽出したい銘柄コードを指定して配列comp_codeに設定
④eachコマンドはrubyでは必須のループコマンド、配列オブジェクト(上記でいうとcomp_code変数)から配列の要素[0],[1]・・・を最後まで純にループして、|x|変数に代入してdo~endまでの処理を実行
⑤情報を出力する銘柄コードを表示
⑥URLを指定して該当ページのhtmlを取得。取得したhtmlはpage変数(クラス名page)に格納される
⑦ここがWEBスクレイピングの肝心要の処理!pageに格納されたhtmlから必要な要素だけを指定してくるとこ。page.bodyとかで一回全html出力して、そこから必要な情報のcssセレクタを抽出してくる。
 今回の例だと、

っていうテーブルタグで囲まれている情報を1要素としてとりたかったので、page.search('table.yjMt tr')と記載した。  
のtr要素を1要素として取出すという意味。 ⑧tr要素の配列の6番目~9番目(配列の添え字は0番から付与)にそれぞれ出力したい情報があったで出力した。その後のgsubメソッドは空行を取り除いたり、改行を","に変換したりして出力を整えた。 結果は下記のような感じになりました。

C:\Users\XXXXX\Desktop\ruby>ruby yahoo.rb
銘柄コード:9984
,売上高,46,312百万円,46,118百万円,47,423百万円,
,営業利益,8,595百万円,11,478百万円,26,402百万円,
,経常利益,2,870,956百万円,1,193,181百万円,40,482百万円,
,当期利益,2,745,949百万円,779,783百万円,3,272百万円,

銘柄コード:9449
,売上高,32,177百万円,28,985百万円,25,292百万円,
,営業利益,887百万円,116百万円,61百万円,
,経常利益,5,058百万円,3,376百万円,1,361百万円,
,当期利益,2,960百万円,8,754百万円,-891百万円,

銘柄コード:7774
,売上高,2,135百万円,1,430百万円,1,321百万円,
,営業利益,312百万円,-722百万円,-913百万円,
,経常利益,309百万円,-677百万円,-686百万円,
,当期利益,276百万円,-681百万円,-690百万円,

さぁ、世界の情報を集めるぞ!!!