lib/http_crawler/client.rb in http_crawler-0.3.1.29 vs lib/http_crawler/client.rb in http_crawler-0.3.1.30
- old
+ new
@@ -7,21 +7,21 @@
# 接收格式
# web_name = "biquge_duquanben"
# 返回 HttpCrawler::Web::BiqugeDuquanben::Client 实例
#
- def for(web_name)
- "HttpCrawler::Web::#{web_name.camelize}::Client".constantize.new()
+ def for(web_name, args = {})
+ "HttpCrawler::Web::#{web_name.camelize}::Client".constantize.new(args)
end
#
# 接收格式
# module_name = "HttpCrawler::Web::BiqugeDuquanben"
# 返回 HttpCrawler::Web::BiqugeDuquanben::Client 实例
#
- def for_module(module_name, *args)
- "#{module_name}::Client".constantize.new()
+ def for_module(module_name, args = {})
+ "#{module_name}::Client".constantize.new(args)
end
def for_uri(path)
self.new(uri: path)
end
@@ -52,10 +52,11 @@
init_ssl unless uri.blank?
# 初始化一些 client 自定义参数
init_client
+ self.redirect = true
# 初始化 代理参数
@proxy_params = {key: "#{self.class.to_s.gsub(":", "_")}"}
end
attr_accessor :max_error_num
@@ -107,10 +108,12 @@
@ctx = OpenSSL::SSL::SSLContext.new
@ctx.verify_mode = OpenSSL::SSL::VERIFY_NONE
end
end
+ attr_accessor :redirect
+
attr_accessor :header
# 头文件相关方法
def header(parameter = {})
parameter = parameter.symbolize_keys
@header ||= init_header
@@ -145,10 +148,15 @@
@cookies = {}
end
def update_cookies(parameter = {})
parameter = parameter.symbolize_keys
+
+ @response.cookies.each do |cookie|
+ @cookies.add(cookie)
+ end unless @response.blank?
+
nil
end
# 字符串转换成cookies
# "abc=123; cd=412" => { "abc": "123", "cd": "412"}
@@ -242,14 +250,23 @@
# 初始化init_client参数
def init_client
nil
end
- # 初始化http请求前置条件
- def http
+ # 创建时间: 2019/9/11 17:11
+ # 更新时间: 2019/9/11
+ # 作者: Jagger
+ # 方法名称: init_http
+ # 方法说明: 初始化http请求前置条件
+ # 调用方式: #init_http
+ #
+ # @return HTTP
+ #
+ def init_http
+ h = HTTP
# 自动重定向。最大重定向次数 max_hops: 5
- h = HTTP.follow(max_hops: 5)
+ h = h.follow(max_hops: 5) if self.redirect == true
# 添加代理
h = h.via(@proxy[:p_addr], @proxy[:p_port].to_i, @proxy[:p_user], @proxy[:p_pass]) unless (@proxy.blank?)
# 添加头文件
@@ -268,11 +285,16 @@
end
h
end
+ # 初始化http请求前置条件
+ def http
+ init_http
+ end
+
# 发送 get 请求
def get(path, params = {}, limit = 3)
raise "Client uri为空" unless self.uri
request do
r = http.get((self.uri + path).to_s, :params => params, :ssl_context => @ctx)
@@ -320,10 +342,10 @@
def request(&block)
raise "必须定义块" unless block_given?
n = max_error_num
begin
r = block.call
- if r.status.success?
+ if r.status.success? || (redirect == false && r.status.redirect?)
return r
else
raise "请求失败(#{r.code}):#{r.uri.to_s}"
end
rescue => error