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

最近项目内容需要引入代理IP去爬取内容。

为了项目持续运行,需要不断构造、维护、验证代理IP。

为了绕过服务端对IP 和 频率的限制,为了阻止服务端获取真正的主机IP。

一、服务器如何获取客户端IP

  1.js获取本地IP后提交

  这种方案可以通过抓包查看交互,伪造包达到目的。本机就可以完成。

  2.服务端通过 http字段获取真实IP地址

  可以通过伪造字段来获取(可以自己伪造,也可以通过高匿代理服务器伪造)

  3.服务端通过tcp连接来确定真实IP地址

  这个不可能伪造,不然无法建立TCP连接。

综合情况,我们最好通过代理IP服务器(匿名  混淆  高匿 三种代理都可以),交由代理处理字段,让服务端无法得知自己的IP。

二、爬取免费代理(有钱自己买也行)

  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的代码

    结果真的好遗憾。xici高匿代理几万条筛出一条就是不错的结果了。。

三、维护IP池

  开启服务不断爬取筛选,筛选出的IP,需要保存到IP池中。IP池通过消息中间件维护,其他job去访问即可。

  如何保证从IP池获取到的IP是实时有效且匿名的呢。

  可以采取惰性验证的手段,还是通过访问服务测试。 (这里应该可以优化一下。给IP打上时间戳,一定时间内可以不用再次验证)

原文地址:https://www.cnblogs.com/Geek-xiyang/p/10339981.html