最近项目内容须要引入代理IP去爬取内容。web
为了项目持续运行,须要不断构造、维护、验证代理IP。服务器
为了绕过服务端对IP 和 频率的限制,为了阻止服务端获取真正的主机IP。tcp
1、服务器如何获取客户端IPide
1.js获取本地IP后提交测试
这种方案能够经过抓包查看交互,伪造包达到目的。本机就能够完成。优化
2.服务端经过 http字段获取真实IP地址网站
能够经过伪造字段来获取(能够本身伪造,也能够经过高匿代理服务器伪造)spa
3.服务端经过tcp链接来肯定真实IP地址代理
这个不可能伪造,否则没法创建TCP链接。code
综合状况,咱们最好经过代理IP服务器(匿名 混淆 高匿 三种代理均可以),交由代理处理字段,让服务端没法得知本身的IP。
2、爬取免费代理(有钱本身买也行)
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;
结果然的好遗憾。xici高匿代理几万条筛出一条就是不错的结果了。。
3、维护IP池
开启服务不断爬取筛选,筛选出的IP,须要保存到IP池中。IP池经过消息中间件维护,其余job去访问便可。
如何保证从IP池获取到的IP是实时有效且匿名的呢。
能够采起惰性验证的手段,仍是经过访问服务测试。 (这里应该能够优化一下。给IP打上时间戳,必定时间内能够不用再次验证)