Class: Nicos::Searcher::ByTag

Inherits:
ByTagSuper show all
Defined in:
lib/classes/searcher.rb

Instance Attribute Summary collapse

Instance Method Summary collapse

Methods included from Connector::SetWait

#setWait

Methods inherited from Connector::Config

setWait, setWaitDefault

Constructor Details

#initializeByTag

Returns a new instance of ByTag.



151
152
153
154
155
156
# File 'lib/classes/searcher.rb', line 151

def initialize
  @numOfSearched = 32
  @incrAmt = 0.2
  @connector = Nicos::Connector::TagAtom.new()
  @waitConfig = @@waitConfig
end

Instance Attribute Details

#waitConfigObject

Returns the value of attribute waitConfig.



157
158
159
# File 'lib/classes/searcher.rb', line 157

def waitConfig
  @waitConfig
end

Instance Method Details

#execute(tag, sortMethod, &block) ⇒ Object

タグ検索を実行し、ブロックに結果を渡します。

==基本的な使い方 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
再生時間が短い順

==waitConfig: ウェイト設定 ウェイトの変更に際しては、READMEの注意点と免責事項を事前にお読み下さい。

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

@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  成功回数

Parameters:

  • tag (String)

    検索したいタグ文字列

  • sortMethod (Symbol)

    ソート方法

  • waitConfig (HashObj)

    ウェイト設定



349
350
351
352
353
# File 'lib/classes/searcher.rb', line 349

def execute(tag, sortMethod, &block)
  loop(tag, sortMethod, :atom) { |result, page|
    block.call(result, page)
  }
end