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