爬虫爬取代理IP池以及代理IP的验证

最近项目内容需要引入代理IP去爬取内容。
为了项目持续运行,需要不断构造、维护、验证代理IP。
为了绕过服务端对IP 和 频率的限制,为了阻止服务端获取真正的主机IP。
一、服务器如何获取客户端IP
  1.js获取本地IP后提交
  这种方案可以通过抓包查看交互,伪造包达到目的。本机就可以完成。
  2.服务端通过 http字段获取真实IP地址
  可以通过伪造字段来获取(可以自己伪造,也可以通过高匿代理服务器伪造)
  3.服务端通过tcp连接来确定真实IP地址
  这个不可能伪造,不然无法建立TCP连接。
综合情况,我们最好通过代理IP服务器(匿名 混淆 高匿 三种代理都可以),交由代理处理字段,让服务端无法得知自己的IP。
添加图片注释,不超过 140 字(可选)
二、爬取免费代理(有钱自己买也行)
  1.寻找代理网站然后爬取内容
    这边找的是xici,然后爬取之后对代理进行了筛选。
    xici代理会对ua封IP,需要伪造ua逃避掉。
  2.验证并筛选代理IP
    有些代理服务器并不是高匿,虽然声称了高匿,还有广告陷阱。。。
    我们可以自己搭建一个web服务测试,看代理服务器是否隐藏我们的IP,也可以通过确定返回内容长度来确定是否是广告陷阱。
1 if(getenv('HTTP_CLIENT_IP') && strcasecmp(getenv('HTTP_CLIENT_IP'), 'unknown')) { 2 $ip = getenv('HTTP_CLIENT_IP'); 3 } elseif(getenv('HTTP_X_FORWARDED_FOR') && strcasecmp(getenv('HTTP_X_FORWARDED_FOR'), 'unknown')) { 4 $ip = getenv('HTTP_X_FORWARDED_FOR'); 5 } elseif(getenv('REMOTE_ADDR') && strcasecmp(getenv('REMOTE_ADDR'), 'unknown')) { 6 $ip = getenv('REMOTE_ADDR'); 7 } elseif(isset($_SERVER['REMOTE_ADDR']) && $_SERVER['REMOTE_ADDR'] && strcasecmp($_SERVER['REMOTE_ADDR'], 'unknown')) { 8 $ip = $_SERVER['REMOTE_ADDR']; 9 } 10 $res = preg_match ( '/[\d\.]{7,15}/', $ip, $matches ) ? $matches [0] : ''; 11 echo $res; 返回实际IP的代码
添加图片注释,不超过 140 字(可选)
三、维护IP池
  开启服务不断爬取筛选,筛选出的IP,需要保存到IP池中。IP池通过消息中间件维护,其他job去访问即可。
  如何保证从IP池获取到的IP是实时有效且匿名的呢。
  可以采取惰性验证的手段,还是通过访问服务测试。 (这里应该可以优化一下。给IP打上时间戳,一定时间内可以不用再次验证) 华益云HTTP代理

相关推荐