[Ruby]harvestmanを使ったWebページスクレイピング

Javascriptを使用していない単純なページ限定で、簡単にWebページスクレイピングをやる方法
基本的にはNokogiriで解析できるページ限定となります。


使用するライブラリ


  1. harvestman ... スクレイピングライブラリ
  2. table_print ... Hash等を整形して出力してくれるツール

実行時の各種バージョン


ruby 2.0.0p247
harvestman (0.1.1)
table_print (1.1.5)

スクレイピングするページ


githubのruby trandingのページ


ソースコード


require 'harvestman'
require 'table_print'

TablePrint::Config.max_width = 100

Harvestman.crawl 'https://github.com/trending?l=ruby' do
trandings = []
css 'li.repo-leaderboard-list-item' do
title = ( css 'h2 span' rescue '' )
discription = ( css 'p' rescue '' )
trandings << {title: title, discription: discription}
end
tp trandings
end

結果


TITLE           | DISCRIPTION                                                                                         
----------------------------------------------------------------------------------------------------------------------
feedbin | RSS Reader
mion | Quick and dirty web crawling.
rails | Ruby on Rails
rubyzip | Offical Rubyzip repository
mxcl | The missing package manager for OS X.
CocoaPods | A repository of CocoaPods (cocoapods.org) specifications.
gitlabhq | Project management and code hosting application. Follow us on twitter @gitlabhq
imathis | Octopress is an obsessively designed framework for Jekyll blogging. It’s easy to configure and ea...
emberjs | Source for emberjs.com
square | A simple way to serve up appropriate images for every visitor.
mojombo | Jekyll is a blog-aware, static site generator in Ruby
al3x | A set of Ansible playbooks to build and maintain your own private cloud: email, calendar, contact...
avdi |
elcuervo | Fast analytics using Redis
plataformatec | Flexible authentication solution for Rails with Warden.
thoughtbot | Easy file attachment management for ActiveRecord
capistrano | Remote multi-server automation tool
rom-rb | Ruby Object Mapper - Relation
mitchellh | Vagrant is a tool for building and distributing working environments.
bbatsov | A community-driven Ruby coding style guide
ruby | The Ruby Programming Language
thomas-mcdonald | bootstrap-sass is bootstrap for Sass, ready to roll
rapid7 | Metasploit Framework
CocoaPods | The Objective-C library dependency manager.
taskrabbit | A Read-Write splitting adaptor for Active Record

パーフェクトRuby (PERFECT SERIES 6)
Rubyサポーターズ すがわら まさのり 寺田 玄太郎 三村 益隆 近藤 宇智朗 橋立 友宏 関口 亮一
技術評論社
売り上げランキング: 1,034
スポンサーサイト

Twitter bootstrap3で変わるところを先取り

Twitter bootstrapがそろそろ version3になります。
version2とどのように違うのかをちょっとだけ予習しておきます。


対応ブラウザ


IE8以上、モダンブラウザ、モバイルブラウザは対応する模様。
ただし、ntn-childがtableで使われていたりするので、IE8はまぁ見れるよ。程度とするのが無難。


Unofficially, Bootstrap should look and behave well enough in Chromium for Linux and Internet Explorer 7, though they are not officially supported.

