Self-Curation

新卒社会人で営業マンになりました

プログラミング初心者だけどRubyでメタ検索サイトを作ろうとしてる話①

f:id:scuration:20200326233136j:plain 

 あるとき突然「自分もWEBアプリ開発者になりたい」と思ってRubyの学習を始めました。メタ検索(検索サイト横断)サイトを作りたいと思って、WEBクローリングの機能を使ってできないか検討中です。入門書はモチベが保てなくて辞めました。

 今回はRailsを使わずにMVCモデルのmodel部分を単独作成したところまで記事にしました。

※文系未経験初心者で忘備録も兼ねているものなのでお手柔らかにお願いします。

WEBクローラーとは

 WEBクローラーとはWEBサイトを巡回して情報をピックアップするプログラムのことです。僕はWEBクローラーの機能を使ってメタ検索サイトを作りたいと考えました。
 メタ検索サイトというのは複数のサイトを横断検索して結果をまとめて表示するもののことです。例えば複数のサイトを横断して一番安い航空券を見つけられるスカイスキャナーというサイトもメタ検索サイトに分類されると思います。

完成物のイメージ

 僕のイメージとしては

  • 前提として横断対象の検索結果ページのURLが「固定URL+検索ワード」で成り立っている
  • 検索結果ページURLの固定部分をWEBクローリングに組み込んでおく。
  • キーワードを入力してプログラムが実行されると「http://〇〇〇+検索ワード」を対象にWEBクローリングが実行される。
  • WEBクローリングして得たページのソースから必要部分をピックアップして変数に入れる
  • メタ検索結果ページに遷移する。

というメカニズムでのコーディングを考えました。

入門書は続かなくて挫折した

  以前から何かしらプログラミングを学ぼうと考えていた時期がありました。最初は”大は小を兼ねる理論”でJavaを始めましたがモチベーションが続かず挫折。それから時間が経ってRubyを始めようと思い、入門書を購入するも目的もなくひたすらインプットを続ける作業が苦痛で辞めてしまいました。

 そこで僕が至った結論は「独学ならより具体的な作品の方がモチベーション保てるし後から知識はついてくる」ということです。実現したい機能をネットで調べてあとからコードの意味や動作のメカニズムを理解していくという感じですね。

0.準備

  • エディタのインストール(自分はVScodeにしました)
  • Rubyのインストール→Download
  • Railsのインストール

1.RubyでWEBクローリングのプログラムを作成

まずはRailsを使わずにターミナル上で動作するWEBクローリングを作成します。

今回述べる部分はほとんどこちらのサイトを参考にさせていただきました。

1-0. open-uriとnekogiri

 今回はopen-urlとnekogiriという機能を使います。open-uri=対象ページのHTMLを取得、nekogiri=分析・抽出といった役割の違いがあると思われます。
 
 open-uriは標準で入っているのに対してnekogiriは後から自分でインストールする必要があります。ちなみにopen-ur"l(エル)"ではなくur"i(アイ)"です笑

koooza.net

1-1. nekogiriのインストール

まずRubyがインストールされた状態でターミナルからnekogiriをインストールします。

$ gem install nokogiri
1-2. コードを記述

コードエディタで以下のプログラムを記述します。
参考サイトを検索用にアレンジし、自分なりに補足を加えました。

#1
#open-uriとnekogiriの呼び出し
#openはページのHTML取得、nekogiriは解析して必要な情報を抽出という役割分担

require 'open-uri'
require 'nokogiri'

#2
# 検索URLの形成
#ARGV[0]では検索キーワードを1個だけ読み込める

ARGV[0]
#keywords = ARGV[0]
url = 'https://' + ARGV[0]

charset = nil

#3
#先に読み込んだopen-uriを使用
#ここでは通常の呼び出しではなくブロック呼び出しを行う
#open(url)でWEBページをオブジェクトとして読み込み
#do~endがメソッド(引数のかたまり)
#do~endをひとかたまりで処理して変数htmlに渡す
#変数htmlには対象ページのソースが全て含まれている

html = open(url) do |f| #urlをオブジェクト化し|f|内に配列化
  charset = f.charset # fの文字コードを返す
  f.read  # WEBページfを読み込んで文字列化し、変数htmlに渡す
end

#4
# open-urlで読み込んだHTMLをnekogiri解析用に変換
doc = Nokogiri::HTML.parse(html, nil, charset)

#5
#titlesのブロック化
titles = []

#6
#抽出部分の指定
#Xpath以外ではCSS方式での指定が可能
#指定した要素に該当するものを全て取得して|node|に配列化

doc.xpath('//div/p[@class="text"]').each do |node|

#7
#取得した要素のうち、aタグのなかのテキスト部分を取得
    title = node.css('a').inner_text
#そのaタグの中のテキストをtitles配列に入れ込む
    titles << title
end

#今回は使わない
#入れ込んだtitles配列をファイルに書き込む
#titles.each do |text|
#  File.open("output.txt","a") do |f|
#    f.puts text
#  end
#end

#8
#今回はテキストファイルにアウトプットする代わりにインスタンス変数に移す
#titile配列を全てインスタンス変数@resultに格納
titles.each do |result|
                    @result = puts result
            end

#9
インスタンス変数@resultにtitles配列が全て格納されていることを確認
puts = @result

2. 実行方法

ターミナル上で以下を叩いて実行。

 $ ruby 〇〇(プログラム名).rb △△(ARGVに格納したいキーワード)

上手くいけば対象URLの抽出したい部分が表示されるはずです。

次回に続く

 WEBクローリングのプログラム単品はできたので次はブラウザ上で実行できるようにしたいです。検索ボックスにキーワードを入れると裏でプログラムが動いて、実行にページ遷移してリザルトが表示されるようにします。