IP代理池理解

背景

之前一直疑惑爬虫使用IP代理的原理, 今天正好有时间,系统了解IP代理的基本原理

定义

当客户端对服务器端提出请求时,此请求会被送到代理服务器,代理服务器转发用户请求到 实际服务器端。

即传输方式为 client ——-> proxy_server ——> real_server

使用方式

bash 下curl 使用

1
2
curl -x {代理服务器IP}:{代理服务器端口} 实际网络请求url
curl -x http://119.176.96.134:9999 https://www.ipip.net/ip.html

php 的curl使用代理服务器:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
<?php 
    
    function proxy_demo() {
        $cookie = '';
        $url = "https://www.ipip.net/ip.html";

        //代理url
        $proxy_url = "119.176.96.134";
        //代理端口
        $proxy_port = "9999";

        $ch = curl_init();
        curl_setopt($ch, CURLOPT_URL, $url);
        $timeout = 3;
        curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, $timeout);
        curl_setopt($ch, CURLOPT_TIMEOUT, $timeout);
        curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE);
        curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
        curl_setopt($ch, CURLOPT_HEADER, 0);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
        curl_setopt($ch, CURLOPT_ENCODING, 'UTF-8');

        //location属性就代表重定向的地址。如果curl爬取过程中,设置CURLOPT_FOLLOWLOCATION为true,则会跟踪爬取重定向页面,否则,不会跟踪重定向页面。
        curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
        //proxy的IP
        curl_setopt($ch, CURLOPT_PROXY, $proxy_url); //代理服务器地址
        //proxy的port
        curl_setopt($ch, CURLOPT_PROXYPORT, $proxy_port); //代理服务器端口

        curl_setopt($ch, CURLOPT_HTTPHEADER, array(
            "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3",
            "Accept-Encoding: gzip, deflate, br",
            "Accept-Language: zh-CN,zh;q=0.9,en;q=0.8",
            "Cache-Control: no-cache",
            "Connection: keep-alive",
            "Cookie:" . '',
            "Host: www.ipip.net",
            "Pragma: no-cache",
            "Referer: https://www.ipip.net/",
            "User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.100 Safari/537.36",
        ));

        $result = curl_exec($ch);
        curl_close($ch);
        return $result;
    }

    function main()
    {

        $result = proxy_demo();
        echo $result.PHP_EOL;
        //curl -x http://106.15.225.74:8118 https://www.ipip.net/ip.html
        // curl -x http://119.176.96.134:9999 https://www.ipip.net/ip.html
    }

    main();

?>

寻找IP代理服务器

大量网站提供免费IP代理,但是不稳定, 所以这些网站还会提供一些付费服务, 类似网站有

  1. 快代理
  2. 西刺代理
  3. 66ip

代理服务器区别

代理类型一共能分为四种:透明代理、匿名代理、高匿代理、混淆代理

安全程度:高匿->混淆->匿名->透明

代理类型主要取决于代理服务器端的配置。不同配置会形成不同的代理类型(后续章节会使用squid进行实际演练操作),

代理类型区别, 主要是服务器端接收的 REMOTE_ADDR , HTTP_VIA,HTTP_X_FORWARDED_FOR来共同决定

REMOTE_ADDR:

REMOTE_ADDR表示客户端的IP,但是它的值不是由客户端提供的,而是服务器根据客户端的 IP 指定的。如果使用浏览器直接访问某个网站,那么网站的web服务器(Nginx、Apache等)就会把REMOTE_ADDR设为客户端的IP地址。我们给浏览器设置代理,我们访问目标网站的请求会先经过代理服务器,然后由代理服务器将请求转化到目标网站。那么网站的 web 服务器就会把 REMOTE_ADDR 设为代理服务器的IP

X-Forwarded-For(XFF):

​X-Forwarded-For是一个HTTP扩展头部,用来表示HTTP请求端真实 IP。当客户端使用了代理时,web 服务器就不知道客户端的真实IP地址。为了避免这个情况,代理服务器通常会增加一个 X-Forwarded-For 的头信息,把客户端的 IP 添加到头信息里面。X-Forwarded-For 请求头格式如下: ​

1
2
3
​X-Forwarded-For: client, proxy1, proxy2
​
​即记录经过的代理服务器

​ ​

HTTP_VIA

viaHTTP协议里面的一个header,记录了一次HTTP请求所经过的代理和网关,经过1个代理服务器,就添加一个代理服务器的信息,经过2个就添加2个。 ​

代理类型之透明代理(Transparent Proxy):

对应的参数类型设定如下:

1
2
3
REMOTE_ADDR = PROXY IP
HTTP_VIA = PROXY IP
HTTP_X_FORWARDED_FOR = YOUR IP

透明代理虽然可以直接“隐藏”客户端的IP地址,但是还是可以从HTTP_X_FORWARDED_FOR来查到客户端的IP地址。

代理类型之匿名代理(Anonymous Proxy):

1
2
3
REMOTE_ADDR = PROXY IP
HTTP_VIA = PROXY IP
HTTP_X_FORWARDED_FOR = PROXY IP

匿名代理能提供隐藏客户端 IP 地址的功能。使用匿名代理,服务器能知道客户端使用用了代理,但无法知道客户端真实 IP 地址。

代理类型之混淆代理(Distorting Proxy):

1
2
3
REMOTE_ADDR = PROXY IP
HTTP_VIA = PROXY IP
HTTP_X_FORWARDED_FOR = RANDOM IP ADDRESS

与匿名代理的原理相似,但是会伪装得更逼真。如果客户端使用了混淆代理,服务器还是能知道客户端在使用代理,但是会得到一个假的客户端 IP 地址。

代理类型之高匿代理(Elite Proxy 或 High Anonymity Proxy):

1
2
3
REMOTE_ADDR = PROXY IP
HTTP_VIA = NOT DETERMINED #未定义
HTTP_X_FORWARDED_FOR = NOT DETERMINED #未定义

高匿代理既能让服务器不清楚客户端是否在使用代理,也能保证服务器获取不到客户端的真实 IP地址。

综上所属, 高匿代理 会伪装成正常IP请求, 是最优方案。

PHP实现 代理方式

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
if(!empty($_SERVER['HTTP_VIA']))    //使用了代理
{
    if(!isset($_SERVER['HTTP_X_FORWARDED_FOR']))
    {
        //Anonymous Proxies    普通匿名代理服务器

        //代理IP地址为 $_SERVER['REMOTE_ADDR']

   }
   else
   {
        //Transparent Proxies 透明代理服务器
        //代理IP地址为 $_SERVER['REMOTE_ADDR']
        //真实ip地址为 $_SERVER['HTTP_X_FORWARDED_FOR']
   }
}
else    //没有代理或者是高匿名代理
{
    //真实ip地址为 $_SERVER['REMOTE_ADDR']
}

搭建自己的IP代理服务器

咨询公司内小伙伴, 确认公司IP代理使用两种方式,一种是自由的IP代理池, 一种是买的IP代理服务。 如果想使用免费IP代理, 就需要自己搭建IP代理池。找到一个golang的实现

https://github.com/henson/proxypool

其他

如果想抓取特殊网页, 需要使用PhantomJS, webdirver方式。后续详细讲解

参考文章

  1. 阿布云IP代理
  2. 代理IP概念理解
  3. php判断是否使用IP代理
  4. v2ex维护爬虫代理池