2017/09/13
BeautifulSoup以外でのスクレイピング
はじめに
PythonにはBeautifulSoupというスクレイピングするのに持って来いなModuleが用意されています。
実際使ってみて「もうちょっと使いやすければ、、、」と思った点。
1. 文字コードがUnicodeだったりUTF-8だったり場面によってコロコロ変わる
2. DBとの連携時はやはりフレームワークが必要だが、そんな知識は・・・
どちらも知識不足、、、と言われると致し方ない。
そんなとき「Ruby(実際はmodule)にも似た機能がある」という情報を見つけ早速導入。
その名は・・・「Rubyful Soup」。。
いざインストール
残念ながらRailsのプラグイン管理gemではインストール出来ず。
手動にてダウンロードして読み込みます。
手動にてダウンロードして読み込みます。
https://www.crummy.com/software/RubyfulSoup/
何やら手動ダウンロードするリンクがあるのでクリック。
反応しない。
良く見ると上のNoteに「もうメンテしませんよ。hpricotというものをオススメします」と。
作者頓挫したご様子。
気を取り直してHpricot導入!
ググったら一番上に安心のGithubへのリンク。
https://github.com/hpricot/hpricot
https://github.com/hpricot/hpricot
Installationを読むとgemにも当然対応。
早速いつもの流れでRailsのプロジェクトを作成。ここは割愛。
Gemfileに’hpricot’を追記して
1 | bundle install |
し、実行するプログラムに
require ‘hpricot’
と記述すれば使えます。
いざ実装!
TopicというModelを作っておきます。
次にスクレイピングプログラム。
特にWebでイベントを作るわけでもないので今回はバッチで。
1 | rails g model Topic |
次にスクレイピングプログラム。
特にWebでイベントを作るわけでもないので今回はバッチで。
lib/tasks/scrape.rb
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 | # encoding: utf-8 include ActionView::Helpers::TextHelper require 'rubygems' require 'mysql2' require 'net/http' require 'uri' require 'json' require 'hpricot' require 'open-uri' require 'kconv' namespace :scrape do desc "最新のニュース5件取得" task get_news_topics: :environment do url = 'https://www.yahoo.co.jp/' f = open(url).read doc = Hpricot(f) is_topics = false (doc/"table").each.with_index do |topic, index| next if index < 13 (topic/"a").each.with_index do |t, ind| next if ind > 5 @topic = Topic.new(content: t.inner_html.to_s.sub("\"", "")) @topic.save end end end end |
文字コードもあまり意識せずにDBへの保存も
Topicというテーブルに対してcontentを入れてsaveするだけ。
相変わらず簡単(すぎる)Rails可愛いですね。
補足
速度面ではやはりPythonのBeautifulSoupには負けっるようです。
Rails自体が要するベーススペックがやや高めなので致し方ないとはいえPythonを使い倒せるよう勉強していきます。
Rails自体が要するベーススペックがやや高めなので致し方ないとはいえPythonを使い倒せるよう勉強していきます。
Author Profile
スターフィールド編集部
SHARE