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の記事で最近いいねされた記事」(現在は、404 Not Foundになってしまっています)のページから取得します。

はてなブックマーク

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

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

さいごに

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

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

page_footer_300rect




page_footer_300rect




-BackEnd
-,

執筆者:


comment

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

CAPTCHA


関連記事

Go言語

Go言語 gocraft/workを使って常駐プロセスでジョブを処理させる

1 はじめに2 workの特徴3 workを使えるようにする3.1 Redisのインストール3.2 Go用のライブラリインストール4 Enqueue〜ジョブ実行まで4.1 Enqueue側4.2 ジョ ...

rails

configに追記したのに、rails runnerが起動しない?

1 はじめに1.1 環境2 rails runnerを使用してみる2.1 バッチファイルの作成2.2 configにパスを追記2.3 実行3 ところが…3.1 解決方法4 おまけ(runnerコマンド ...

rails

私たちのFactoryGirlとRspecの使用ルール その1

1 はじめに2 そもそもなぜ基本ルールなどを作成しようとしたのか?3 Rspec編3.1 describe、context、itの階層で使用する3.2 10個以上のテストレコードを作成したい場合は、ト ...

laravel logo

[Laravel] ログの扱い方 [5.8]

1 はじめに2 環境3 Monologについて4 コード上で設定する方法5 config/logging.phpで設定する方法6 おまけ:ログレベルについて7 さいごに8 おすすめ書籍 はじめに こん ...

Vue.js入門その4〜TODOアプリにサーバーサイドを追加してみる〜

1 はじめに2 準備2.1 今回作成したいもの2.2 環境構築3 サーバーサイド3.1 DB3.2 メモ:rails generateで余分なファイルを生成しない3.3 作成したファイル4 ビューの作 ...

フォロー

follow us in feedly

page_side_300rect

2017年12月
« 11月 1月 »
 12
3456789
10111213141516
17181920212223
24252627282930
31 

アプリ情報

私たちは無料アプリもリリースしています、ぜひご覧ください。 下記のアイコンから無料でダウンロードできます。