2013年04月10日

動画ページURL収集のRubyスクリプト

割とどうでもいいことも記事に起こすって目標があった記憶があるから 割とどうでもいい記事書きます。

最近仕事でPHPしているので プライベートでちょろっとだけRuby書いて遊んでます。

今日はその中のひとつであるURL収集用スクリプト。

ぶっちゃけ、あるサイトをスクレイビングしているだけなので超簡単。

#!/usr/bin/env ruby

# スクレイビング用にMechanizeさんにお世話になる
require 'mechanize'

agent = Mechanize.new

url = 'http://***********/' # 趣味がバレるのでURLは伏せる:p

# get_urls.rb 20140404
# と実行したら
# http://***********/20140404.html を取得するように
url += ARGV[0] + ".html" if ARGV[0]

# ページ取得
agent.get(url)

# 各テーブル内に必要な情報があるのでとりあえずテーブル拾う
tables = agent.page.search("div.txtBody > table")

# 各テーブルを解析
tables.each do |table|
  tds = table.search("td")

  # 各セルを解析
  tds.each do |td|
    links = td.search("a")

    # このページから動画へのリンクは数字のみ含まれているのでそういうリンクを取得
    movie_links = links.select {|link| link.text =~ /^\d+$/ }

    # そのセルに目的のリンクがなければ次へ
    next if movie_links.empty?

    # 画像のalt属性に動画タイトルがあるのでそれを出力しておく
    img = td.at("img")
    puts img["alt"]

    # 動画のリンクをそれぞれ出力
    movie_links.each {|ml| puts ml["href"] }
  end
end

実行したら、こんな感じのテキストファイルができる。 (実際に取得したデータではありません)

オッス! 漢だらけのふんどし大会!
http://movie.example.com/video_id=92871
http://movie.example.com/video_id=92878
美人すぎる男たちの宴
http://vids.example.com/video832171
http://vids.example.com/video832198
http://vids.example.com/video832211

あとはタイトルを見て適当に必要そうな動画のURLだけ残して ほげほげしている感じ。

コードのコメントなどを真面目に読んだ方なら気付いていると思いますが 対象のサイトは毎日ページを更新しているので このスクリプトを適当に ~/bin/get_urls.rb という位置に保存して crontab で

PATH="/home/mugijiru/bin:/home/mugijiru/.rbenv/shims:/bin:/usr/bin:/usr/local/bin"

5 2 * * * get_urls.rb > $HOME/video_urls/`date +'\%Y\%m\%d'`.urls

とか書いて毎日取得している感じ。 cronの環境変数周りとかdateの書き方とか よくわからんしなんか面倒だよねってこれを書いてて思った。

ま、いい加減だけど巡回の手間が省けてるので良し。幸せになれてる。

posted by 麦汁 at 22:32 | Comment(0) | TrackBack(0) | ruby | このブログの読者になる | 更新情報をチェックする

2012年06月04日

Ruby1.9時代のcode metrics toolは Cane か Tailor かな?

最近久々にRails触ってて、 そろそろプロジェクトが大きくなってきたので じゃあそろそろコードのmetricとか計測しようか、という気分になりました。

そこで、昔懐かし metric_fu などを導入しようとしようとしたら よくよく調べるとそろそろこいつはオワコンっぽい。

こいつが内部で使っているReek,Roodi,Flog,Flayあたりが どうやら ruby_parser を使ってるらしく、 そんでもってこいつがruby1.8しかparseしないということで 上記4つのツールが使えなくなっている。

まあ実はChurnとかrails_best_practicesとかは使えるので 全く無用という程でもないのですが、 僕が使いたかったあたりが使えないのが悲しいので ちょっと昨今のmetric計測ツールを調べてみた。

で、出て来たのが、CaneTailor。 あとは metric_abc というのもあるがこいつは今はメンテされてないようだし 出力も大雑把なので放置。

で、まずはCaneちゃんの説明から。

基本的なインストール方法、使い方はとっても簡単。

毎度おなじみGemfileに

gem "cane"

して

$ bundle install

ら普通に入るし、

$ cane

したら普通に計測できる。

$ cane

Methods exceeded maximum allowed ABC complexity (1):

  app/controllers/items_controller.rb  ItemsController > index  18

Lines violated style requirements (1):

  app/controllers/items_controller.rb:54              Line is >80 characters (86)

Classes are not documented (2):
  app/controllers/items_controller.rb:1        ItemsController
  app/models/item.rb:3                             Item

で、とりあえず "Line is >80 characters (86)" とか 80文字制限なんてだるいわーって僕はここで .cane というファイルを作ってその中に

--style-measure 120

とか書いておく。

こうしておくと、"Line is >120 characters (126)" みたいな感じに 横幅120文字オーバーの行だけ引っ掛けるようになる感じ。

ま、簡単なコードのチェックをやってくれる感じ。

次、Tailorちゃん。

こいつもインストール方法も使い方も同じ感じ。 みんな大好きGemfileに

gem "tailor"

して

$ bundle install

で普通に入る。

動かす時は

$ tailor app/**/*.rb

で動く感じ。(app/**/*.rb なのはRails前提のため)

で、結果はこんな感じになる。

