有了自己的代理池才可以更加放心的采集数据了,否则总会遇到单个IP扫描频率过高而限制问题。接下来我们可以使用下面的代理池搭建属于自己的代理池(真正高速稳定的代理还是要花资金的,或购买VPS自建、或买代理服务).

预先说明:本文提及的代理池免费使用,并来源于网络提供,切记:代理虽好,可不要贪杯哦

搭建代理池的要求:使用Linux操作系统平台、haproxy做高可用、开源的spider_free_proxy项目做爬虫即socks服务维护。

构建代理池前必须对代理种类有个基本了解,透明、匿名代理啥意思?如何可以让服务器无法检测到你的真实的请求源主机地址?带着这些疑问,开始下面的内容吧。

关于代理的分类:

  • 按协议分类: HTTP、HTTPS、SOCKS4、SOCKS5、TOR(洋葱代理)
  • 按匿名程度: 透明、普通匿名、高匿名 , 匿名度检测方法可以通过获取请求头部信息判断。

通常SOCKS协议代理属于高匿名代理,不会知道源主机地址, 而HTTP协议代理要根据代理软件的配置情况决定。

在这里插入图片描述

透明代理(Transparent Proxy)

REMOTE_ADDR = Proxy IP
HTTP_VIA = Proxy IP
HTTP_X_FORWARDED_FOR = Your IP

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

匿名代理(Anonymous Proxy)

REMOTE_ADDR = proxy IP
HTTP_VIA = proxy IP
HTTP_X_FORWARDED_FOR = proxy IP

匿名代理比透明代理进步了一点:别人只能知道你用了代理,无法知道你是谁。

混淆代理(Distorting Proxies)

REMOTE_ADDR = Proxy IP
HTTP_VIA = Proxy IP
HTTP_X_FORWARDED_FOR = Random IP address

如上,与匿名代理相同,如果使用了混淆代理,别人还是能知道你在用代理,但是会得到一个假的IP地址,伪装的更逼真:-)

高匿代理(Elite proxy或High Anonymity Proxy)

REMOTE_ADDR = Proxy IP
HTTP_VIA = not determined
HTTP_X_FORWARDED_FOR = not determined

可以看出来,高匿代理让别人根本无法发现你是在用代理,所以是最好的选择。

代理是否携带你的真实IP主要看HTTP_X_FORWARDED_FOR选项字段中是否包含了你的真实IP。

X-Forwarded-For的格式: client, proxy1, proxy2
通常是个列表,这个client就是真实客户端IP地址,如果proxy1使用的是混淆代理,那么可以将X-Forwarded-For第一个值设置为随机值,这样就可以起到匿名的作用了,而这个第一层匿名代理最好是自己部署的或者自己认为可靠的。

匿名程度检测方法(实践上面介绍知识点)

