有了自己的代理池才可以更加放心的采集数据了,否则总会遇到单个IP扫描频率过高而限制问题。接下来我们可以使用下面的代理池搭建属于自己的代理池(真正高速稳定的代理还是要花资金的,或购买VPS自建、或买代理服务).
预先说明:本文提及的代理池免费使用,并来源于网络提供,切记:代理虽好,可不要贪杯哦。
搭建代理池的要求:使用Linux操作系统平台、haproxy做高可用、开源的spider_free_proxy项目做爬虫即socks服务维护。
构建代理池前必须对代理种类有个基本了解,透明、匿名代理啥意思?如何可以让服务器无法检测到你的真实的请求源主机地址?带着这些疑问,开始下面的内容吧。
通常SOCKS
协议代理属于高匿名代理,不会知道源主机地址, 而HTTP
协议代理要根据代理软件的配置情况决定。
REMOTE_ADDR = Proxy IP
HTTP_VIA = Proxy IP
HTTP_X_FORWARDED_FOR = Your IP
透明代理虽然可以直接“隐藏”你的IP地址,但是还是可以从HTTP_X_FORWARDED_FOR
来查到你是谁。
REMOTE_ADDR = proxy IP
HTTP_VIA = proxy IP
HTTP_X_FORWARDED_FOR = proxy IP
匿名代理比透明代理进步了一点:别人只能知道你用了代理,无法知道你是谁。
REMOTE_ADDR = Proxy IP
HTTP_VIA = Proxy IP
HTTP_X_FORWARDED_FOR = Random IP address
如上,与匿名代理相同,如果使用了混淆代理,别人还是能知道你在用代理,但是会得到一个假的IP地址,伪装的更逼真:-)
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
结果,不影响现有服务内容。
搭建好了检测环境后,可以进行代理匿名度检测了。
$ 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.4
,Via
字段告诉服务器这条请求使用了103.153.2.7
HTTP代理。
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)。
这个其实就不用多说了,这种多级代理的构建的匿名度是非常高的,而且每次请求的代理路径可以是不同的,想要真正的找到源头难度非常高。这里不做测试了。
通过以上的验证,我们可以更加深入的理解代理的匿名程度及检测方法了,这对于我们自己搭建代理服务或者构建代理池是很有帮助的。
接下来,我们来看看有哪些开源产品搭建免费代理池。
高可用是使用了
haproxy
软负载均衡,高匿名是全部使用socks5代理,而且免费开源。
haproxy
软负载均衡,默认配置150个后端服务(服务配置越多各资源占用越多)。免费
。开源地址: 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使用的教程,如果您没有看云帐号,可以点击此推广链接即可注册看云帐号。