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自体の勉強にオススメです。

blog-page_footer_336




blog-page_footer_336




-BackEnd
-,

執筆者:


comment

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

CAPTCHA


関連記事

laravel logo

LaravelのFacade(ファサード)とは? 何気なく使用していた裏側の仕組みを解説!

1 はじめに1.1 Facadeを使用しているクラス2 Facadeの仕組み3 Facadeの作成3.1 サンプルコードに必要な実装3.2 Serviceの作成3.3 Facadeクラスの作成3.4 ...

Stripe Connectを使って継続課金を実装

1 はじめに2 商品・価格の登録2.1 マイグレーション2.2 製品・価格登録処理の実装2.3 Stripe管理画面での確認3 サブスクリプション登録3.1 事前準備3.2 課金処理の実装3.3 St ...

Stripe Connectを使って複合プランの継続課金を実装

1 はじめに1.1 想定する継続課金1.2 想定するシチュエーション2 継続課金商品の作成2.1 プランの継続課金商品の作成2.2 ID数の継続課金商品の作成3 実装3.1 プランAとID数を30契約 ...

Go言語

Go言語、ゴルーチン(goroutine)で並列処理を

1 はじめに2 ゴルーチン2.1 go文2.2 ゴルーチンの終了条件2.3 WaitGroup3 チャネル3.1 チャネルの型3.2 チャネルの生成3.3 チャネルの送受信3.4 チャネルとゴルーチン ...

rails

Railsで複合主キーのテーブルを扱う

1 はじめに1.1 前提条件2 実装例2.1 config2.2 マイグレーション2.3 モデル3 さいごに はじめに RailsでWebサービスを開発する際のDB設計では基本的にidが主キーになると ...

フォロー

blog-page_side_responsive

2017年12月
 12
3456789
10111213141516
17181920212223
24252627282930
31  

アプリ情報

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