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


関連記事

Stripe Connectを使ってCheckoutを利用した継続課金を実装

1 はじめに1.1 Checkoutを使う場合の動線2 決済画面への遷移2.1 マイグレーション2.2 Checkout Sessionの作成3 決済完了後の制御4 おまけ4.1 ローカルでWebho ...

laravel logo

Laravel Admin でCSVインポートを実装する

1 はじめに2 下準備2.1 Laravel Adminの導入2.2 Laravel Excelの導入3 Laravel Excelの実装3.1 Importクラスの作成3.2 モデルのfillabl ...

rails

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

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

laravel logo

Laravelでメールを送る

1 はじめに1.1 準備2 実装2.1 Mailableクラスの作成2.2 テンプレートの作成2.3 Mailableクラスの修正2.4 コントローラの作成2.5 コンフィグの修正3 さいごに4 おす ...

Go言語

GoのWeb Application Framework

1 はじめに2 代表的なGoのWAF2.1 軽量なWAF2.2 フルスタックなWAF3 Ginを使ってみる3.1 クエリパラメータ+ポストパラメータ3.2 ファイルアップロード3.3 URLのグループ ...

フォロー

blog-page_side_responsive

2017年12月
 12
3456789
10111213141516
17181920212223
24252627282930
31  

アプリ情報

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