BackEnd

【Ruby Advent Calender 2017】Rubyでスクレイピングをしてみる【11日目】

投稿日:2017年12月11日 更新日:

はじめに

Ruby Advent Calender 2017、11日目の記事になります。
今回は以前実施した、Rubyでのスクレイピングについて再度記載したいと思います。

Selenium WebDriverPhantomJSなどは使用しておりません。

概要

以前、技術評論社さんのデータサイエンティスト養成読本という本を読みました。
いろいろな技術の紹介があり、非常に参考になりました。

その中でスクレイピングに関するサンプルコードもありました。
今回はPythonで書かれていたスクレイピングのコードをRubyで書き直した記事になります。

なお、Pythonで書かれたサンプルの方は実際に書籍をご覧になってください。

仕様

技術評論社さんのサイトに行き、直近の記事タイトルとそのリンクを取得してJSONで吐き出します。

ソースコード

実際に書いたソースコードはこちらになります。
その後、各項目について記載したいと思います。

ファイル名を指定してrubyコマンドで実行できます。

使用したモジュール、Gem

対象ページを取得

open-uriのopenメソッドを使用し、対象URLを開いて取得します。
その際、オプションとしてUser Agentが渡せるので、クローラーだと分かるような名前をつけてあげます。
取得したページはNokogiriでHTMLとして解析して返却します。

XPATHから目的のものを抜き出す

Google Chromeなどを使用すれば、対象のHTMLタグのXPATHを取得することができるので、そちらから目的のものを取得します。
XPATHの説明は、下記の方の記事が分かりやすいかと思います。

同じ階層の、例えば<div>などは配列で返ってくるので、ループして必要なだけ抽出します。
記事タイトル、リンク先それぞれ取得の方法が違うので、メソッドを用意してあげます。

次のページのリンクを取得する

はじめにクラス変数として、@@page_num = 2と与えています。
技術評論社さんの記事ページはページングされており、過去の記事を見るためには次のページへ行く必要があります。

このとき、次のページボタンのXPATHを指定し、そのDOMのURLを取得すれば、同様の処理を繰り返すことで次のページの記事も取得できます。
今回のサンプルでは、何ページ目まで取得するか、という意味で@@page_num = 2が与えられています。
もしそれ以上過去の記事がなければ、リンクが取得できないはずなので、その場合はbreakします。

他のサイトの記事でも試してみる

このスクレイピングのコードですが、書籍で紹介されていた内容でかなり整っておりました。
このコードを継承してしまえば、他のサイトだってだいたい取得できそうだったので試してみます。

継承する際、継承元のGihyoCrawler.runをコメントアウトか消しておかないと2回実行されてしまうので気をつけてください。
(私だけかもしれません。。なんで2回実行されているんだ、とドツボにハマっていました。。)

本ブログ

手前味噌ですが、本ブログにも記事一覧ページがありますので、ここから取得してみます。
確認しながら進めると、クラス変数の値を変えるだけでいけました。

Qiita

Qiitaも取ってみます。
Qiitaはログインしていないといわゆる新着ページにいけないので、ログインしていなくても確認できる、「Rubyの記事で最近いいねされた記事」のページから取得します。

はてなブックマーク

はてなブックマークの新着からも取得してみます。
はてなブックマークは新着記事の先頭が大きめの表示なので、ちょっとメソッドを変更しないといけないかな、と思いましたが、同じXPATHで取得できますね。

「次へ」のようなリンクがないので、ループ回数は1回にしています。

さいごに

スクレイピングの勉強がてら書き換えてみました。
サンプル自体が非常に良くできていたので、色々なブログをスクレイピングする際もかなりスピーディにできます。
やはり基底クラスは重要ですね。

Railsで素早くWebページを作成することは違うので、Ruby自体の勉強にオススメです。

page_footer_300rect




page_footer_300rect




-BackEnd
-,

執筆者:


comment

メールアドレスが公開されることはありません。

CAPTCHA


関連記事

rails

Ruby、Railsの時間に関するメソッドを使用してみた

はじめに 普段PHPのお仕事をしています、tonnyです。 半年程前からRuby on Railsの勉強を始めました。 今回はよく使う時間に関するメソッドついてまとめたいと思います。 目次 1 はじめ ...

rails

Shrineをモデルに関連付けないで使用してハマったこと

1 はじめに2 アップロード時にリサイズする3 アップロード時のバリデーション4 アップロード時に古いファイルを削除する5 さいごに はじめに ShrineはRailsでのアップロードを簡単に行えるよ ...

rails

Shrineでアップロードする際に画像を加工する

1 はじめに2 アップロードする画像のリサイズ2.1 Gemを追加2.2 Uploaderの修正3 サムネイルを作成する3.1 Uploaderの修正3.2 サムネイルを表示する4 バリデーションの追 ...

js

GoogleAppsScriptを使ってmBaaSの定期実行処理を実装する

1 はじめに1.1 簡単な状況説明1.2 定期実行を行う方法2 実装2.1 実装の流れ2.2 JavaScriptの実装2.3 スクリプトをアップロードする2.4 Google Apps Script ...

rails

RailsでAjax処理で画面を更新する

1 はじめに2 View(遷移元)の設定3 Controllerの実装4 View(遷移先)の実装5 参考6 さいごに はじめに RailsでAjax処理で画面を更新する方法を簡単に紹介します。 Vi ...

page_side_300rect

Web版MyCoach

私たちはより広い方にコーチングを知ってもらいたいと考えています。
下記のサイトにて、コーチの方々を紹介しておりますので、よろしければご覧ください。

アプリ情報

私たちは、目標を達成したい方を応援する、TODOアプリもリリースしております。
下記のアイコンから無料でダウンロードできます。

リンク

follow us in feedly
2017年12月
« 11月 1月 »
 12
3456789
10111213141516
17181920212223
24252627282930
31