簡単なWebアプリ作成RTA(テリワンSP配合表、ポケGOおすすめ技の抽出)

公開日:2018-12-10
最終更新:2018-12-10

前置き

最近彼女がテリワンSPにハマってまして、配合表から欲しい情報をメモ帳に手打ちで保存していました。
それを見て、(これくらいならスクレイピングで情報保存できるんじゃね・・・?)と閃き、実際にやってみました。
ローカルにファイルとして保存しておくことで、いちいちサイトにアクセスしなくて済みます。テリワンSPはオフラインでもできるゲームなのでとても便利になりました。
ついでに、自分はポケGOの各ポケモンのおすすめ技一覧が欲しいと思っていたので、一緒に作っちゃえ!

要件定義

  • 以下の形でテリワンSPの配合表をテキストファイルにまとめる。
    配合先モンスター名:(素材1+素材2) or (素材1+素材2) or・・・
  • 以下の形でポケGOの各おすすめ技を一覧化しテキストファイルにまとめる。
    ポケモン名 通常わざ:ゲージわざ
  • テリワンSPの配合表は、配合先と素材で同一のモンスター名が書かれていることがあるので、工夫して配合先だけ検索でヒットできるようにする。
  • 以上を、RTAっぽくなるべく短い時間で実装してみよう!

データ抽出先

抽出結果

ポケモンGO(保存先:./app/assets/pokemon.txt)

テリワンSP(保存先:./app/assets/terry.txt)

モンスター名の頭か末尾に!をつけると配合先が検索できる。
モンスター名だけで検索すると素材として使われている場合も検索対象になる。
例えば配合先としての怪力軍曹イボイノスを検索したい時、「!怪力」とか「イノス!」とかでも出てくる。

配合表の抽出が思ったより苦労した

テリワンSPの情報抽出のソースが以下になります。

    def get_info_terry(result)  
      @outstr_terry = "配合先:(素材1+素材2)  "  
      for i in 3..12 do #解説1へ  
        for j in 1..100 do #解説2へ  
          result.xpath("//div[1]/div[2]/div[1]/table[#{i}]/tbody/tr[#{j}]").each do |node|  
            if node.css('a.mokujimusibtn').present? || node.css('a/span/img').present?  
              @outstr_terry.chop!.chop! # 解説2へ  
              @outstr_terry = @outstr_terry + "\n\n" + "!" + node.xpath('td[1]/a/span').inner_text + "!:" + "\n"  
              if node.xpath('td[2]/a[2]').present?  
                @outstr_terry = @outstr_terry + "(" + node.xpath('td[2]/a[1]').inner_text + "+" + node.xpath('td[2]/a[2]').inner_text + ")or"  
              else  
                if node.xpath('td[2]').present?  
                  @outstr_terry = @outstr_terry + "(" + node.xpath('td[2]').inner_text.gsub(/\s/,"+") + ")or"  
                else  
                  @outstr_terry = @outstr_terry + "(" + node.xpath('td').inner_text.gsub(/\s/,"+") + ")or"  
                end  
              end  
            elsif  
              @outstr_terry = @outstr_terry + "(" + node.xpath('td/a[1]').inner_text + "+" + node.xpath('td/a[2]').inner_text + ")or"  
            end  

          end  

        end  
      end  

      @outstr_terry.gsub(/(+)/,"")  

    end  

解説1
for i in 3..12 doは、あ行のモンスターわ行のモンスターのTableをそれぞれ指定するためにカウントアップで対応しています。

result.xpath("//div[1]/div[2]/div[1]/table[#{i}]/tbody/tr[#{j}]").each do |node|  
# table[#{i}]で各行のTableを指定  
・・・  
end  

解説2
下記の画像は、抽出先のデータが含まれているページの一部です。

赤枠のようにまとまったtable情報がなく、また緑枠内のtr内でモンスターと配合元の情報が混在していました。そのため、tr情報を一つずつ見ていき、mokujimusibtnクラスがあるときは配合先モンスターとみなし(node.css('a.mokujimusibtn').present?)その場合の処理を、違う時は・・・といったように場合分け処理しています。
for j in 1..100 do となっているのは・・・ほんとはそれぞれのtbodyに存在するtrの数だけ回すのが一番良いのですが、調査してもなかなか出てこなかったため妥協しました。何かいい方法あれば教えてください・・・

かかった時間

テリワンSPの情報抽出:2時間
ポケモンGOの情報抽出:20分
その他htmlやファイル書き出しのコード、抽出先サイトの選定、各種妥協までの意思決定など諸々:1時間
合計約200分でした。

まとめ

配合表の方は、サイトの作りで統一されていない部分が散見され、実は一部不具合があります。
しかし9割以上は正しく取れているはずなので、とりあえずここまでで終わりとしました。統一した作りになってればよかったんですけど・・・
勉強がてら作ってみた簡単なアプリですが、Herokuにも公開したので使いたい方はどうぞ。
githubにも公開してますので、ここからアレンジしてみたい方はぜひ使ってみてください。
ここまで読んでいただきありがとうございます。

記事が少しでもいいなと思ったらクラップを送ってみよう!
54
+1
作ったもの、プログラミングで共有できそうなこと、IT関連でやってみたことなど、なんでも書いていきます。ヤドン可愛い

よく一緒に読まれている記事

0件のコメント

ブログ開設 or ログイン してコメントを送ってみよう
目次をみる

技術ブログをはじめよう

Qrunch(クランチ)は、ITエンジニアリングに携わる全ての人のための技術ブログプラットフォームです。

技術ブログを開設する

Qrunchでアウトプットをはじめよう

Qrunch(クランチ)は、ITエンジニアリングに携わる全ての人のための技術ブログプラットフォームです。

Markdownで書ける

ログ機能でアウトプットを加速

デザインのカスタマイズが可能

技術ブログ開設

ここから先はアカウント(ブログ)開設が必要です

英数字4文字以上
.qrunch.io
英数字6文字以上
ログインする