Module: Spidy::Definition

Defined in:
lib/spidy/definition.rb

Overview

Class representing a website defined by DSL

Instance Method Summary collapse

Instance Method Details

#call(source = nil, name: :default, &yielder) ⇒ Object



9
10
11
12
13
14
15
# File 'lib/spidy/definition.rb', line 9

def call(source = nil, name: :default, &yielder)
  name = name.presence || :default
  spidy = @namespace[:"#{name}_scraper"]
  fail "undefined spidy [#{name}]" if spidy.nil?

  spidy.call(source, &yielder)
end

#define(name = :default, connector: nil, as: nil, &define_block) ⇒ Object



52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
# File 'lib/spidy/definition.rb', line 52

def define(name = :default, connector: nil, as: nil, &define_block)
  connector = Spidy::Connector.get(connector || as, wait_time: @wait_time, user_agent: @user_agent,
                                                    socks_proxy: @socks_proxy)
  binder_base = Spidy::Binder.const_get(as.to_s.classify)
  @namespace ||= {}
  @namespace[:"#{name}_scraper"] = Class.new(Spidy::DefinitionObject) do
    extend binder_base
    class_eval(&define_block)
    define_singleton_method(:call) do |source, &yielder|
      yielder = ->(result) { break result } if yielder.nil?
      connection_yielder = lambda do |page|
        yielder.call(new(page, source))
      end
      connector.call(source, &connection_yielder)
    end
  end
end

#each(source = nil, name: :default, &yielder) ⇒ Object



29
30
31
32
33
34
35
36
37
38
39
40
41
# File 'lib/spidy/definition.rb', line 29

def each(source = nil, name: :default, &yielder)
  name = name.presence || :default
  spidy = @namespace[:"#{name}_spider"]
  fail "undefined spidy [#{name}]" if spidy.nil?

  if yielder
    spidy.call(source, &yielder)
  else
    Enumerator.new do |enumerate_yielder|
      spidy.call(source, &enumerate_yielder)
    end
  end
end

#namespaceObject



5
6
7
# File 'lib/spidy/definition.rb', line 5

def namespace
  @namespace
end

#socks_proxy(host, port) ⇒ Object



25
26
27
# File 'lib/spidy/definition.rb', line 25

def socks_proxy(host, port)
  @socks_proxy = { host: host, port: port }
end

#spider(name = :default, connector: nil, as: nil) ⇒ Object



43
44
45
46
47
48
49
50
# File 'lib/spidy/definition.rb', line 43

def spider(name = :default, connector: nil, as: nil)
  @namespace ||= {}
  connector = Spidy::Connector.get(connector || as, wait_time: @wait_time, user_agent: @user_agent,
                                                    socks_proxy: @socks_proxy)
  @namespace[:"#{name}_spider"] = proc do |source, &yielder|
    yield(yielder, connector, source)
  end
end

#user_agent(user_agent) ⇒ Object



17
18
19
# File 'lib/spidy/definition.rb', line 17

def user_agent(user_agent)
  @user_agent = user_agent
end

#wait_time(wait_time) ⇒ Object



21
22
23
# File 'lib/spidy/definition.rb', line 21

def wait_time(wait_time)
  @wait_time = wait_time
end