グリッドシステム


  • Bootstrap3はデフォルトでレスポンシブ
  • 12カラム構成の変更はなし(ただし、指定するクラスは変更された
  • -sm,-lgプレフィックスが追加された

Bootstrap2では、bootstrap-responsive.min.css等を読み込むことで、レスポンシブデザインにすることができました。Bootstrap3では、標準でレスポンシブデザインとなります。


Bootstrap includes a responsive, mobile-first fluid grid system that appropriately scales up to 12 columns as the device or viewport size increases. It includes predefined classes for easy layout options, as well as powerful mixins for generating more semantic layouts.

気になるグリッドシステムをもう少し


row-fluidから rowへ


Bootstrap2では、"row-fluid"というクラスを追加して、レスポンシブデザインとなるようにしていましたが、
Bootstrap3では "row"で動作します。


spanXからcol-Xへ


表示画面の幅を12分割するという構成は変わっていません。
しかし、ブロック要素の幅の指定が、span6のような形式からcol-6へ変更されました。


Bootstrap2で span6を指定し、responsive.cssを読み込んでいた場合、
以下のような動作となりました。


デバイスの幅が768pxより小さい場合は、
bootstrap-responsive.min.css のメディアクエリにより
幅が100%へ変換

デバイスの幅が1200pxより大きい場合は、全体のほぼ半分の幅になるように調整

Bootstrap3からは "col-6"の指定をした場合、
どのデバイスで閲覧しても50%の幅になるようになっています。


sm, lgプレフィックス


  • 768px未満は col-x
  • 768px以上993px未満は col-sm-x
  • 993px以上は col-lg-x

Bootstrap3からは、デバイスの幅ごとに、ブロック要素の表示幅を変更することができます。
それには、sm, lgの各プレフィックスを付与する必要があります。


これにより、以下の様な対応ができるようになります。


<div class="row">
<div class="col-sm-4 col-lg-2">サイドバー</div>
<div class="col-sm-8 col-lg-10">メイン</div>
</div>

これは、デスクトップ等の大きい画面の際は、サイドバーは全体の1/6の大きさ、タブレット型のデバイスの場合は全体の1/3の大きさにするという指定ができるようになりました。


カラムの表示順制御(.col-lg-push-*, .col-lg-pull-*)


Boostrap2で組む上での問題点として、以下のような問題が発生することがありました。


  • 左側にメニューを配置
  • 右側をメイン領域

この構成にした場合、モバイルデバイスで閲覧した場合、左側のメニューが最初に表示されることになります。(通常であれば折りたたみますが)


Bootstrap3ではこの表示順を制御することができます。
以下のようにすると、右側と書いてあるdivが右側に表示され、左側と書いてあるdivが左側に表示されるようになります。
SEOでページ中での出現位置をなるべく上にしたいという考えがある方は使うといいかもしれません。
また、モバイルでは当然右側が上に表示されるようになります。


<div class="row">
<div class="col-lg-9 col-lg-push-3">右側</div>
<div class="col-lg-3 col-lg-pull-9">左側</div>
</div>

visible-*, hidden-*の変更


  • .visible-phone は .visible-sm
  • .visible-tablet は .visible-md
  • .visible-desktop は .visible-lg
  • .hidden-phone は .hidden-sm
  • .hidden-tablet は .hidden-md
  • .hidden-desktop は .hidden-lg

使用している場合は、phone部分を sm, tablet部分をmd, desktop部分を lgに置き換えるだけ


フォームの変更点


TODO


  • control-group から form-group

[2013年版][Rails3.2][Rails4.0]管理画面とフロント画面のroutesの綺麗な分離方法

こちらの記事が比較的好評でした。
管理画面とフロント画面のroutesの綺麗な分離方法
これを書いたのがWebプログラマーを始めて3年目に突入という時でした。
そろそろ5年目突入ということで、最近の書き方を公開してみます。


環境



ruby 2.0.0-p195
Rails 3.2.14, 4.0.0

準備


適当にscaffoldで作っておきます。
routingの確認なだけなので、中身はなくてもいいです。


rails new routing_app
rails g scaffold books name
rails g controller admin::books
rake db:create
rake db:migrate

以下のようになります。
162_01.png


実際にRoutingを書く


最近はroutes.rbに記述せずに以下のようにしています。
以下のファイルをlib/routing_app/routing.rb として保存します。


module RoutingApp::Routing
def self.admin(options = {})
options[:path] ||= 'admin'
options[:skip] ||= false
Rails.application.routes.draw do
namespace :admin, path: options[:path] do
root to: 'books#index'
resources :books
end
end unless options[:skip]
end

def self.front(options = {})
options[:path] ||= '/'
options[:skip] ||= false
Rails.application.routes.draw do
namespace :front, path: options[:path] do
root to: 'books#index'
resources :books
end
end unless options[:skip]
end
end

そして、routes.rbには以下を記述するだけ


require 'routing_app/routing'

RoutingApp::Application.routes.draw do
RoutingApp::Routing.admin
RoutingApp::Routing.front
end

この状態でrake routesを実行してみます。


     admin_root        /admin(.:format)                admin/books#index
admin_books GET /admin/books(.:format) admin/books#index
POST /admin/books(.:format) admin/books#create
new_admin_book GET /admin/books/new(.:format) admin/books#new
edit_admin_book GET /admin/books/:id/edit(.:format) admin/books#edit
admin_book GET /admin/books/:id(.:format) admin/books#show
PUT /admin/books/:id(.:format) admin/books#update
DELETE /admin/books/:id(.:format) admin/books#destroy
front_root / front/books#index
front_books GET /books(.:format) front/books#index
POST /books(.:format) front/books#create
new_front_book GET /books/new(.:format) front/books#new
edit_front_book GET /books/:id/edit(.:format) front/books#edit
front_book GET /books/:id(.:format) front/books#show
PUT /books/:id(.:format) front/books#update
DELETE /books/:id(.:format) front/books#destroy

optionsを色々使ってみる


もうお分かりいただけたかと思いますが、routesファイル上でoptionsを渡せるようにしてありますので、
routes.rbを以下のように変更してみます


require 'routing_app/routing'

RoutingApp::Application.routes.draw do
RoutingApp::Routing.admin skip: true
RoutingApp::Routing.front
end

rake routesの結果は以下のようになります


     front_root        /                         front/books#index
front_books GET /books(.:format) front/books#index
POST /books(.:format) front/books#create
new_front_book GET /books/new(.:format) front/books#new
edit_front_book GET /books/:id/edit(.:format) front/books#edit
front_book GET /books/:id(.:format) front/books#show
PUT /books/:id(.:format) front/books#update
DELETE /books/:id(.:format) front/books#destroy

adminへのroutingが消えましたね!
やっていることの実態は前回の記事と変わりませんが、別ファイルに記述することで、
ある程度見通しよく書くことができるようになりました。


また、以下のようにしても同様な動きを実現出来ます。


require 'routing_app/routing'

RoutingApp::Application.routes.draw do
#RoutingApp::Routing.admin # 消すだけ
RoutingApp::Routing.front
end

あとは、定数を使うなり、admin用のroutes.rbを別ファイルにするなり、自由にやってみましょう。
また、routes.rbの記述量が多くなるようでしたら、routing.rbをadmin, frontと2つにわけるのもありかもしれませんね。
外部ライブラリとして、構築する場合は、このようにしておくことで、ON/OFFの切り替えやpath変更も容易になるので、お勧めです。
例) resqueの管理画面みたいなやつを作ったりとか

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。