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 +49 -32
- data/VERSION +1 -1
- data/lib/classes/parser.rb +5 -1
- data/lib/classes/searcher.rb +39 -1
- data/nicoscraper.gemspec +2 -2
- data/test/searcher_spec.rb +2 -2
- metadata +3 -3
data/README.md
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
以下は[rubydoc](http://rubydoc.info/gems/nicoscraper/0.2.
|
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.
|
13
|
-
**Release Date:** Sep
|
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
|
-
|
29
|
+
yum install -y libxml2 libxml2-devel
|
30
|
+
|
31
|
+
などとして、libxmlを入れ直してから再度gemを実行して下さい。成功すれば、
|
30
32
|
|
31
|
-
|
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.
|
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
|
-
|
119
|
-
|
120
|
-
|
121
|
-
|
122
|
-
|
123
|
-
|
124
|
-
|
125
|
-
|
126
|
-
|
127
|
-
|
128
|
-
|
129
|
-
|
130
|
-
|
131
|
-
|
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
|
-
|
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.
|
1
|
+
0.2.7
|
data/lib/classes/parser.rb
CHANGED
@@ -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-
|
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
|
data/lib/classes/searcher.rb
CHANGED
@@ -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
|
# コメントが新しい順
|
data/nicoscraper.gemspec
CHANGED
@@ -5,11 +5,11 @@
|
|
5
5
|
|
6
6
|
Gem::Specification.new do |s|
|
7
7
|
s.name = %q{nicoscraper}
|
8
|
-
s.version = "0.2.
|
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-
|
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}
|
data/test/searcher_spec.rb
CHANGED
@@ -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.
|
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-
|
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:
|
136
|
+
hash: 945076813135277661
|
137
137
|
segments:
|
138
138
|
- 0
|
139
139
|
version: "0"
|