nicoscraper 0.2.9 → 0.2.10
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 +47 -41
- data/VERSION +1 -1
- data/lib/classes/connector.rb +177 -47
- data/lib/classes/movie.rb +84 -123
- data/lib/classes/mylist.rb +128 -136
- data/lib/classes/parser.rb +165 -91
- data/lib/classes/searcher.rb +138 -80
- data/lib/config/wait.rb +17 -17
- data/nicoscraper.gemspec +2 -2
- data/test/movie_spec.rb +18 -40
- data/test/mylist_spec.rb +98 -14
- data/test/searcher_spec.rb +96 -75
- metadata +3 -3
data/lib/classes/parser.rb
CHANGED
@@ -9,6 +9,94 @@ require 'converter.rb'
|
|
9
9
|
|
10
10
|
module Nicos
|
11
11
|
module Parser
|
12
|
+
def parseRow(symbol, type, doc)
|
13
|
+
hash = {}
|
14
|
+
|
15
|
+
value = case type
|
16
|
+
when :Fixnum then
|
17
|
+
doc.read
|
18
|
+
doc.value.to_i
|
19
|
+
when :String then
|
20
|
+
doc.read
|
21
|
+
p doc.value
|
22
|
+
doc.value
|
23
|
+
when :ISO8601 then
|
24
|
+
doc.read
|
25
|
+
Nicos::Converter.iso8601ToUnix(doc.value)
|
26
|
+
when :JapDate then
|
27
|
+
doc.read
|
28
|
+
Nicos::Converter.japToUnix(doc.value)
|
29
|
+
when :Time then
|
30
|
+
doc.read
|
31
|
+
Nicos::Converter.toSeconds(doc.value)
|
32
|
+
|
33
|
+
# for Mylist Atom
|
34
|
+
when :mylistId then
|
35
|
+
doc.read
|
36
|
+
Nicos::Extractor.mylistId(doc.value)
|
37
|
+
when :videoId then
|
38
|
+
doc.move_to_attribute("href")
|
39
|
+
Nicos::Extractor.videoId(doc.value)
|
40
|
+
|
41
|
+
# for getThumbInfo
|
42
|
+
when :Tags then
|
43
|
+
doc.move_to_attribute("domain")
|
44
|
+
symbol = case doc.value
|
45
|
+
when "jp" then :tags_jp
|
46
|
+
when "tw" then :tags_tw
|
47
|
+
when "de" then :tags_de
|
48
|
+
when "es" then :tags_es
|
49
|
+
end
|
50
|
+
|
51
|
+
tags = []
|
52
|
+
lockedTags = []
|
53
|
+
category = nil
|
54
|
+
lock = nil
|
55
|
+
|
56
|
+
while doc.read
|
57
|
+
unless doc.node_type == XML::Reader::TYPE_END_ENTITY
|
58
|
+
break if doc.name === "tags"
|
59
|
+
|
60
|
+
if category == nil
|
61
|
+
doc.move_to_attribute("category")
|
62
|
+
if doc.name === "category"
|
63
|
+
doc.read
|
64
|
+
category = doc.value
|
65
|
+
doc.read
|
66
|
+
end
|
67
|
+
end
|
68
|
+
|
69
|
+
doc.move_to_attribute("lock")
|
70
|
+
if doc.name === "lock"
|
71
|
+
lock = true
|
72
|
+
doc.read
|
73
|
+
doc.read
|
74
|
+
else lock = false
|
75
|
+
end
|
76
|
+
|
77
|
+
doc.read_inner_xml
|
78
|
+
if doc.value != nil
|
79
|
+
if lock then lockedTags.push(doc.value)
|
80
|
+
else tags.push(doc.value) end
|
81
|
+
end
|
82
|
+
end
|
83
|
+
end
|
84
|
+
|
85
|
+
{
|
86
|
+
:category => category,
|
87
|
+
:tags => tags,
|
88
|
+
:lockedTags => lockedTags
|
89
|
+
}
|
90
|
+
end
|
91
|
+
|
92
|
+
hash[symbol] = value
|
93
|
+
hash
|
94
|
+
end
|
95
|
+
module_function :parseRow
|
96
|
+
|
97
|
+
def parseTag
|
98
|
+
end
|
99
|
+
|
12
100
|
# getThumbInfoが返すXMLを解析し、ハッシュオブジェクトにして返します。
|
13
101
|
#
|
14
102
|
# @return [HashObj]
|
@@ -21,39 +109,34 @@ module Nicos
|
|
21
109
|
|
22
110
|
n = -1
|
23
111
|
parsed = {}
|
24
|
-
category = ""
|
25
112
|
|
26
113
|
while doc.read
|
27
114
|
unless doc.node_type == XML::Reader::TYPE_END_ELEMENT
|
28
|
-
case doc.name
|
29
|
-
when "video_id"
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
when "
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
when "
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
when "
|
45
|
-
|
46
|
-
|
47
|
-
when "
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
when "tag"
|
54
|
-
doc.read
|
55
|
-
parsed["tags_" + category].push(doc.value)
|
56
|
-
end
|
115
|
+
row = case doc.name
|
116
|
+
when "video_id" then parseRow(:video_id, :String, doc)
|
117
|
+
when "title" then parseRow(:title, :String, doc)
|
118
|
+
when "description" then parseRow(:description, :String, doc)
|
119
|
+
when "thumbnail_url" then parseRow(:thumbnail_url, :String, doc)
|
120
|
+
when "movie_type" then parseRow(:movie_type, :String, doc)
|
121
|
+
when "last_res_body" then parseRow(:last_res_body, :String, doc)
|
122
|
+
when "watch_url" then parseRow(:watch_url, :String, doc)
|
123
|
+
when "thumb_type" then parseRow(:thumb_type, :String, doc)
|
124
|
+
|
125
|
+
when "size_high" then parseRow(:size_high, :Fixnum, doc)
|
126
|
+
when "size_low" then parseRow(:size_low, :Fixnum, doc)
|
127
|
+
when "view_counter" then parseRow(:view_counter, :Fixnum, doc)
|
128
|
+
when "comment_num" then parseRow(:comment_num, :Fixnum, doc)
|
129
|
+
when "mylist_counter" then parseRow(:mylist_counter,:Fixnum, doc)
|
130
|
+
when "embeddable" then parseRow(:embeddable, :Fixnum, doc)
|
131
|
+
when "no_live_play" then parseRow(:no_live_play, :Fixnum, doc)
|
132
|
+
when "user_id" then parseRow(:user_id, :Fixnum, doc)
|
133
|
+
when "first_retrieve" then parseRow(:first_retrieve,:ISO8601, doc)
|
134
|
+
when "length" then parseRow(:length, :Time, doc)
|
135
|
+
when "tags" then parseRow(:tags, :Tags, doc)
|
136
|
+
when "tag" then parseRow(:tag, :Tag, doc)
|
137
|
+
end
|
138
|
+
|
139
|
+
parsed.update(row) if row != nil
|
57
140
|
end
|
58
141
|
end
|
59
142
|
|
@@ -82,10 +165,10 @@ module Nicos
|
|
82
165
|
parsed[n] = {}
|
83
166
|
when "title"
|
84
167
|
doc.read
|
85
|
-
parsed[n][
|
168
|
+
parsed[n][:title] = doc.value
|
86
169
|
when "link"
|
87
170
|
doc.move_to_attribute("href")
|
88
|
-
parsed[n][
|
171
|
+
parsed[n][:video_id] = doc.value.split('/')[4]
|
89
172
|
when "published", "updated"
|
90
173
|
label = doc.name
|
91
174
|
doc.read
|
@@ -96,21 +179,21 @@ module Nicos
|
|
96
179
|
when "nico-thumbnail"
|
97
180
|
doc.read
|
98
181
|
doc.move_to_attribute("src")
|
99
|
-
parsed[n][
|
182
|
+
parsed[n][:thumbnail_url] = doc.value
|
100
183
|
when "nico-description"
|
101
184
|
doc.read
|
102
|
-
parsed[n][
|
185
|
+
parsed[n][:description] = doc.value
|
103
186
|
end
|
104
187
|
when "strong"
|
105
188
|
doc.move_to_attribute("class")
|
106
189
|
case doc.value
|
107
190
|
when "nico-info-length"
|
108
191
|
doc.read
|
109
|
-
parsed[n][
|
192
|
+
parsed[n][:length] = Nicos::Converter.toSeconds(doc.value)
|
110
193
|
when "nico-info-date"
|
111
194
|
label = doc.name
|
112
195
|
doc.read
|
113
|
-
parsed[n][
|
196
|
+
parsed[n][:first_retrieve] = Nicos::Converter.japToUnix(doc.value)
|
114
197
|
when "nico-numbers-view", "nico-numbers-res",
|
115
198
|
"nico-numbers-mylist"
|
116
199
|
label = doc.value
|
@@ -135,55 +218,42 @@ module Nicos
|
|
135
218
|
XML::Parser::Options::NOENT
|
136
219
|
)
|
137
220
|
|
138
|
-
n =
|
139
|
-
parsed = {
|
221
|
+
n = 0
|
222
|
+
parsed = { :mylist => {}, :entry => [{}] }
|
223
|
+
|
140
224
|
while doc.read
|
225
|
+
break if doc.name === "entry"
|
226
|
+
|
141
227
|
unless doc.node_type == XML::Reader::TYPE_END_ELEMENT
|
142
|
-
case doc.name
|
143
|
-
|
228
|
+
row = case doc.name
|
229
|
+
when "title" then
|
230
|
+
/(マイリスト )(.+)(‐ニコニコ動画)/ =~ parseRow(:title, :String, doc)[:title]
|
231
|
+
{ :title => $2 }
|
232
|
+
when "id" then parseRow(:mylist_id, :mylistId,doc)
|
233
|
+
when "subtitle" then parseRow(:description, :String, doc)
|
234
|
+
when "updated" then parseRow(:updated, :ISO8601, doc)
|
235
|
+
when "name" then parseRow(:author, :String, doc)
|
236
|
+
end
|
237
|
+
|
238
|
+
parsed[:mylist].update(row) if row != nil
|
239
|
+
end
|
240
|
+
end
|
241
|
+
|
242
|
+
while doc.read
|
243
|
+
unless doc.node_type == XML::Reader::TYPE_END_ELEMENT
|
244
|
+
# bump up the page number
|
245
|
+
if doc.name === "entry"
|
246
|
+
n += 1
|
247
|
+
parsed[:entry][n] = {}
|
248
|
+
end
|
249
|
+
|
250
|
+
row = case doc.name
|
144
251
|
# <title> and <id> are marked up both in mylist and
|
145
252
|
# each entry's node. So we need to assign the value to the
|
146
253
|
# appropriate variable in accordance with node's location.
|
147
|
-
when "title"
|
148
|
-
|
149
|
-
|
150
|
-
d = doc.value
|
151
|
-
tmp = doc.value.slice(6, 99)
|
152
|
-
tmp = tmp.slice(0, tmp.length - 7)
|
153
|
-
parsed["mylist"]["title"] = tmp
|
154
|
-
else
|
155
|
-
doc.read
|
156
|
-
parsed["entry"][n]["title"] = doc.value
|
157
|
-
end
|
158
|
-
when "link"
|
159
|
-
if n != -1
|
160
|
-
doc.move_to_attribute("href")
|
161
|
-
parsed["entry"][n]["video_id"] =
|
162
|
-
Nicos::Extractor.videoId(doc.value)
|
163
|
-
end
|
164
|
-
when "subtitle"
|
165
|
-
doc.read
|
166
|
-
parsed["mylist"]["description"] = doc.value
|
167
|
-
when "id"
|
168
|
-
if n == -1
|
169
|
-
doc.read
|
170
|
-
parsed["mylist"]["mylist_id"] =
|
171
|
-
Nicos::Extractor.mylistId(doc.value)
|
172
|
-
else
|
173
|
-
doc.read
|
174
|
-
parsed["entry"][n]["item_id"] =
|
175
|
-
Nicos::Extractor.itemId(doc.value)
|
176
|
-
end
|
177
|
-
when "updated"
|
178
|
-
doc.read
|
179
|
-
parsed["mylist"]["updated"] =
|
180
|
-
Nicos::Converter.iso8601ToUnix(doc.value)
|
181
|
-
when "name"
|
182
|
-
doc.read
|
183
|
-
parsed["mylist"]["author"] = doc.value
|
184
|
-
when "entry"
|
185
|
-
n += 1
|
186
|
-
parsed["entry"][n] = {}
|
254
|
+
when "title" then parseRow(:title, :String, doc)
|
255
|
+
when "link" then parseRow(:video_id, :videoId, doc)
|
256
|
+
when "id" then parseRow(:item_id, :itemId, doc)
|
187
257
|
when "content"
|
188
258
|
doc.read
|
189
259
|
html = doc.value
|
@@ -194,7 +264,7 @@ module Nicos
|
|
194
264
|
/(<p\sclass=\"nico-thumbnail\">.+src=\")(http:\/\/[^\"]{1,})/ =~ html
|
195
265
|
thumbnail_url = $2
|
196
266
|
|
197
|
-
/(<p\sclass
|
267
|
+
/(<p\sclass=\"nico-description\"\>)([^\<]{1,})/ =~ html
|
198
268
|
description = $2
|
199
269
|
|
200
270
|
/(<strong\sclass\=\"nico-info-length\"\>)([^\<]{1,})/ =~ html
|
@@ -212,18 +282,22 @@ module Nicos
|
|
212
282
|
/(<strong\sclass\=\"nico-numbers-mylist\"\>)([^\<]{1,})/ =~ html
|
213
283
|
mylist = Nicos::Converter.commaRemover($2)
|
214
284
|
|
215
|
-
|
216
|
-
|
217
|
-
|
218
|
-
|
219
|
-
|
220
|
-
|
221
|
-
|
222
|
-
|
223
|
-
|
285
|
+
{
|
286
|
+
:memo => memo,
|
287
|
+
:thumbnail_url => thumbnail_url,
|
288
|
+
:description => description,
|
289
|
+
:length => length,
|
290
|
+
:first_retrieve => first_retrieve,
|
291
|
+
:view => view,
|
292
|
+
:res => res,
|
293
|
+
:mylist => mylist
|
294
|
+
}
|
295
|
+
end
|
296
|
+
|
297
|
+
parsed[:entry][n].update(row) if row != nil
|
224
298
|
end
|
225
299
|
end
|
226
|
-
|
300
|
+
|
227
301
|
doc.close
|
228
302
|
parsed
|
229
303
|
end
|
data/lib/classes/searcher.rb
CHANGED
@@ -18,35 +18,35 @@ module Nicos
|
|
18
18
|
paramAry = []
|
19
19
|
|
20
20
|
case sort
|
21
|
-
when
|
21
|
+
when :comment_new
|
22
22
|
sortStr = ''
|
23
|
-
when
|
23
|
+
when :comment_old
|
24
24
|
sortStr = 'order=a'
|
25
|
-
when
|
25
|
+
when :view_many
|
26
26
|
sortStr = 'sort=v'
|
27
|
-
when
|
27
|
+
when :view_few
|
28
28
|
sortStr = 'sort=v&order=a'
|
29
|
-
when
|
29
|
+
when :comment_many
|
30
30
|
sortStr = 'sort=r'
|
31
|
-
when
|
31
|
+
when :comment_few
|
32
32
|
sortStr = 'sort=r&order=a'
|
33
|
-
when
|
33
|
+
when :mylist_many
|
34
34
|
sortStr = 'sort=m'
|
35
|
-
when
|
35
|
+
when :mylist_few
|
36
36
|
sortStr = 'sort=m&order=a'
|
37
|
-
when
|
37
|
+
when :post_new
|
38
38
|
sortStr = 'sort=f'
|
39
|
-
when
|
39
|
+
when :post_old
|
40
40
|
sortStr = 'sort=f&order=a'
|
41
|
-
when
|
41
|
+
when :length_long
|
42
42
|
sortStr = 'sort=l'
|
43
|
-
when
|
43
|
+
when :length_short
|
44
44
|
sortStr = 'sort=l&order=a'
|
45
45
|
end
|
46
46
|
|
47
47
|
paramAry.push("page=#{@page}") if @page != 1
|
48
48
|
paramAry.push(sortStr)
|
49
|
-
paramAry.push("rss=atom&numbers=1") if method ==
|
49
|
+
paramAry.push("rss=atom&numbers=1") if method == :atom
|
50
50
|
param = tag + "?" + paramAry.join('&')
|
51
51
|
|
52
52
|
host = 'www.nicovideo.jp'
|
@@ -67,20 +67,20 @@ module Nicos
|
|
67
67
|
method
|
68
68
|
)
|
69
69
|
|
70
|
-
if response[
|
71
|
-
result = parse(response[
|
70
|
+
if response[:order] == :afterTheSuccess
|
71
|
+
result = parse(response[:body])
|
72
72
|
result.each { |each|
|
73
|
-
movie = Nicos::Movie.new(each[
|
74
|
-
each[
|
73
|
+
movie = Nicos::Movie.new(each[:video_id])
|
74
|
+
each[:available] = true
|
75
75
|
movie.set(each)
|
76
76
|
movieObjAry.push(movie)
|
77
77
|
}
|
78
|
-
elsif response[
|
78
|
+
elsif response[:order] == :terminate
|
79
79
|
puts "Request loop terminated."
|
80
80
|
break
|
81
81
|
end
|
82
82
|
|
83
|
-
status = {
|
83
|
+
status = { :page => @page, :results => @connector.result}
|
84
84
|
order = block.call(movieObjAry, status)
|
85
85
|
@page += 1
|
86
86
|
end until order != "continue"
|
@@ -96,7 +96,7 @@ module Nicos
|
|
96
96
|
@numOfSearched = 32
|
97
97
|
@incrAmt = 0.2
|
98
98
|
|
99
|
-
@connector = Nicos::Connector.new(
|
99
|
+
@connector = Nicos::Connector.new(:mech)
|
100
100
|
|
101
101
|
# HTML中の各パラメータの所在を示すXPath
|
102
102
|
@videoIdXP = "//div[@class='uad_thumbfrm']/table/tr/td/p/a"
|
@@ -127,12 +127,12 @@ module Nicos
|
|
127
127
|
.text.gsub(/\,/, '').to_i
|
128
128
|
|
129
129
|
result.push({
|
130
|
-
|
131
|
-
|
132
|
-
|
133
|
-
|
134
|
-
|
135
|
-
|
130
|
+
:video_id => video_id,
|
131
|
+
:length => length,
|
132
|
+
:view => view,
|
133
|
+
:res => res,
|
134
|
+
:mylist => mylist,
|
135
|
+
:ad => ad
|
136
136
|
})
|
137
137
|
end
|
138
138
|
|
@@ -142,7 +142,7 @@ module Nicos
|
|
142
142
|
# @param [String] sortMethod
|
143
143
|
# @param [HashObj] waitConfig
|
144
144
|
def execute(tag, sortMethod, &block)
|
145
|
-
loop(tag, sort,
|
145
|
+
loop(tag, sort, :mech) { |result, page|
|
146
146
|
block.call(result, page)
|
147
147
|
}
|
148
148
|
end
|
@@ -168,79 +168,81 @@ module Nicos
|
|
168
168
|
# タグ検索を実行し、ブロックに結果を渡します。
|
169
169
|
#
|
170
170
|
# @param [String] tag 検索したいタグ文字列
|
171
|
-
# @param [
|
171
|
+
# @param [Symbol] sortMethod ソート方法
|
172
172
|
#==基本的な使い方
|
173
|
-
#
|
174
|
-
#
|
175
|
-
#
|
176
|
-
#
|
177
|
-
#
|
178
|
-
#
|
179
|
-
#
|
180
|
-
#
|
181
|
-
#
|
182
|
-
#
|
173
|
+
# require 'nicoscraper'
|
174
|
+
#
|
175
|
+
# searcher = Nicos::Searcher::ByTag.new()
|
176
|
+
# searcher.execute('VOCALOID', :view_many) {
|
177
|
+
# |result, status|
|
178
|
+
#
|
179
|
+
# result.each { |movieObj|
|
180
|
+
# puts movieObj.title
|
181
|
+
# }
|
182
|
+
# }
|
183
183
|
#
|
184
|
-
#
|
184
|
+
# result ----
|
185
185
|
#
|
186
|
-
#
|
187
|
-
#
|
188
|
-
#
|
189
|
-
#
|
190
|
-
#
|
191
|
-
#
|
192
|
-
#
|
193
|
-
#
|
194
|
-
#
|
186
|
+
# 【初音ミク】みくみくにしてあげる♪【してやんよ】
|
187
|
+
# 初音ミク が オリジナル曲を歌ってくれたよ「メルト」
|
188
|
+
# 初音ミク が オリジナル曲を歌ってくれたよ「ワールドイズマイン」
|
189
|
+
# 初音ミクオリジナル曲 「初音ミクの消失(LONG VERSION)」
|
190
|
+
# 【巡音ルカ】ダブルラリアット【オリジナル】
|
191
|
+
# 「卑怯戦隊うろたんだー」をKAITO,MEIKO,初音ミクにry【オリジナル】修正版
|
192
|
+
# 【オリジナル曲PV】マトリョシカ【初音ミク・GUMI】
|
193
|
+
# 初音ミクがオリジナルを歌ってくれたよ「ブラック★ロックシューター」
|
194
|
+
# ...
|
195
195
|
#
|
196
|
-
#
|
196
|
+
# Nicos::Searcher::ByTagのインスタンスを作り、executeメソッドに引数を与えて実行します。
|
197
197
|
# 結果がブロックの第1仮引数に渡されます。
|
198
198
|
# 渡される結果はMovieクラスのインスタンスを含む配列です。
|
199
199
|
#
|
200
200
|
#==スクレイプの継続について
|
201
201
|
#
|
202
|
-
#
|
202
|
+
# ニコニコ動画の検索結果は、指定した数を一度に取得できる訳ではありません。
|
203
203
|
# なぜなら、現状では検索結果はHTML1ページ、もしくは1つのRSS/Atomフィードに32個を限度に渡される方式であり、
|
204
204
|
# ByTagクラスがその結果を利用する以上、32個=1単位という制約のもとに置かれるからです。
|
205
|
-
# 従って、例えば最新の投稿100個の情報が欲しいとしても、1
|
205
|
+
# 従って、例えば最新の投稿100個の情報が欲しいとしても、1回のリクエストでは手に入らず、
|
206
206
|
# かならず数回に分けてリクエストすることになります。
|
207
207
|
#
|
208
208
|
# 加えて、リクエストを継続するかどうかの判定も1ページ/1フィード毎に行います。
|
209
209
|
#==sortMethod: ソート方法
|
210
|
-
#
|
210
|
+
# 以下のシンボルを指定して下さい。
|
211
|
+
#
|
212
|
+
# *:comment_new*
|
211
213
|
# コメントが新しい順
|
212
214
|
#
|
213
|
-
#
|
215
|
+
# *:comment_old*
|
214
216
|
# コメントが新しい順
|
215
217
|
#
|
216
|
-
#
|
218
|
+
# *:view_many*
|
217
219
|
# 再生数が多い順
|
218
220
|
#
|
219
|
-
#
|
221
|
+
# *:view_few*
|
220
222
|
# 再生数が少ない順
|
221
223
|
#
|
222
|
-
#
|
224
|
+
# *:comment_many*
|
223
225
|
# コメントが多い順
|
224
226
|
#
|
225
|
-
#
|
227
|
+
# *:comment_few*
|
226
228
|
# コメントが少ない順
|
227
229
|
#
|
228
|
-
#
|
230
|
+
# *:mylist_many*
|
229
231
|
# マイリスト登録が多い順
|
230
232
|
#
|
231
|
-
#
|
233
|
+
# *:mylist_few*
|
232
234
|
# マイリスト登録が少ない順
|
233
235
|
#
|
234
|
-
#
|
236
|
+
# *:post_new*
|
235
237
|
# 登録が新しい順
|
236
238
|
#
|
237
|
-
#
|
239
|
+
# *:post_old*
|
238
240
|
# 登録が少ない順
|
239
241
|
#
|
240
|
-
#
|
242
|
+
# *:length_long*
|
241
243
|
# 再生時間が長い順
|
242
244
|
#
|
243
|
-
#
|
245
|
+
# *:length_short*
|
244
246
|
# 再生時間が短い順
|
245
247
|
#
|
246
248
|
# @param [HashObj] waitConfig ウェイト設定
|
@@ -252,33 +254,89 @@ module Nicos
|
|
252
254
|
# 変更したい部分のキーと値のみを持つハッシュオブジェクトを作って下さい。
|
253
255
|
#
|
254
256
|
# @waitConfig = {
|
255
|
-
#
|
256
|
-
#
|
257
|
-
#
|
258
|
-
#
|
257
|
+
# :seqAccLimit => 10, # 連続してリクエストする回数
|
258
|
+
# :afterSeq => 10, # 連続リクエスト後のウェイト(以下、単位は全て秒)
|
259
|
+
# :each => 1, # 連続リクエスト時の、1リクエスト毎のウェイト
|
260
|
+
# :increment => 1, # アクセス拒絶時の、次回以降の1リクエスト毎のウェイトの増加量
|
259
261
|
#
|
260
|
-
#
|
261
|
-
#
|
262
|
-
#
|
262
|
+
# :deniedSeqReq=> { # 連続アクセスを拒否された際の設定(以下同じ)
|
263
|
+
# :retryLimit => 3, # 再試行の上限回数
|
264
|
+
# :wait => 120 # 次のアクセスまでのウェイト
|
263
265
|
# },
|
264
266
|
#
|
265
|
-
#
|
266
|
-
#
|
267
|
-
#
|
267
|
+
# :serverIsBusy=> { # サーバ混雑時
|
268
|
+
# :retryLimit => 3,
|
269
|
+
# :wait => 120
|
268
270
|
# },
|
269
271
|
#
|
270
|
-
#
|
271
|
-
#
|
272
|
-
#
|
272
|
+
# :serviceUnavailable => { # 503が返ってきた時
|
273
|
+
# :retryLimit => 3,
|
274
|
+
# :wait => 120
|
273
275
|
# },
|
274
276
|
#
|
275
|
-
#
|
276
|
-
#
|
277
|
-
#
|
277
|
+
# :timedOut => { # タイムアウト時
|
278
|
+
# :retryLimit => 3,
|
279
|
+
# :wait => 10
|
278
280
|
# }
|
279
281
|
# }
|
282
|
+
#
|
283
|
+
#==ブロック内の第2引数について
|
284
|
+
#
|
285
|
+
# 第2引数には、それまでの検索の成否、例外の発生回数などを記録した
|
286
|
+
# ハッシュが渡されます。これは以下のような構造になっています。
|
287
|
+
#
|
288
|
+
# {
|
289
|
+
# # 各種例外等が発生した動画・マイリストのIDを配列で保管。
|
290
|
+
# :notPublic => [],
|
291
|
+
# :limInCommunity => [],
|
292
|
+
# :notFound => [],
|
293
|
+
# :deleted => [],
|
294
|
+
#
|
295
|
+
# # 再試行で対処できる例外等が発生した件数。
|
296
|
+
# :deniedSeqReq => 0,
|
297
|
+
# :serverIsBusy => 0,
|
298
|
+
# :serviceUnavailable => 0,
|
299
|
+
# :timedOut => 0,
|
300
|
+
#
|
301
|
+
# # 成功回数
|
302
|
+
# :succeededNum => 0
|
303
|
+
# }
|
304
|
+
#
|
305
|
+
# *allDisabled*
|
306
|
+
# マイリストの場合のみ機能。そのマイリスト内の動画が全て非公開、
|
307
|
+
# あるいは削除済み等で存在しないが、マイリストは残っている場合。
|
308
|
+
#
|
309
|
+
# *notPublic*
|
310
|
+
# 動画、マイリストが非公開である場合。
|
311
|
+
#
|
312
|
+
# *limInCommunity*
|
313
|
+
# 動画、マイリストがコミュニティ限定公開である場合。
|
314
|
+
#
|
315
|
+
# *notFound*
|
316
|
+
# 動画、マイリストが存在しない場合。マイリストは削除済みの場合もnotFoundとなる。
|
317
|
+
#
|
318
|
+
# *deleted*
|
319
|
+
# その動画が削除済みである場合。マイリストについては、上のnotFoundと
|
320
|
+
# 区別されない。
|
321
|
+
#
|
322
|
+
# *deniedSeqReq*
|
323
|
+
# 連続アクセスとして明示的に拒否された場合。
|
324
|
+
#
|
325
|
+
# *serverIsBusy*
|
326
|
+
# 「大変ご迷惑をおかけいたしますが、しばらく時間をあけてから
|
327
|
+
# 再度検索いただくようご協力をお願いいたします。」と表示される場合。
|
328
|
+
#
|
329
|
+
# *serviceUnavailable*
|
330
|
+
# 503が返ってきた時。
|
331
|
+
#
|
332
|
+
# *timedOut*
|
333
|
+
# タイムアウト
|
334
|
+
#
|
335
|
+
# *succeededNum*
|
336
|
+
# 成功回数
|
337
|
+
#==
|
280
338
|
def execute(tag, sortMethod, &block)
|
281
|
-
loop(tag, sortMethod,
|
339
|
+
loop(tag, sortMethod, :atom) { |result, page|
|
282
340
|
block.call(result, page)
|
283
341
|
}
|
284
342
|
end
|