代理的前世今生

引言

自己对代理认识不深,也只是会使用而已,由于最近想做一个代理池,于是查了很多资料,发现代理这个东西还是非常有趣的

代理是什么?

从编程上来看,requests只需要在请求里面加上proxies参数例如requests.get('http://www.baidu.com', proxies={'http': '127.0.0.1:3128'}),我们就能连上代理进行访问,由于requests包装了太多细节,我们无法知道用了代理和没有用代理的区别

接下来我们来看一下Python3的内库是如何使用代理的

  • 首先要申请一个ProxyHandlerfrom urllib import request
    proxy = request.ProxyHandler({‘http’: ‘127.0.0.1:3128’})

然后我们通过这个proxy创建一个opener,然后用opener打开页面,最后输出结果。

opener = request.build_opener(proxy)
resp = opener.open('http://www.baidu.com')
print(resp.read())

然后我们看一下如果没有使用代理的请求是什么

resp = request.urlopen('http://www.baidu.com')
print(resp.read())

你可以很清楚的看到,如果我们不需要代理,之前打开url就行,也就是说我们的请求,其实全部发给代理,交给代理了

这里就稍稍谈点感想了,以前经常在书上看到人歌颂互联网的伟大,但是自己一直不明白这个伟大在哪,以前一直从表象感受互联网,有了互联网,不用打开电视就可以看影片,不用去图书馆就可以看书,感觉互联网神奇的地方就是给自己带来方便,但是没有去互联网本身的架构的伟大,通过一根根网线交换器,无数主机“连”在了一起,构成了宏大的互联网,或许你通过浏览器打开的网站主机离你几百公里,但是你不要做飞机轮船,你直接在家里就能通过层层代理传递你的请求将千里之外的“敌将首级” 探入囊中。

互联网神奇的地方就是看起来各个部分非常分散,但是他们却能通过一根一根线紧密的联系起来,只有有“距离”的时候你才能感受到他的美丽

以前刚学习网站的时候,在本地调试的时候,你在本地跑一个web,直接打开浏览器访问,这时候我就有一种错觉,web就是两端,客户端和服务器端,在本地调试可以这样理解,但是一旦拿到互联网,这就是不完整的,完整的应该是客户端-代理端-服务器端,当然我们的代理端有时候可能是网关、路由器、交换机等等。

了解这些有什么用呢,因为我自己以前一直对代理没有什么很深理解,用爬虫的时候使用代理就不会被封IP,感觉代理是很BUG的东西,但其实代理很普通,而且无处不在,我们要想真正理解代理,就必须把它拖下圣坛。

代理其实很普通

前面我们知道代理其实很普通,但是要深入了解代理必须要先了解IP,IP是什么呢,IP就是互联网的身份证,要想在互联网上“混”,必须要有“身份”

那为什么我们要用代理呢,比如说假如你是未满18岁的小朋友,你想要买上网,你必须要借一张大人的身份证去上网,这个时候代理的作用就是帮用它的身份证帮你干事。

我觉得中国文化博大精深,其实一听代理这个词,我们就能知道代理是干什么用的。其实把代理吹得神乎其神没什么用,那些作用都是它的他自己瞎几把搞的,从我们客户端来看,代理就是服务端,了解这点非常重要,因为他能让我们把所以的事情都简化,而且从客户端来看,代理就是这样的

客户端、代理、 服务器三者之间的关系

前面我们已经谈了客户端和代理之间的关系,对于客户端来说,代理就是服务器端,我们啥都不管,把请求发给代理,相信它就是我们请求的服务器

对于代理来说,其实它自己最清楚,自己就是个代理,它必须要把请求转发给服务器,然后在把服务器的响应发给客户端,代理就是一个中介人,有的时候我们也可以把它看做一个双向中继,把请求传递一下,再传回来,所以在这三者之间,只有代理是个明白人,它必须清楚这次任务所以细节,所以有时候虽然说代理是安全的,但其实它也不安全,只要把代理攻克了就能了解到底是哪个家伙干的坏事,所以网上干坏事的人,一般都用很多个代理,层层代理,就算你攻克了一个,也找不到坏人

对于服务器来说,代理就是客户端,它只负责响应就行,对于代理和客户端来说都是一样的策略。但是时候很奇怪,服务器为什么知道你是个代理,原来全是代理自己的锅,我们细谈一下代理的分类

代理的分类

代理也分很多种,有的时候代理也不老实,把客户信息暴露了,这个时候我们就说它是小透明(透明代理),有的时候它不告诉你客户信息,但是告诉服务器我是个代理,我们就说它是匿名代理,但是有时候它连它自己是啥都不告诉你,它伪装成它是客户端,这个时候我们称它为高匿代理,所以这些代理根据暴露信息的不同可以分为这三种

  • 透明代理
  • 匿名代理
  • 高匿代理

当然我们最喜欢高匿代理,你可以把它当做你的分身,除了身份证不一样,两个人长得一模一样。

所以我们判断一个代理的类别,必须要检测它向服务器发的报文,所以在我项目FastProxyScan,我搭建了一个服务器,返回客户端向服务器请求头,主要是HTTP_X_FORWARDED_FOR和HTTP_VIA头来分别暴露客户端信息和代理端信息,所以我们只要请求头检测有没有这两个字段就可以完成检测,原理非常简单

在这里我介绍用Nginx高效返回检测信息

  location ~ ^/ip {
      default_type application/json;
      return 200 '{"REMOTE_ADDR":"$remote_addr","HTTP_VIA":"$http_via", "HTTP_X_FORWARDED_FOR": "$http_x_forwarded_for"}';
}

Nginx配置里面加上这个端口,我们只有请求/ip,就能直接从Nginx返回请求头信息,速度贼快

总结

当然网上还有很多对代理的分类,缓存代理,正向代理,反向代理,但是这些都是代理自己的额外功能,我们前面介绍的代理都是傻呼呼,客户端要什么,它就做什么,这些如缓存代理高级的代理就是很聪明,它的目的就是最快返回客户端需求,比如说虽然说这个傻客户端傻乎乎一个请求请求了几十遍还没记住,代理自己拿个小本子记好,你下次来,正好对上号,直接抄给你,不用再跑几千里去拿了。但是其实本质上它还是逃不出上面的分类,只不过它有的自己的不同罢了。

转载请注明出处:https://stgod.com/3830/