class Nicos::Searcher::ByTag

Attributes

waitConfig[RW]

Public Class Methods

new() click to toggle source
# File lib/classes/searcher.rb, line 150
def initialize
  @numOfSearched = 32
  @incrAmt = 0.2
  @connector = Nicos::Connector::TagAtom.new()
  @waitConfig = @@waitConfig
end

Public Instance Methods

execute(tag, sortMethod, &block) click to toggle source
タグ検索を実行し、ブロックに結果を渡します。

@param [String] tag 検索したいタグ文字列
@param [Symbol] sortMethod ソート方法

基本的な使い方

require 'nicoscraper'

count = 0

searcher = Nicos::Searcher::ByTag.new()
searcher.execute('VOCALOID', :view_many) {
  |result, status|

  count += 1

  result.each { |movieObj|
    puts movieObj.title 
  }  

  :continue unless count >= 3
}

result ----

【初音ミク】みくみくにしてあげる♪【してやんよ】
初音ミク が オリジナル曲を歌ってくれたよ「メルト」
初音ミク が オリジナル曲を歌ってくれたよ「ワールドイズマイン」
初音ミクオリジナル曲 「初音ミクの消失(LONG VERSION)」
【巡音ルカ】ダブルラリアット【オリジナル】
「卑怯戦隊うろたんだー」をKAITO,MEIKO,初音ミクにry【オリジナル】修正版
【オリジナル曲PV】マトリョシカ【初音ミク・GUMI】
初音ミクがオリジナルを歌ってくれたよ「ブラック★ロックシューター」
...

  Nicos::Searcher::ByTagのインスタンスを作り、executeメソッドに引数を与えて実行します。

結果がブロックの第1仮引数に渡されます。渡される結果はMovieクラスのインスタンスを含む配列ですが、
MovieクラスのgetInfo、getHtmlInfoメソッドと全く同じではありません。これは、検索ページ/RSSから
動画情報を取得しており、先の2メソッドとは異なる取得元だからです。

スクレイプの継続について

  スクレイプは、ブロック内で明示的に ‘:continue’ あるいは ‘“continue”’ を返さない限り、1リクエストで

終了します。これは、意図せざる過剰アクセスを防ぐための措置です。上の例では、3回アクセスすると終了します。
帰ってきた動画インスタンスの情報を利用することで、一定の投稿日までさかのぼって取得するなどの処理も可能です
(トップの例を参照)。

 また、ニコニコ動画の検索結果は、指定した数を一度に取得できる訳ではありません。
なぜなら、現状では検索結果はHTML1ページ、もしくは1つのRSS/Atomフィードに32個を限度に渡される方式であり、
ByTagクラスがその結果を利用する以上、32個=1単位という制約のもとに置かれるからです。
従って、例えば最新の投稿100個の情報が欲しいとしても、1回のリクエストでは手に入らず、
かならず数回に分けてリクエストすることになります。

 加えて、リクエストを継続するかどうかの判定も1ページ/1フィード毎に行います。

sortMethod: ソート方法

 以下のシンボルを指定して下さい。

*:comment_new*  
コメントが新しい順

*:comment_old*  
コメントが新しい順

*:view_many*  
再生数が多い順

*:view_few*  
再生数が少ない順

*:comment_many*  
コメントが多い順

*:comment_few*  
コメントが少ない順

*:mylist_many*  
マイリスト登録が多い順

*:mylist_few*  
マイリスト登録が少ない順

*:post_new*  
登録が新しい順

*:post_old*  
登録が少ない順

*:length_long*  
再生時間が長い順

*:length_short*  
再生時間が短い順

@param [HashObj] waitConfig ウェイト設定

waitConfig: ウェイト設定

<b>ウェイトの変更に際しては、READMEの注意点と免責事項を事前にお読み下さい。</b>

以下のフォーマットのハッシュオブジェクトを与えて下さい。これはデフォルト設定です。
また、ハッシュは以下のキーを全て用意する必要はありません。
変更したい部分のキーと値のみを持つハッシュオブジェクトを作って下さい。

 @waitConfig = {
   :seqAccLimit => 10,  # 連続してリクエストする回数
   :afterSeq    => 10,  # 連続リクエスト後のウェイト(以下、単位は全て秒)
   :each        => 1,   # 連続リクエスト時の、1リクエスト毎のウェイト
   :increment   => 1,   # アクセス拒絶時の、次回以降の1リクエスト毎のウェイトの増加量

   :deniedSeqReq=> {     # 連続アクセスを拒否された際の設定(以下同じ)
     :retryLimit  => 3,  # 再試行の上限回数
     :wait        => 120 # 次のアクセスまでのウェイト
   },

   :serverIsBusy=> {     # サーバ混雑時
     :retryLimit  => 3,
     :wait        => 120
   },

   :serviceUnavailable => { # 503が返ってきた時
     :retryLimit  => 3,
     :wait        => 120
   },

   :timedOut => {        # タイムアウト時
     :retryLimit  => 3,
     :wait        => 10
   }
 }

ブロック内の第2引数について

第2引数には、それまでの検索の成否、例外の発生回数などを記録した
ハッシュが渡されます。これは以下のような構造になっています。

 {
   # 各種例外等が発生した動画・マイリストのIDを配列で保管。
   :notPublic => [],
   :limInCommunity => [],
   :notFound => [],
   :deleted => [],

   # 再試行で対処できる例外等が発生した件数。
   :deniedSeqReq => 0,
   :serverIsBusy => 0,
   :serviceUnavailable => 0,
   :timedOut => 0,

   # 成功回数
   :succeededNum => 0
 }

*allDisabled*  
 マイリストの場合のみ機能。そのマイリスト内の動画が全て非公開、
あるいは削除済み等で存在しないが、マイリストは残っている場合。

*notPublic*  
 動画、マイリストが非公開である場合。

*limInCommunity*  
 動画、マイリストがコミュニティ限定公開である場合。

*notFound*  
 動画、マイリストが存在しない場合。マイリストは削除済みの場合もnotFoundとなる。

*deleted*  
 その動画が削除済みである場合。マイリストについては、上のnotFoundと
区別されない。 

*deniedSeqReq*  
 連続アクセスとして明示的に拒否された場合。 

*serverIsBusy*  
 「大変ご迷惑をおかけいたしますが、しばらく時間をあけてから
再度検索いただくようご協力をお願いいたします。」と表示される場合。

*serviceUnavailable*  
 503が返ってきた時。

*timedOut*  
 タイムアウト

*succeededNum*  
 成功回数

# File lib/classes/searcher.rb, line 348
def execute(tag, sortMethod, &block)
  loop(tag, sortMethod, :atom) { |result, page|
    block.call(result, page)
  }
end

Private Instance Methods

parse(xml) click to toggle source
# File lib/classes/searcher.rb, line 160
def parse(xml)
  Nicos::Parser::Xml.tagAtom(xml)
end