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