首先我们使用nginx来配置一个自己用于测试的服务器环境(需要公网IP的,有条件的购买VPS,可以临时使用我的地址,恶意使用我会关闭这个检测请求的哦),在nginx配置文件中添加这样的配置:

    server {
        listen       80 default_server;
        listen       [::]:80 default_server;
        server_name  www.example.com;
        root         /www;

        # 代理检测添加内容1 : 开启代理头部信息分析
        real_ip_header X-Forwarded-For;
        real_ip_recursive  on;

        # 代理检测添加内容2 : 重写/ip请求
        rewrite ^/ip  /ip break;
        rewrite ^/xxx/.*  /xxx/ break;
        rewrite ^(.*)$  https://$host$1 permanent;   # 自动跳转https服务地址

        # 代理检测添加内容3 : 处理/ip请求
        location /ip {
            # 客户端IP地址检测
            return 200 "real_ip: $remote_addr X-Forwarded-For: $proxy_add_x_forwarded_for\n";
        }

配置好后,重启nginx服务。nginx服务会将/ip请求直接返回200 real_ip: $remote_addr X-Forwarded-For: $proxy_add_x_forwarded_for结果,不影响现有服务内容。

搭建好了检测环境后,可以进行代理匿名度检测了。

1. 检测HTTP代理匿名度

$ curl http://www.learnhard.cn/ip
$ curl --connect-timeout 10 -x http://103.153.2.7:8080 http://www.learnhard.cn/ip

Nginx服务器端检测返回结果为:

real_ip: 1.2.3.4 X-Forwarded-For: 1.2.3.4
real_ip : 103.153.2.7 X-Forwarded-For : 1.2.3.4, 103.153.2.7

结果可以看到,1.2.3.4(为了隐私此地址是我随机写的)这个地址是源请求主机的真实公网IP地址,通过代理访问后依然可以在X-Forwarded-For中获取到源请求的IP地址,因此这个代理是透明代理,这种代理很容易暴露个人真实IP地址,因此不建议使用的。

同理从HTTP代理匿名检测方法,检测到的高匿名代理才是更加可靠可用的,但是这样的免费代理还是很少的,而且稳定性也很差,如果使用HTTP代理还是自己搭建的好(购买ADSL拨号动态IP的VPS应运而生)。

我们再来看看使用tcpdump命令的抓包显示HTTP头部信息:

Hypertext Transfer Protocol
    GET /ip HTTP/1.1\r\n
        [Expert Info (Chat/Sequence): GET /ip HTTP/1.1\r\n]
        Request Method: GET
        Request URI: /ip
        Request Version: HTTP/1.1
    Host: www.learnhard.cn\r\n
    User-Agent: curl/7.66.0\r\n
    Accept: */*\r\n
    X-Proxy-ID: 662584610\r\n
    X-Forwarded-For: 1.2.3.4\r\n
    Via: 1.1 ::ffff:103.153.2.7 (Mikrotik HttpProxy)\r\n
    \r\n
    [Full request URI: http://www.learnhard.cn/ip]
    [HTTP request 1/1]
    [Response in frame: 9]

这里可以看到X-Forwarded-For字段携带了我们的真实IP地址1.2.3.4Via字段告诉服务器这条请求使用了103.153.2.7HTTP代理。

2. 检测SOCKS5代理匿名度

SOCKS5代理实现的软件很多,这里不进行具体举例了。想了解的可以上网搜索。

$ curl http://www.learnhard.cn/ip
$ curl --connect-timeout 10 -x socks5://127.0.0.1:1084 http://www.learnhard.cn/ip
real_ip: 103.153.2.7 X-Forwarded-For: 149.28.237.158, 103.153.2.7

Nginx服务器端检测返回结果为:

real_ip: 1.2.3.4 X-Forwarded-For: 1.2.3.4
real_ip : 101.32.116.112 X-Forwarded-For : 101.32.116.112

从返回结果可以看到,使用代理后,nginx检测到的IP请求是代理IP地址,没有携带真实的源请求IP地址。这就是高匿名代理,非常推荐使用的。
如果代理主机安全(不会有数据泄漏问题),那么nginx服务端是无法得知真正的请求是谁发出的。

我们再来看看使用tcpdump命令的抓包显示HTTP头部信息:

Hypertext Transfer Protocol
    GET /ip HTTP/1.1\r\n
        [Expert Info (Chat/Sequence): GET /ip HTTP/1.1\r\n]
        Request Method: GET
        Request URI: /ip
        Request Version: HTTP/1.1
    Host: www.learnhard.cn\r\n
    User-Agent: curl/7.71.1\r\n
    Accept: */*\r\n
    \r\n
    [Full request URI: http://www.learnhard.cn/ip]
    [HTTP request 1/1]
    [Response in frame: 12]

使用SOCKS5代理不会提供X-Forwarded-For字段的,也没有HTTP_VIA字段告诉服务器这个请求使用了代理。服务器会认为这个请求就是真实用户发出的(除非这个IP因为使用人太多而被标记为可疑IP)。

3. Tor代理匿名度

这个其实就不用多说了,这种多级代理的构建的匿名度是非常高的,而且每次请求的代理路径可以是不同的,想要真正的找到源头难度非常高。这里不做测试了。

总结

通过以上的验证,我们可以更加深入的理解代理的匿名程度及检测方法了,这对于我们自己搭建代理服务或者构建代理池是很有帮助的。

接下来,我们来看看有哪些开源产品搭建免费代理池。

开源代理池推荐

高可用高匿名的socks5代理池爬虫-spider_free_proxy

高可用是使用了haproxy软负载均衡,高匿名是全部使用socks5代理,而且免费开源。

  1. 使用haproxy软负载均衡,默认配置150个后端服务(服务配置越多各资源占用越多)。
  2. 使用的SOCKS5代理均为加密代理,也就是数据传输过程安全。
  3. 代理池更新过程通过爬虫调度任务自动爬取,自动检测可用性。
  4. 默认配置爬取地址均免费
  5. 爬虫只需要使用一个固定地址可以实现动态代理变更。

开源地址: spider_free_proxy ,该项目本人开发,喜欢的话可以一键三连

使用方法介绍

自动安装Anaconda3环境、Redis、socks5客户端工具还会自动安装haproxy实现负载均衡功能。

安装过程简单(Linux建议选择Ubuntu或CentOS):

git clone https://github.com/learnhard-cn/spider_free_proxy.git
cd spider_free_proxy
sh ./install.sh             # 安装基础Anaconda3环境,socks5客户端命令,haproxy软件。
sh ./config.sh              # 配置虚拟Python环境,安装依赖包,配置初始运行环境。

# 手动执行方法
./start.sh -p all  # 使用pyppetter方式使用无头浏览器爬虫
./start.sh -c all  # socks5代理可用性服务检测与启动管理

使用方法:

默认开放服务地址为127.0.0.1:1084,适合部署到本地Linux主机使用。
如果使用VPS(有公网IP)可以修改haproxy配置为0.0.0.0:1084,这样可以远程访问。

下面是使用示例:

$ curl -x socks5://127.0.0.1:1084 https://www.learnhard.cn/ip

具体使用哪一个IP地址交给了haproxy的均衡策略(默认:leastconn 最少连接策略)了,定制负载均衡策略可以阅读haproxy文档。

总结

开源产品可能还有很多,如果你有更好的方案或者产品,可以互相交流学习。

如果你对学习爬虫感兴趣可以阅读《虫师的江湖》这本书,这里有对Selenium、Appium、Scrapy以及Pyppeteer使用的教程,如果您没有看云帐号,可以点击此推广链接即可注册看云帐号

Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