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