プログラミング初心者だけどRubyでメタ検索サイトを作ろうとしてる話②'
おはようございます。
社会人になって最初の週末です。
学生時代はかなりアルバイトしていた方だと思うのですが、連勤はしないようにシフト組んでいたのでまだ新生活に慣れていない状況です。
今回は先日から書いてる「RailsでWEBクローリングする話」の経過報告と課題の洗い出しをします。
プログラミング初心者だけどRubyでメタ検索サイトを作ろうとしてる話② - コロンブスの卵
ここまでの経過
これまえやってきたことは以下の通りです。
① RubyでWEBクローリングプログラムの作成→ターミナルで動作
② Railsの導入、Railsアプリの新規作成、Model・View・Controller・Routingの理解
③ open-uri、nekogiriの使い方を理解
④ form_tagの使い方を理解
⑤ ①~④を総合してフォームに入力した単語で検索サイトの検索結果をWEBクローリングできるプログラムを作成
追記:URIに日本語を含められるようにするURI.encodeメソッド
対象WEBページのHTMLを読み込んでくれるopen-uriメソッドについては前回(②)の記事で触れました。
しかしopen-uriはそのままでは日本語に対応しておりません。
多くのサイトでは検索フォームに入力したキーワードをURLに渡すと思いますが、URLに日本語が含まれると以下のようなエラーが出てプログラムは機能しなくなります。
URI::InvalidURIError in SearchesController#search URI must be ascii only "https://…"
そこで、
url = 'https://~XXX' + search
の次の行に新しく記述を加えて以下のようにしてください。
url = 'https://…' + search url = URI.encode(url) #追加の記述
searchで受け取ったキーワードが日本語でもURIをアルファベット&数字の文字列に変換してくれるので正常に開けるようになります。
先日作ったプログラムを実際に動かした
正直、文章だけでは伝わりづらい部分もあるので実際にどのようなプログラムなのかスクリーンショット付きで説明します。
今回は何となくですが、あのサラリーマンには馴染み深いビジネス誌「週刊ダイヤモ〇ド」を発刊しているダイヤモ〇ドオンラインさんでやってみます。
①検索したときのURIで固定部分を把握
適当に検索結果を出してくれそうなキーワード、今回は「コロナウィルス」でネット版ダイヤモンドを検索。
するとブラウザのアドレス欄は以下のようになっているはずです。
ttps://diamond.jp/search?fulltext=コロナウィルス
このコロナウィルスという検索キーワードを除いた部分が検索URIの固定部分です。
②プログラムに固定URIを指定
url = 'https://~~/search?fulltext=' + search
ダイヤモンドさんのドメインは省略しております。
③xpassを指定。
Chromeでは右クリック>検証を開きます。
表示させたいコンテンツ部分のIDをコピーします。
doc.xpath('//*[@id="main-column"]').each do |node|
このようにID部分を書き換え。
④ターミナルを起動。
cd C:\…\example
と作ったアプリのアプリのディレクトリに移動
その後
rails s
でRailsServerを起動。
⑤”http://localhost:3000/”をブラウザで開いてこのような画面が出れば1stステップはクリア
⑥”http://localhost:3000/example”を開くと画像のように検索フォームの設置されたトップページが表示される。
⑥試しに"コロナウィルス"と検索すると以下のように指定したxPass部分が表示されるはず。
今後の課題
ここまでの課題は以下のようなものがあります。今後検討していきたい次第です。
WEBクローリング処理後のテキストに変な文字列がいっぱい入る
上の画像見ていただいたら分かる通り、特に”\n”という文字列が入りまくってます。
実践的に使用するにはさらにこれらを取り除くようなプログラムを書く必要があります。
大手検索エンジンではほぼ使えない
GoogleやBingなど大手検索サイトで実験してみるとエラーを返されます。
少なくともこれら2サイトでは検索結果に対してのWEBクローリング使用を制限しており、あちら側から用意されたAPIを使う必要があると思われます。
xPassのID指定が必要
サンプルプログラムではxPassで抽出したい箇所をIDで指定しなければなりません。
右クリック>検証でIDの出ない箇所を指定することができず、サイトのHTML、CSS構成によっては綺麗に必要部分を抽出できない課題があります。