Class: EroGetter::Base
- Inherits:
-
Object
show all
- Defined in:
- lib/ero_getter/base.rb
Class Method Summary
collapse
Instance Method Summary
collapse
Constructor Details
#initialize(url, direction = :none) ⇒ Base
Returns a new instance of Base.
9
10
11
12
13
|
# File 'lib/ero_getter/base.rb', line 9
def initialize(url, direction = :none)
raise unless url.match url_regex
@url = url
@direction = direction
end
|
Class Method Details
.connection(css, &block) ⇒ Object
137
138
139
140
141
142
143
144
145
146
147
148
149
|
# File 'lib/ero_getter/base.rb', line 137
def connection(css, &block)
[:prev, :next].each_with_index do |method_name, index|
var_name = "@#{method_name}".to_sym
define_method(method_name) do
unless instance_variable_defined?(var_name)
tag = document.css(css[index]).first
instance_variable_set(var_name,
tag && instance_exec(tag, &block) ? tag[:href] : nil)
end
instance_variable_get(var_name)
end
end
end
|
.filename(&block) ⇒ Object
151
152
153
154
155
|
# File 'lib/ero_getter/base.rb', line 151
def filename(&block)
define_method(:_filename) do |attr|
yield(attr)
end
end
|
.name(site_name) ⇒ Object
100
101
102
103
104
105
106
107
|
# File 'lib/ero_getter/base.rb', line 100
def name(site_name)
define_method(:name) do
site_name
end
define_singleton_method(:site_name) do
site_name
end
end
|
.sub_directory(&block) ⇒ Object
128
129
130
131
132
133
134
135
|
# File 'lib/ero_getter/base.rb', line 128
def sub_directory(&block)
define_method(:sub_directory) do
unless instance_variable_defined?(:@sub_directory)
instance_variable_set(:@sub_directory, self.instance_eval(&block))
end
instance_variable_get(:@sub_directory)
end
end
|
.target(css_selector, &block) ⇒ Object
116
117
118
119
120
121
122
123
124
125
126
|
# File 'lib/ero_getter/base.rb', line 116
def target(css_selector, &block)
define_method(:targets) do
unless instance_variable_defined?(:@targets)
items = document.css(css_selector).map do |elm|
yield(elm)
end
instance_variable_set(:@targets, items.compact)
end
instance_variable_get(:@targets)
end
end
|
.url(regex) ⇒ Object
109
110
111
112
113
114
|
# File 'lib/ero_getter/base.rb', line 109
def url(regex)
define_method(:url_regex) do
regex
end
EroGetter.add_mapping(regex, self)
end
|
Instance Method Details
#base_dir ⇒ Object
15
16
17
|
# File 'lib/ero_getter/base.rb', line 15
def base_dir
self.class.to_s.underscore
end
|
#direction ⇒ Object
35
36
37
|
# File 'lib/ero_getter/base.rb', line 35
def direction
@direction
end
|
#directory ⇒ Object
19
20
21
22
23
24
25
|
# File 'lib/ero_getter/base.rb', line 19
def directory
unless @dir
@dir = File.join(EroGetter.directory, base_dir, sub_directory)
FileUtils.mkdir_p(@dir)
end
@dir
end
|
#document ⇒ Object
43
44
45
|
# File 'lib/ero_getter/base.rb', line 43
def document
@document ||= Nokogiri::HTML(html, nil, NKF.guess(html).to_s)
end
|
#get_target(target, count = 0) ⇒ Object
63
64
65
66
67
68
69
70
71
|
# File 'lib/ero_getter/base.rb', line 63
def get_target(target, count = 0)
response = http_client.get(target, :header => {:referer => url}, :follow_redirect => true)
unless response.status == 200
raise target unless count < 3
sleep 2
return get_target target, count + 1
end
response
end
|
#html ⇒ Object
39
40
41
|
# File 'lib/ero_getter/base.rb', line 39
def html
@html ||= open(url).read
end
|
#http_client ⇒ Object
27
28
29
|
# File 'lib/ero_getter/base.rb', line 27
def http_client
@http_client ||= HTTPClient.new
end
|
#run ⇒ Object
51
52
53
54
55
56
57
58
59
60
61
|
# File 'lib/ero_getter/base.rb', line 51
def run
targets.each_with_index do |target_url, index|
if target_url =~ /.*\.zip$/
save_zip(target_url, index)
else
save_image(target_url, index)
end
end
self.class.new(self.prev, :prev).run if run_prev?
self.class.new(self.next, :next).run if run_next?
end
|
#save_image(target_url, index) ⇒ Object
73
74
75
76
77
|
# File 'lib/ero_getter/base.rb', line 73
def save_image(target_url, index)
_filename = filename(File.basename(target_url), index)
response = get_target(target_url)
File.open(File.join(directory, _filename), "wb") {|f| f.write response.body }
end
|
#save_zip(target_url, index) ⇒ Object
79
80
81
82
83
84
|
# File 'lib/ero_getter/base.rb', line 79
def save_zip(target_url, index)
response = get_target(target_url)
unzip(response.body).each do |_filename, data|
File.open(File.join(directory, _filename), "wb") {|f| f.write data }
end
end
|
#title ⇒ Object
47
48
49
|
# File 'lib/ero_getter/base.rb', line 47
def title
@title ||= document.title.strip
end
|
#unzip(zip_data) ⇒ Object
86
87
88
89
90
91
92
93
94
95
96
97
|
# File 'lib/ero_getter/base.rb', line 86
def unzip(zip_data)
result = []
Zip::Archive.open_buffer(zip_data) do |archive|
archive.num_files.times do |i|
entry_name = archive.get_name(i)
archive.fopen(entry_name) do |f|
result << [f.name, f.read]
end
end
end
result
end
|
#url ⇒ Object
31
32
33
|
# File 'lib/ero_getter/base.rb', line 31
def url
@url
end
|