nicoscraper 0.2.6 → 0.2.7

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
data/README.md CHANGED
@@ -1,4 +1,4 @@
1
- 以下は[rubydoc](http://rubydoc.info/gems/nicoscraper/0.2.5/frames)からの転載です。詳細はこちらを御覧下さい。
1
+ 以下は[rubydoc](http://rubydoc.info/gems/nicoscraper/0.2.6/frames)からの転載です。詳細はそちらを御覧下さい。
2
2
 
3
3
 
4
4
  NicoScraper
@@ -9,8 +9,8 @@ NicoScraper
9
9
  **Author:** Masami Yonehara
10
10
  **Copyright:** 2011
11
11
  **License:** MIT License
12
- **Latest Version:** 0.2.5
13
- **Release Date:** Sep 24th 2011
12
+ **Latest Version:** 0.2.7
13
+ **Release Date:** Sep 25th 2011
14
14
 
15
15
 
16
16
  何をするライブラリ?
@@ -24,13 +24,15 @@ NicoScraper
24
24
 
25
25
  $ gem install nicoscraper
26
26
 
27
-  とした後、
27
+  として下さい。もしlibxml2が足りない、extconfにオプションを指定しろ等のエラーが出た場合には、libxmlが入っていないかパスが通っていません。
28
28
 
29
- require 'nicoscraper'
29
+ yum install -y libxml2 libxml2-devel
30
+
31
+  などとして、libxmlを入れ直してから再度gemを実行して下さい。成功すれば、
30
32
 
31
-  で使い始めて下さい。内部的にlibxml-rubyを使っており、インストール時に最新版に更新される可能性があります。
33
+ require 'nicoscraper'
32
34
 
33
-  なお、実行前に[注意点、および免責事項](#___________)をお読み下さい。
35
+  で使うことができます。なお、実行前に[注意点、および免責事項](#___________)をお読み下さい。
34
36
 
35
37
 
36
38
  基本的な使い方
@@ -81,8 +83,8 @@ NicoScraper
81
83
 
82
84
  require 'nicoscraper'
83
85
 
84
- mylist = Nicos::Mylist::new("")
85
- mylist.getInfoLt
86
+ mylist = Nicos::Mylist::new("15196568")
87
+ mylist.getInfo
86
88
 
87
89
  p mylist
88
90
 
@@ -113,30 +115,39 @@ NicoScraper
113
115
   タグやマイリスト検索結果からの情報取得には、Searcherモジュールを使います。情報のソート方法の指定、取得する範囲の制限が可能です。
114
116
 
115
117
  require 'nicoscraper'
118
+ require 'date'
116
119
 
117
120
  t = Time.now
118
- ytd = Date::new(t.year, t.month, t.day) - 1
119
- yesterday = Time.local(ytd.year, ytd.month, ytd.day, 0, 0, 0).to_i
120
-
121
- searcher = Nicos::Searcher::ByTag.new()
122
-
123
- searcher.execute('ゆっくり実況プレイpart1リンク', 'post_new', nil) {
124
- |result, page|
125
-
126
- result.each { |movieObj|
127
- puts movieObj.title +
128
- " is posted at " +
129
- Time.at(movieObj.first_retrieve).to_s
130
-
131
- "continue" if movieObj.first_retrieve >= yesterday
132
- }
121
+ tda = Date::new(t.year, t.month, t.day) - 3
122
+ threeDaysAgo = Time.local(ytd.year, ytd.month, ytd.day, 0, 0, 0).to_i
123
+
124
+ searchByTag = Nicos::Searcher::ByTag.new()
125
+ searchByTag.execute(
126
+ 'VOCALOID',
127
+ 'post_new'
128
+ ) { |result, page|
129
+ terminate = false
130
+
131
+ result.each { |movie|
132
+ terminate = ( movie.first_retrieve <= threeDaysAgo )
133
+
134
+ puts movie.title +
135
+ " is posted at " +
136
+ Time.at(movie.first_retrieve).to_s
137
+ }
138
+
139
+ if terminate
140
+ puts "loop terminated."
141
+ else
142
+ "continue"
143
+ end
133
144
  }
134
145
 
135
-  この例では、`ゆっくり実況プレイpart1リンク`というタグの付く動画を、`post_new`=投稿日時が新しい順からさかのぼって取得し、取得した動画の日付が前日の0時0分を超えるまでそれを続けます。
146
+  この例では、`VOCALOID`というタグの付く動画を、`post_new`=投稿日時が新しい順からさかのぼって取得し、取得した動画の日付が3日前の0時0分を超えるまでそれを続けます。
136
147
 
137
148
   ブロック内の第1引数には取得結果に基づく動画インスタンスが与えられるのですが、これは32個分の配列です。なぜ32個のセットなのかと言うと、ご存知のようにニコニコ動画の検索画面はページで区切られており、Searcherモジュールの各メソッドはページ毎に情報を取得し、ページ単位でブロックをコールするからです。HTMLから取得するにしろAtomフィードから取得するにしろ、1ページに32個の動画情報が含まれています。そして、第2引数には現在のページ数が与えられます。
138
149
 
139
-  そして、**ブロック内で`continue`の文字列を返すことによりスクレイプが継続します。**つまり、`continue`文字列を返し続けるロジックを組み込まないと、1ページ目を読んだ時点で処理が終了します。これは意図せざる過剰アクセスを防ぐための措置です。
150
+  そして、**ブロック内で`"continue"`の文字列を返すことによりスクレイプが継続します。**つまり、`"continue"`文字列を返し続けるロジックを組み込まないと、1ページ目を読んだ時点で処理が終了します。これは意図せざる過剰アクセスを防ぐための措置です。
140
151
 
141
152
   上の例では、取得した動画の日付を調べ、3日前の0時0分より前の動画に到達すればそこでループを終える設計です。ループを継続するために取得情報を使うかどうかは任意なので、例えば10分間の制限で取得出来るだけ取得するということも可能でしょう。
142
153
 
@@ -174,7 +185,7 @@ NicoScraper
174
185
 
175
186
   Searcherメソッドは継続的なアクセスを行い、またそれ以外のメソッドも実際の運用目的上ある程度の連続使用が前提になると思います。このライブラリは並列的なリクエストを行いませんが、それでも過剰なアクセスに伴うサーバからの拒絶や、あるいはそれ以上に、アカウントの停止もしくは法的責任を追求されるなどの事があり得ないという保証はできません。
176
187
 
177
-  それを防ぐための措置の一つが、`continue`を明示的に返さないとスクレイピングが継続しない仕様ですが、もう一つ、アクセス中のウェイトを任意に設定できるようにしています。具体的には、連続リクエストの上限回数、連続リクエスト後のウェイト、1リクエスト毎のウェイト、連続アクセス拒絶時やサーバ混雑時の再試行までのウェイトなどです。ウェイトの設定は、以下のように`Nicos::Connector::Config::waitConfig`に与えられています。以下はデフォルトの設定です。
188
+  それを防ぐための措置の一つが、`"continue"`を明示的に返さないとスクレイピングが継続しない仕様ですが、もう一つ、アクセス中のウェイトを任意に設定できるようにしています。具体的には、連続リクエストの上限回数、連続リクエスト後のウェイト、1リクエスト毎のウェイト、連続アクセス拒絶時やサーバ混雑時の再試行までのウェイトなどです。ウェイトの設定は、以下のように`Nicos::Connector::Config::waitConfig`に与えられています。以下はデフォルトの設定です。
178
189
 
179
190
  Nicos::Connector::Config::waitConfig = {
180
191
 
@@ -208,7 +219,7 @@ NicoScraper
208
219
  }
209
220
 
210
221
  ###連続リクエストとは?
211
-  
222
+
212
223
   Searcherメソッドはある一定回数のHTTPリクエストを1つの単位とし、その単位のリクエストが終わるごとに休憩を入れます。この1単位を連続リクエストと言います。上の例では、10のリクエストを1単位とし(`seqAccLimit`)、その連続リクエストが終わった後に10秒の休憩を入れる(`afterSeq`)設定になっています。
213
224
 
214
225
   なお、連続リクエスト毎に限らず、1リクエスト毎のウェイトも併せて設定できます。上の例では、1リクエスト毎に1秒のウェイトを入れる設定です(`each`)。
@@ -298,6 +309,12 @@ Mylistクラスのインスタンス
298
309
 
299
310
  ###更新履歴
300
311
 
312
+ **v 0.2.7**
313
+
314
+ + ドキュメントのSearcherモジュールの例の誤り、その他細かい点を訂正。
315
+
316
+ + MylistのAtomフィードから、投稿日の取得が漏れていた点を修正。
317
+
301
318
  **v 0.2.6**
302
319
 
303
320
  + ドキュメントが正しく生成されていなかったので訂正。
@@ -306,11 +323,11 @@ Mylistクラスのインスタンス
306
323
 
307
324
  + ヘッダの追加
308
325
 
309
- + コードと設定の分離
326
+ + コードと設定の分離。
310
327
 
311
328
  **v 0.2.4**
312
329
 
313
- + ドキュメント作成
330
+ + ドキュメントの作成。
314
331
 
315
332
  + Searcherループのバグ修正。
316
333
 
@@ -323,7 +340,7 @@ Mylistクラスのインスタンス
323
340
 
324
341
  + HTMLから取得・解析するメソッドの追加。
325
342
 
326
- + キーワード検索の実装
343
+ + キーワード検索の実装。
327
344
 
328
345
  **v 0.4-**
329
346
 
@@ -339,4 +356,4 @@ Mylistクラスのインスタンス
339
356
 
340
357
  + http://twitter.com/h_demon
341
358
 
342
- GitHubを経由して下さってもいいのですが、まだ慣れていないので対応が送れるかもしれません。
359
+ GitHubを経由して下さってもいいのですが、まだ慣れていないので対応が遅れるかもしれません。
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.2.6
1
+ 0.2.7
@@ -111,7 +111,11 @@ module Nicos
111
111
  lengthStr = doc.value.split(/\:/)
112
112
  length = lengthStr[0].to_i * 60 + lengthStr[1].to_i
113
113
  parsed[n]["length"] = length
114
- when "nico-numbers-view", "nico-numbers-res",
114
+ when "nico-info-date"
115
+ label = doc.name
116
+ doc.read
117
+ parsed[n]["first_retrieve"] = Nicos::Converter.japToUnix(doc.value)
118
+ when "nico-numbers-view", "nico-numbers-res",
115
119
  "nico-numbers-mylist"
116
120
  label = doc.value
117
121
  doc.read
@@ -11,6 +11,7 @@ require 'parser.rb'
11
11
 
12
12
  module Nicos
13
13
  module Searcher
14
+ # @private
14
15
  class ByTagSuper < Nicos::Connector::Config
15
16
  private
16
17
 
@@ -163,10 +164,47 @@ module Nicos
163
164
 
164
165
  public
165
166
 
166
- # 実行
167
+ # タグ検索を実行し、ブロックに結果を渡します。
167
168
  #
168
169
  # @param [String] tag 検索したいタグ文字列
169
170
  # @param [String] sortMethod ソート方法
171
+ #==基本的な使い方
172
+ # require 'nicoscraper'
173
+ #
174
+ # searcher = Nicos::Searcher::ByTag.new()
175
+ # searcher.execute('VOCALOID', 'view_many') {
176
+ # |result, page|
177
+ #
178
+ # result.each { |movieObj|
179
+ # puts movieObj.title
180
+ # }
181
+ # }
182
+ #
183
+ # result ----
184
+ #
185
+ # 【初音ミク】みくみくにしてあげる♪【してやんよ】
186
+ # 初音ミク が オリジナル曲を歌ってくれたよ「メルト」
187
+ # 初音ミク が オリジナル曲を歌ってくれたよ「ワールドイズマイン」
188
+ # 初音ミクオリジナル曲 「初音ミクの消失(LONG VERSION)」
189
+ # 【巡音ルカ】ダブルラリアット【オリジナル】
190
+ # 「卑怯戦隊うろたんだー」をKAITO,MEIKO,初音ミクにry【オリジナル】修正版
191
+ # 【オリジナル曲PV】マトリョシカ【初音ミク・GUMI】
192
+ # 初音ミクがオリジナルを歌ってくれたよ「ブラック★ロックシューター」
193
+ # ...
194
+ #
195
+ # Nicos::Searcher::ByTagのインスタンスを作り、executeメソッドに引数を与えて実行します。
196
+ # 結果がブロックの第1仮引数に渡されます。
197
+ # 渡される結果はMovieクラスのインスタンスを含む配列です。
198
+ #
199
+ #==スクレイプの継続について
200
+ #
201
+ # ニコニコ動画の検索結果は、指定した数を一度に取得できる訳ではありません。
202
+ # なぜなら、現状では検索結果はHTML1ページ、もしくは1つのRSS/Atomフィードに32個を限度に渡される方式であり、
203
+ # ByTagクラスがその結果を利用する以上、32個=1単位という制約のもとに置かれるからです。
204
+ # 従って、例えば最新の投稿100個の情報が欲しいとしても、1回のリクエストでは手に入らず
205
+ # かならず数回に分けてリクエストすることになります。
206
+ #
207
+ # 加えて、リクエストを継続するかどうかの判定も1ページ/1フィード毎に行います。
170
208
  #==sortMethod: ソート方法
171
209
  # *comment_new*
172
210
  # コメントが新しい順
@@ -5,11 +5,11 @@
5
5
 
6
6
  Gem::Specification.new do |s|
7
7
  s.name = %q{nicoscraper}
8
- s.version = "0.2.6"
8
+ s.version = "0.2.7"
9
9
 
10
10
  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
11
  s.authors = [%q{Masami Yonehara}]
12
- s.date = %q{2011-09-25}
12
+ s.date = %q{2011-09-28}
13
13
  s.description = %q{It scrape movies and mylists of Niconico douga.
14
14
  }
15
15
  s.email = %q{zeitdiebe@gmail.com}
@@ -1,7 +1,7 @@
1
1
  # -*- encoding: utf-8 -*-
2
- $:.unshift File.dirname(__FILE__) + "/../lib"
2
+ # $:.unshift File.dirname(__FILE__) + "/../lib"
3
3
 
4
- require 'nicoscraper'
4
+ require '../lib/nicoscraper.rb'
5
5
 
6
6
  describe "When execute 'Nicos::Searcher::ByTag.execute' method " +
7
7
  "and return a string except \"continue\" in this block" do
metadata CHANGED
@@ -2,7 +2,7 @@
2
2
  name: nicoscraper
3
3
  version: !ruby/object:Gem::Version
4
4
  prerelease:
5
- version: 0.2.6
5
+ version: 0.2.7
6
6
  platform: ruby
7
7
  authors:
8
8
  - Masami Yonehara
@@ -10,7 +10,7 @@ autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
12
 
13
- date: 2011-09-25 00:00:00 Z
13
+ date: 2011-09-28 00:00:00 Z
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
16
16
  name: damerau-levenshtein
@@ -133,7 +133,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
133
133
  requirements:
134
134
  - - ">="
135
135
  - !ruby/object:Gem::Version
136
- hash: -219128366920593554
136
+ hash: 945076813135277661
137
137
  segments:
138
138
  - 0
139
139
  version: "0"