% tailor app/**/*.rb
#------------------------------------------------------------------------------#
# File:
#   app/controllers/items_controller.rb
#
# File Set:
#   default
#
# Problems:
#  1.
#    * position:  54:86
#    * property:  max_line_length
#    * message:   Line is 86 chars long, but should be 80.
#  2.
#    * position:  55:84
#    * property:  max_line_length
#    * message:   Line is 84 chars long, but should be 80.
#  3.
#    * position:  58:84
#    * property:  max_line_length
#    * message:   Line is 84 chars long, but should be 80.
#  4.
#    * position:  68:86
#    * property:  max_line_length
#    * message:   Line is 86 chars long, but should be 80.
#  5.
#    * position:  72:84
#    * property:  max_line_length
#    * message:   Line is 84 chars long, but should be 80.
#
#------------------------------------------------------------------------------#
#------------------------------------------------------------------------------#
#                           Tailor Summary                                     |
#------------------------------------------------------------------------------#
#   File                                                               | Probs |
#------------------------------------------------------------------------------#
# app/controllers/application_controller.rb                            |     0 |
# app/controllers/items_controller.rb                                  |     5 |
# app/helpers/application_helper.rb                                    |     0 |
# app/models/item.rb                                                   |     0 |
#------------------------------------------------------------------------------#
#   Error                                                              |     5 |
#------------------------------------------------------------------------------#
#   TOTAL                                                              |     5 |
#------------------------------------------------------------------------------#

こういうノリになる。 こいつもまた .tailor ってファイルに設定を書けるんだけども、 その前にちょっと待った!

$ tailor --create-config

を叩こう! 設定ファイルの雛形を作ってくれるぞ!

.tailor が出力されたら適当に好きなように編集しよう。 個人的にはやはり style.max_line_length は 120 とでもしてた方が気分がよろしい。 100 でもいいけど。

それから、Tailorの方は自分でもRuleを追加できるぜ! みたいなことを書いているので みんなで有用なRuleを作っていってみんなで幸せになろう。

で、とりあえず自分で調べたらこんな感じなんだけども 上に挙げてみた Churn, rails_best_practices, cane, tailor 以外で何かいいのがあったら教えてください。 特に、重複したコードを検出するようなの欲しいですう。

タグ:ruby Rails Metric
posted by 麦汁 at 00:19 | Comment(0) | TrackBack(0) | ruby | このブログの読者になる | 更新情報をチェックする

2012年01月28日

ncursesw.gem をLionちゃんに放り込んだメモ

最近ようやくMac OS X 10.7(Lion)で Rubyの ncursesw.gem ってgem を入れられたのでそのメモでも残す。

その前にncurseswの説明でも。 (Wikipediaを見た方が正確でわかりやすいとは思うが)

ncursesはTerminalなんかを、ちょっとGUIっぽく使うのに使うライブラリで、 まあ、エディタを作るとかRogue系のゲームを作るとかあと多分topコマンドもどきを作るとか そういう時に役立つようなの。そのUTF-8対応版がncursesw。 といっても最新のncursesを--enable-widecでbuildしたらそれがついてくるってだけなのだが。

で、そのライブラリにアクセスするためのRubyの拡張として ncurses-rubyがあるんだけども、こいつがutf-8のやつに対応してないっぽいので、 そいつをutf8にしたっぽいncurseswを導入した……んだけどそれまでが長かった。

まずLionちゃんに入ってるncursesちゃんが古くてutf-8に対応してない。 そこでそいつからbuild。Homebrewちゃんを使ってね。 ってことで作ったFormulaがこちら。

require 'formula'

class Ncurses < Formula
  url 'http://ftp.gnu.org/pub/gnu/ncurses/ncurses-5.9.tar.gz'
  homepage 'http://www.gnu.org/software/ncurses/'
  md5 '8cb9c412e5f2d96bc6f459aa8c6282a1'

  # depends_on 'cmake'

  def install
    ENV['CFLAGS'] = "-arch i386 -arch x86_64"
    ENV['LDFLAGS'] = "-arch i386 -arch x86_64"
    system "./configure",
            "--enable-widec",
            "--enable-overwrite",
            "--enable-ext-color",
            "--with-shared",
            "--enable-pc-files",
            "--enable-symlink",
            "--prefix=#{prefix}",
            "--mandir=#{man}",
            "--enable-warnings"
    # system "cmake . #{std_cmake_parameters}"
    system "make install"
  end

  def test
    # This test will fail and we won't accept that! It's enough to just
    # replace "false" with the main program this formula installs, but
    # it'd be nice if you were more thorough. Test the test with
    # `brew test ncurses`. Remove this comment before submitting
    # your pull request!
    system "false"
  end
end

こいつでとりあえず最新のncursesをutf-8が有効にしてインスコできる。 ポイントは多分、--enable-widecと--enable-overwrite。 widecは上で説明している通りに、utf-8を有効にするやつ。 overwriteってのはヘッダの配置に関わってくるやつで、 こいつが無効だと {prefix}/include/ncursesw にインストールして 有効だと {prefix/include} にインストールする感じ、だったはず。 prefixとmandirはHomebrewの定番系。他はよく知らんw

ああ、あとは、CFLAGSとかLDFLAGSもか。

ってことでncurseswさん自体を放り込んだから それを使うためのRuby用の拡張を放り込む。

$ sudo gem install ncursesw

これだけであっさり入る。 ここまで持って来るのに自分自身は昨年からちょろちょろやってるのに理不尽だよねっ! とりあえずこれで動きますの。UTF-8も使えますの。にんにん。

posted by 麦汁 at 20:59 | Comment(0) | TrackBack(0) | ruby | このブログの読者になる | 更新情報をチェックする
×

この広告は1年以上新しい記事の投稿がないブログに表示されております。