抓取数据时,定时换 http 代理
中间件本身就是一个 http 代理服务器,由它负责检测代理是否有效,代理失效是否换代理重试。会话保持 (同一 session 只用同一个 proxy server)
代码只需要设置 http 代理地址为中间件地址即可
这样的 gem 不知道,但是自己实现一个简化版也很容易。
#1 结合神器 mechanize 应该很简单的
#1 楼 @kenshin54 主要想把这部分功能给分离出来,这是一个通用需求,基本上采集都能用的到
想通过 http header 标识会话, 同一会话,只用同一代理. 你同时发起 10 个会话请求,应该使用 10 个不同代理
http header 传参过来,告诉中间件,出错是否自动重试,重试的次数
自己写代码可以实现,只是重用不高,另外一个项目用,就需要再复制一份
#3 楼 @cxh116 具体我没试过,你可以尝试一下
mechanize 有 post_connect 这个 hook,你可以在这个 hook 里根据 response,header 来得到信息,判断是否出错,然后用 set_proxy 方式切换代理
这个 hook 只要是个能响应 call 方法的对象即可,和 rack 对象的参数有所区别,具体去查一下文档
你可以吧这个 hook 单独出来,这样可以共用了
#4 楼 @kenshin54
嗯,用 hook 也是一种方案,简单实用。代理调度与 response 都在 hook 里实现. 既然可以用 hook 实现,那么应该也可以用对象委托这种方式来实现。
个人还是便向完全独立成一个中间件,流程是这样的
程序 -> 代理中间件 -> 真实HTTP代理服务器
对于"程序"来说,"代理中间件"是一个永远都有效的 HTTP 代理服务器,它并不关心"真实 HTTP 代理服务器"是否失效
程序需要设置 http header,来标识请求是不是属于同一会话,比如,你先请求一个验证码,再提交数据。这是两个请求,一个会话
代理中间件是一个完全独立的程序,它是一个 http 代理服务器,同时,它把接收到的请求,再使用真实的 http 代理服务器转发出去. 它得负责负载均衡,不能把所有请求都转发到一台真实的 http 代理服务器 它得保持会话,同一会话,应该使用同一的真实的 http 代理服务器 它得检测代理是否失效,失效了应该从代理池删除
#5 楼 @cxh116 我怎么感觉 nginx 就能做到,配置反向代理,用 ip_hash 做负载均衡,本身 nginx 也能做 failover,但是你的检测代理失效的具体需求可能不一样,还不如自己实现一个,需求也不是很复杂
用 nginx 如何做到自动切换 IP 地址呢?