2017.07.05 社員ブログ

「大好きなあの人の”今”」を自動的に取得する方法

大好きなあの人

 
こんにちは。
 
最近、漫画「進撃の巨人」にハマって通して読んでみましたが、1週目では理解できず、2週目でやっと理解したと信じているエンジニアの深澤です。
 
ちなみに弊社には「新宿スワン」という漫画が全巻あったり、その他社長の趣味漫画がたくさん置いてあります。
 
さて、今回は「Slack」と「Ruby」を使って「大好きな人の”今”」を自動的に取得する方法について書いていきます
 


【目次】
– 1、はじめに
– 2、準備1:クロール
– 3、準備2:スクレイピング
– 4、実際に情報を取得してみる
– 5、終わりに


 
 

1、はじめに

突然ですが、広島東洋カープの堂林選手をご存知でしょうか?
 
イケメンですね。もうたまりません。
 
男性ファンも多いですが、特に女性ファンがたくさんいるカープのプリンスです。私が高校時代の時は「尾張のプリンス」と呼ばれていました。
 
私自身、高校野球をやっていたこともあり、当時は毎日のように堂林選手のフォームを研究していました。
 
すると、フォームを研究する枠を超えて、いつのまにか何通もファンレターを送るくらいの熱狂的なファンになり、ずっと応援していました。
 
しかし、プロ野球の世界は厳しく、最近はなかなか結果が出ないようで悲しいです。ただ、それでも常に彼の成績は気になってしまいます。
 
その為、私はRubyで「堂林選手の成績をSlackに通知」しています。今回は、その方法について書いていきます。
 
 

2、準備1:クロール[Webページを収集する]

WebクローラーフレームワークのAnemoneを使います。(※必要なWEBページ情報を集めます。)

[https://github.com/chriskite/anemone]

基本形は以下のようになります。

require 'anemone'

URL = "https://example.jp"

Anemone.crawl(URL) do |anemone|
  anemone.on_every_page do |page|

      # URLを取得
      puts page.url

  end
end
Anemone.crawl(URL, options)

optionsには以下のようなオプションを渡せます。

:depth_limit 階層の制限を指定
:delay  アクセス間隔を指定
:user_agent UAを指定
:skip_query_strings trueにするとURLのパラメーターを無視する
anemone.メソッド

以下のようなメソッドが使えます。

on_every_page    取得したすべてのページごとに処理を実行
after_crawl クロール後に各ページのデータに処理を実行
focus_crawl 各ページごとに巡回するリンク先を指定
on_pages_like   指定された正規表現にマッチするURLを持つページに処理を実行
skip_links_like 指定された正規表現にマッチするURLを持つページは取得しない

 
 

3、準備2:スクレイピング[データの抽出]

これには、「Nokogiri」を使います。(※準備1で取得したWEBページ情報の中からさらに必要な情報だけを抜き取ります。)
 
[https://github.com/sparklemotion/nokogiri]
 
基本形は以下のような形です。(参照: 上記GitHubページ)
 

require 'nokogiri'
require 'open-uri'

# Fetch and parse HTML document
doc = Nokogiri::HTML(open('http://www.nokogiri.org/tutorials/installing_nokogiri.html'))

puts "### Search for nodes by css"
doc.css('nav ul.menu li a', 'article h2').each do |link|
  puts link.content
end

puts "### Search for nodes by xpath"
doc.xpath('//nav//ul//li/a', '//article//h2').each do |link|
  puts link.content
end

puts "### Or mix and match."
doc.search('nav ul.menu li a', '//article//h2').each do |link|
  puts link.content
end

 
 

4、実際にプロ野球情報サイトから情報を取得してみる

 
実際に堂林選手の成績を取得してみようと思います。
こちらのサイトから情報を取得します。
 
[https://baseball.yahoo.co.jp/npb/player/900430/]
 
情報を取得するだけなら数行で済みます。
 

DOBAYASHI_URL = 'https://baseball.yahoo.co.jp/npb/player/900430/'

def get_dobayashi_results
   Anemone.crawl(DOBAYASHI_URL, depth_limit: 0) do |anemone|
     anemone.on_every_page do |page|
       doc = Nokogiri::HTML.parse(page.body.toutf8)
       doc.xpath('//div[@class="PlayerAdBox mb15"]').each do |node|
         node.xpath('//tr[@class="yjM"]/td').each do |elem|
           p elem.text
         end
       end
     end
   end
end

 
以下がコンソールで実行した結果です。(一部省略)
 

".281" # 打率
"31" # 試合
"37"  # 打席
"32" # 打数
"9" # 安打
"6月2日" # 最近6試合の結果
"vs.ロッテ" # 相手チーム
"捕ゴロ" # 打席結果

"5月31日"
"vs.西武"
"四球、右飛、左本、二ゴロ"

 
目的のデータは取得できましたね。
あとはこれらを整形して、Slackに通知してあげるだけです。

Slackに通知させる箇所は割愛しますが、私のSlackにはこんな感じで毎日通知させるようにしています。

slackに通知された結果

 

※注意点
 
スクレイピングにはマナーがあるのでそれだけは気をつけましょう。
 

5、終わりに

 
私の場合はプロ野球の情報を取得してSlackに通知することで、人生の幸福度を向上させていますが(笑)、手動で行なっていた採用情報の取得をこの形で自動化をさせて、業務効率をあげたことがあります。
 
エンジニアは趣味が仕事に役に立つ時が多いので楽しいですね!
 
最後に、私たちは「全ての手作業を自動化したい!」「開発以外でも業務を効率化させたい!」エンジニアを募集していますので、ご興味がある方は以下からご応募ください!

オフィス受付の非効率な慣習に革命を起こすエンジニアをWANTED!!

RECEPTIONIST(レセプショニスト)

人気記事一覧