zoukankan      html  css  js  c++  java
  • 爬虫爬取代理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打上时间戳,一定时间内可以不用再次验证)

  • 相关阅读:
    apache伪静态设置
    ZeroClipboard.js兼容各种浏览器复制到剪切板上
    table 如何给tr border颜色
    JSON用法之将PHP数组转JS数组,JS如何接收PHP数组
    jquery操作select(增加,删除,清空)
    JS生成随机的由字母数字组合的字符串
    Redis连接(二)
    Redis集群(一)
    wap启用宏
    windows 10激活
  • 原文地址:https://www.cnblogs.com/Geek-xiyang/p/10339981.html
Copyright © 2011-2022 走看看