瞎扯淡 有这样的代理中间件吗?

cxh116 · 2013年01月23日 · 最后由 johnnyhg 回复于 2013年03月18日 · 3048 次阅读

抓取数据时,定时换 http 代理

中间件本身就是一个 http 代理服务器,由它负责检测代理是否有效,代理失效是否换代理重试。会话保持 (同一 session 只用同一个 proxy server)

代码只需要设置 http 代理地址为中间件地址即可

这样的 gem 不知道,但是自己实现一个简化版也很容易。

  1. 根据时间取模切换代理
  2. 定义个失败次数,超过次数切换代理

#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 地址呢?

需要 登录 后方可回复, 如果你还没有账号请 注册新账号