lib/http_crawler/client.rb in http_crawler-0.3.1.31 vs lib/http_crawler/client.rb in http_crawler-0.3.2.0
- old
+ new
@@ -111,80 +111,200 @@
end
attr_accessor :redirect
attr_accessor :header
- # 头文件相关方法
- def header(parameter = {})
- parameter = parameter.symbolize_keys
+ # 创建时间: 2019/9/16 17:11
+ # 更新时间: 2019/9/16
+ # 作者: Jagger
+ # 方法名称: header
+ # 方法说明: 返回头文件
+ # 调用方式: #header
+ #
+ # @return
+ def header
@header ||= init_header
end
- def init_header(parameter = {})
- parameter = parameter.symbolize_keys
+ # 创建时间: 2019/9/16 17:08
+ # 更新时间: 2019/9/16
+ # 作者: Jagger
+ # 方法名称: init_header
+ # 方法说明: 初始化头文件
+ # 调用方式: #init_header
+ #
+ # @return
+ #
+ def init_header
@header = {
"Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8",
"Accept-Encoding": "gzip, br",
"Accept-Language": "zh-CN,zh;q=0.9",
"Connection": "keep-alive",
"Upgrade-Insecure-Requests": "1",
"User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.109 Safari/537.36",
}
end
+ # 创建时间: 2019/9/16 17:08
+ # 更新时间: 2019/9/16
+ # 作者: Jagger
+ # 方法名称: update_header
+ # 方法说明: 更新头文件,局部更新
+ # 调用方式: #update_header
+ #
+ # @return
+ #
def update_header(parameter = {})
- parameter = parameter.symbolize_keys
- @header = init_header
+ @header = @header.merge(parameter.symbolize_keys)
end
+ # 创建时间: 2019/9/16 17:10
+ # 更新时间: 2019/9/16
+ # 作者: Jagger
+ # 方法名称: replace_header
+ # 方法说明: 替换头文件
+ # 调用方式: #replace_header
+ #
+ # @option parameter [Hash] Hash模式传参
+ # @param parameter [Hash]
+ # {
+ # "": , # 参数说明
+ # }
+ #
+ # @return
+ #
+ def replace_header(parameter = {})
+ @header = parameter.symbolize_keys
+ end
+
+
attr_accessor :cookies
- # cookies相关方法
- def cookies(parameter = {})
- parameter = parameter.symbolize_keys
- @cookies ||= HTTP::CookieJar.new
+ # 创建时间: 2019/9/16 17:12
+ # 更新时间: 2019/9/16
+ # 作者: Jagger
+ # 方法名称: cookies
+ # 方法说明: 返回头文件
+ # 调用方式: #cookies
+ #
+ # @return
+ #
+ def cookies
+ @cookies ||= init_cookies
end
- def init_cookies(parameter = {})
- parameter = parameter.symbolize_keys
+ # 创建时间: 2019/9/16 17:13
+ # 更新时间: 2019/9/16
+ # 作者: Jagger
+ # 方法名称: init_cookies
+ # 方法说明: 初始化头文件
+ # 调用方式: #init_cookies
+ #
+ # @return
+ #
+ def init_cookies
@cookies = {}
end
+ # 创建时间: 2019/9/16 17:13
+ # 更新时间: 2019/9/16
+ # 作者: Jagger
+ # 方法名称: update_cookies
+ # 方法说明: 更新cookies,局部替换
+ # 调用方式: #update_cookies
+ #
+ # @option parameter [Hash] Hash模式传参
+ # @param parameter [Hash]
+ # {
+ # "": , # 参数说明
+ # }
+ #
+ # @return
+ #
def update_cookies(parameter = {})
- parameter = parameter.symbolize_keys
+ case parameter
+ when String
+ hash = {}
+ parameter.scan(/([^=]*)=([^;]*);? ?/) do |m|
+ hash[:"#{m[0]}"] = m[1]
+ end
+ @cookies = @cookies.merge(hash.symbolize_keys)
+ when Hash
+ @cookies = @cookies.merge(parameter.symbolize_keys)
+ else
+ raise "cookies传入格式错误"
+ end
+ @cookies
+ end
+ # 创建时间: 2019/9/16 17:20
+ # 更新时间: 2019/9/16
+ # 作者: Jagger
+ # 方法名称: inheritance_cookies
+ # 方法说明: 继承上一个请求的set-cookies
+ # 调用方式: #inheritance_cookies
+ #
+ # @return
+ #
+ def inheritance_cookies
@response.cookies.each do |cookie|
- @cookies.add(cookie)
+ @cookies[:"#{cookie.name}"] = cookie.value
end unless @response.blank?
-
- nil
+ @cookies
end
- # 字符串转换成cookies
- # "abc=123; cd=412" => { "abc": "123", "cd": "412"}
- def str_to_cookies(str)
- str.scan(/([^=]*)=([^;]*);? ?/) do |m|
- self.cookies[:"#{m[0]}"] = m[1]
- end
- end
-
- # 代理设置
+ # 创建时间: 2019/9/16 17:19
+ # 更新时间: 2019/9/16
+ # 作者: Jagger
+ # 方法名称: auto_proxy=
+ # 方法说明: 自动更新代理设置
+ # 调用方式: #auto_proxy=
+ #
+ # @return
+ #
def auto_proxy=(value)
Rails.logger.debug "自动更新代理"
@auto_proxy = value
update_proxy if (value == true && @proxy.blank?)
end
- # 代理使用的api方法名
+ # 创建时间: 2019/9/16 17:23
+ # 更新时间: 2019/9/16
+ # 作者: Jagger
+ # 方法名称: proxy_api
+ # 方法说明: 代理使用的api方法名
+ # 调用方式: #proxy_api
+ #
+ # @return
+ #
def proxy_api
@proxy_api ||= "my"
end
- # 调用代理 api使用的参数
+ # 创建时间: 2019/9/16 17:24
+ # 更新时间: 2019/9/16
+ # 作者: Jagger
+ # 方法名称: proxy_params
+ # 方法说明: 调用代理 api使用的参数
+ # 调用方式: #proxy_params
+ #
+ # @return
def proxy_params
@proxy_params ||= {key: "default"}
end
+ # 创建时间: 2019/9/16 17:24
+ # 更新时间: 2019/9/16
+ # 作者: Jagger
+ # 方法名称: update_proxy
+ # 方法说明: 更新代理,如果未传入代理则自动获取代理
+ # 调用方式: #update_proxy
+ #
+ # @option proxy [Hash] Hash模式传参
+ # @param proxy [Hash]
+ #
+ # @return
def update_proxy(proxy = {})
proxy = proxy.symbolize_keys
if (proxy.blank?)
@proxy = get_proxy
else
@@ -192,11 +312,18 @@
end
# @http.update_proxy(proxy)
end
- # 如果自动更新代理 则更新代理返回 true,否则返回false
+ # 创建时间: 2019/9/16 17:25
+ # 更新时间: 2019/9/16
+ # 作者: Jagger
+ # 方法名称: update_proxy?
+ # 方法说明: 是否自动更新代理,如果自动更新代理 则更新代理返回 true,否则返回false
+ # 调用方式: #update_proxy?
+ #
+ # @return
def update_proxy?
if @auto_proxy
self.update_proxy
return true
else
@@ -205,10 +332,19 @@
end
# 获取proxy
# 通过调用 api 获取代理或者通过自定义设置代理
+ # 创建时间: 2019/9/16 17:26
+ # 更新时间: 2019/9/16
+ # 作者: Jagger
+ # 方法名称: get_proxy
+ # 方法说明: 获取proxy、通过调用 api 获取代理或者通过自定义设置代理
+ # 调用方式: #get_proxy
+ #
+ # @return
+ #
def get_proxy
proxy_ip = nil
begin
Rails.logger.debug("开始获取代理IP")
proxy_client = HttpCrawler::Proxy.for(proxy_api)
@@ -250,20 +386,21 @@
# 初始化init_client参数
def init_client
nil
end
- # 创建时间: 2019/9/11 17:11
- # 更新时间: 2019/9/11
+ # 初始化http请求前置条件
+ # 创建时间: 2019/9/16 17:27
+ # 更新时间: 2019/9/16
# 作者: Jagger
- # 方法名称: init_http
- # 方法说明: 初始化http请求前置条件
- # 调用方式: #init_http
+ # 方法名称: http
+ # 方法说明: 创建Http的对象,用于发送请求
+ # 调用方式: #http
#
# @return HTTP
- #
- def init_http
+ def http
+
h = HTTP
# 自动重定向。最大重定向次数 max_hops: 5
h = h.follow(max_hops: 5) if self.redirect == true
# 添加代理
@@ -285,17 +422,24 @@
end
h
end
- # 初始化http请求前置条件
- def http
- init_http
- end
-
- # 发送 get 请求
+ # 创建时间: 2019/9/16 17:27
+ # 更新时间: 2019/9/16
+ # 作者: Jagger
+ # 方法名称: get
+ # 方法说明: 发送get请求
+ # 调用方式: #get
+ #
+ # @param path [String] uri路由地址
+ # @param params [Hash] get参数
+ # @param limit [Integer] 错误递归次数
+ #
+ # @return
+ #
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)
return r if limit < 0
@@ -304,27 +448,56 @@
end
r
end
end
- # 直接发送uri的get请求
+ # 创建时间: 2019/9/16 17:29
+ # 更新时间: 2019/9/16
+ # 作者: Jagger
+ # 方法名称: get_uri
+ # 方法说明: 直接发送uri的get请求
+ # 调用方式: #get_uri
+ #
+ # @return
def get_uri
raise "Client uri为空" unless self.uri
request {http.get(self.uri.to_s, :ssl_context => @ctx)}
end
# 发送 post 请求
+ # 创建时间: 2019/9/16 17:29
+ # 更新时间: 2019/9/16
+ # 作者: Jagger
+ # 方法名称: post
+ # 方法说明: 发送 post 请求
+ # 调用方式: #post
+ #
+ # @param path [String] uri路由地址
+ # @param params [Hash] get参数
+ # @param format [] 请求参数的模式::params、:form、:body、:json、:form。
+ #
+ # @return
def post(path, params = {}, format = :form)
raise "Client uri为空" unless self.uri
request {http.post((self.uri + path).to_s, format => params, :ssl_context => @ctx)}
end
# 请求的响应
attr_accessor :response
protected :response=
# 出现如果验证码,切换代理
+ # 创建时间: 2019/9/16 17:31
+ # 更新时间: 2019/9/16
+ # 作者: Jagger
+ # 方法名称: validation_to_proxy?
+ # 方法说明: 验证是否出现验证码,出现如果验证码,切换代理
+ # 调用方式: #validation_to_proxy?
+ #
+ # @param r 默认为本身的 @response
+ #
+ # @return
def validation_to_proxy?(r = response)
# 判断是否出现验证码
if r.validation_page?
# 触发验证码切换代理
self.update_proxy?
@@ -336,10 +509,18 @@
end
protected
- # 发送请求
+ # 创建时间: 2019/9/16 18:01
+ # 更新时间: 2019/9/16
+ # 作者: Jagger
+ # 方法名称: request
+ # 方法说明: 发送请求,所有请求都会走该方法
+ # 调用方式: #request
+ #
+ # @return
+ #
def request(&block)
raise "必须定义块" unless block_given?
n = max_error_num
begin
r = block.call