「大好きなあの人の”今”」を自動的に取得する方法
社員ブログ
こんにちは。
最近、漫画「進撃の巨人」にハマって通して読んでみましたが、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]
基本形は以下のようになります。
[ruby]
require ‘anemone’
URL = "https://example.jp"
Anemone.crawl(URL) do |anemone|
anemone.on_every_page do |page|
# URLを取得
puts page.url
end
end
[/ruby]
[ruby]
Anemone.crawl(URL, options)
[/ruby]
optionsには以下のようなオプションを渡せます。
[ruby]
:depth_limit 階層の制限を指定
:delay アクセス間隔を指定
:user_agent UAを指定
:skip_query_strings trueにするとURLのパラメーターを無視する
[/ruby]
[ruby]anemone.メソッド[/ruby]
以下のようなメソッドが使えます。
[ruby]
on_every_page 取得したすべてのページごとに処理を実行
after_crawl クロール後に各ページのデータに処理を実行
focus_crawl 各ページごとに巡回するリンク先を指定
on_pages_like 指定された正規表現にマッチするURLを持つページに処理を実行
skip_links_like 指定された正規表現にマッチするURLを持つページは取得しない
[/ruby]
3、準備2:スクレイピング[データの抽出]
これには、「Nokogiri」を使います。(※準備1で取得したWEBページ情報の中からさらに必要な情報だけを抜き取ります。)
[https://github.com/sparklemotion/nokogiri]
基本形は以下のような形です。(参照: 上記GitHubページ)
[ruby]
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
[/ruby]
4、実際にプロ野球情報サイトから情報を取得してみる
実際に堂林選手の成績を取得してみようと思います。
こちらのサイトから情報を取得します。
[https://baseball.yahoo.co.jp/npb/player/900430/]
情報を取得するだけなら数行で済みます。
[ruby]
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
[/ruby]
以下がコンソールで実行した結果です。(一部省略)
[ruby]
".281" # 打率
"31" # 試合
"37" # 打席
"32" # 打数
"9" # 安打
"6月2日" # 最近6試合の結果
"vs.ロッテ" # 相手チーム
"捕ゴロ" # 打席結果
"5月31日"
"vs.西武"
"四球、右飛、左本、二ゴロ"
[/ruby]
目的のデータは取得できましたね。
あとはこれらを整形して、Slackに通知してあげるだけです。
Slackに通知させる箇所は割愛しますが、私のSlackにはこんな感じで毎日通知させるようにしています。
※注意点
スクレイピングにはマナーがあるのでそれだけは気をつけましょう。
5、終わりに
私の場合はプロ野球の情報を取得してSlackに通知することで、人生の幸福度を向上させていますが(笑)、手動で行なっていた採用情報の取得をこの形で自動化をさせて、業務効率をあげたことがあります。
エンジニアは趣味が仕事に役に立つ時が多いので楽しいですね!
最後に、私たちは「全ての手作業を自動化したい!」「開発以外でも業務を効率化させたい!」エンジニアを募集していますので、ご興味がある方は以下からご応募ください!