1. 什么是代理服务器?
- 摘自百度百科:https://baike.baidu.com/item/http%E4%BB%A3%E7%90%86/7689519?fr=aladdin

- 代理服务器英文全称是Proxy Server,其功能就是代理网络用户去取得网络信息。形象的说:它是网络信息的中转站。在一般情况下,我们使用网络浏览器直接去连接其他Internet站点取得网络信息时,须送出Request信号来得到回答,然后对方再把信息以bit方式传送回来。
- 代理服务器是介于浏览器和Web服务器之间的一台服务器,有了它之后,浏览器不是直接到Web服务器去取回网页而是向代理服务器发出请求,Request信号会先送到代理服务器,由代理服务器来取回浏览器所需要的信息并传送给你的浏览器。而且,大部分代理服务器都具有缓冲的功能,就好象一个大的Cache,它有很大的存储空间,它不断将新取得数据储存到它本机的存储器上,如果浏览器所请求的数据在它本机的存储器上已经存在而且是最新的,那么它就不重新从Web服务器取数据,而直接将存储器上的数据传送给用户的浏览器,这样就能显著提高浏览速度和效率。
- 更重要的是:Proxy Server(代理服务器)是Internet链路级网关所提供的一种重要的安全功能,它的工作主要在开放系统互联( OSI )模型的会话层。
- 主要的功能有:
- 1.突破自身IP访问限制,访问国外站点(翻墙)。如:教育网、169网等网络用户可以通过代理访问国外网站。
- 2.访问一些单位或团体内部资源。如某大学FTP(前提是该代理地址在该资源的允许访问范围之内),使用教育网内地址段免费代理服务器,就可以用于对教育网开放的各类FTP下载上传,以及各类资料查询共享等服务。
- 3.突破中国电信的IP封锁。中国电信用户有很多网站是被限制访问的,这种限制是人为的,不同Serve对地址的封锁是不同的。所以不能访问时可以换一个国外的代理服务器试试。
- 4.提高访问速度。通常代理服务器都设置一个较大的硬盘缓冲区,当有外界的信息通过时,同时也将其保存到缓冲区中,当其他用户再访问相同的信息时, 则直接由缓冲区中取出信息,传给用户,以提高访问速度。
- 5.隐藏真实IP。上网者也可以通过这种方法隐藏自己的IP,免受攻击。
2. 代理的类型?
2.1. 按照协议分类
- 常用的代理类型有:ftp、http、https、socks、RTSP、POP3等代理类型。其中:
- HTTP代理和HTTPS代理: 能够代理客户机的HTTP访问,主要是代理浏览器访问网页,它的端口一般为80、8080、3128等。http访问http网站,https代理访问https网站:

- FTP代理: 能够代理客户机上的FTP软件访问FTP服务器,它的端口一般为21、2121。
- RTSP代理: 代理客户机上的Realplayer访问Real流媒体服务器的代理,其端口一般为554。
- POP3代理: 代理客户机上的邮件软件用POP3方式收发邮件,端口一般为110。使用方法参考文章:http://blog.youkuaiyun.com/zwq912318834/article/details/78014762
- SOCKS代理: SOCKS代理与其他类型的代理不同,它只是简单地传递数据包,而并不关心是何种应用协议,既可以是HTTP请求,也可以是HTTPS请求等,所以SOCKS代理服务器比其他类型的代理服务器速度要快得多。SOCKS代理又分为SOCKS4和SOCKS5,二者不同的是SOCKS4代理只支持TCP协议(即传输控制协议),而SOCKS5代理则既支持TCP协议又支持UDP协议(即用户数据包协议),还支持各种身份验证机制、服务器端域名解析等。SOCK4能做到的SOCKS5都可得到,但SOCKS5能够做到的SOCK4则不一定能做到,比如我们常用的聊天工具QQ在使用代理时就要求用SOCKS5代理,因为它需要使用UDP协议来传输数据。
注意:代理必须( IP + Port + http/https(socks4/5) )协议,三个字段一起配合使用,不能只用( IP + Port )两个字段。
2.2. 按照匿名度分类
- 从另一个角度来说,代理又可以分为三种,即高度匿名代理、普通匿名代理和透明代理。
- 高度匿名代理不改变客户机的请求,这样在服务器看来就像有个真正的客户浏览器在访问它,这时客户的真实IP是隐藏的,服务器端不会认为我们使用了代理。
- 普通匿名代理能隐藏客户机的真实IP,但会改编我们的请求信息,服务器端有可能会认为我们使用了代理(仅仅是可能而已,一般说来是没问题的),但其实这种代理的安全性可能比高度匿名代理更高,有的代理甚至会剥离客户机发送信息中的一部分,这样服务器端就根本探测不到我们所用的操作系统版本和浏览器版本。
- 第三种就是透明代理,它不但改编我们的请求信息,还会传送真实的IP地址。
2.3. 爬虫应该选择什么样的代理?
- 针对不需要用户登录,cookie验证的网站,一般选择动态高匿代理。
- 对于需要用户登录,身份认证的。一般选择静态IP
3. 代理资源从哪里来?
4. 购买的代理如何使用?
- 网上有很多方法告诉我们如何获取免费代理,但事实上免费代理的可用率非常低。如果是大型的爬虫项目,还是比较推荐使用收费的代理。而目前收费代理的提供方式一般是两种:
- 第一种:通过API链接的方式获取。
- 第二种:通过用户名,密码(隧道)+ 服务器地址,直接使用。
4.1. API接口模式
- 以讯代理为例:http://www.xdaili.cn/

- 使用定时器,每个一段时间就往List中填充相关的代理IP。其实从服务器拿到的动态高匿IP都是有时效性的,一般在1~3分钟不等。
- 嵌入在scrapy框架的middleware.py中
from scrapy import signals
import random
from myClawer.dictionary import useragent
import datetime
from scrapy import log
import threading
import requests
statisticProxyInfo = {
'getProxiesTime': 0,
'getProxiesSuccess': 0,
'getProxiesFail': 0,
'requestTotalCount': 0,
'requestproxyCount': 0,
'requestNoProxyCount': 0
}
proxies_Lst = []
TIMERPER = 5
proxies_repeat = {}
timerLst = []
def getProxiesFromXunAPI():
global proxies_repeat
xunProxyLst = []
APIUrl = "http://www.xdaili.cn/ipagent//privateProxy/applyStaticProxy?spiderId=f16617004ca945d19ae3ff8aff0a6b97&returnType=2&count=11"
head = {
"User-Agent": random.choice(useragent)}
try:
s = requests.session()
resp = s.get(url=APIUrl, headers=head)
statisticProxyInfo['getProxiesTime'] += 1
htmlJson = resp.json()
ERRORCODE = htmlJson['ERRORCODE']
RESULT = htmlJson['RESULT']
if (ERRORCODE == '0'):
statisticProxyInfo['getProxiesSuccess'] += 1
xunProxyLst.extend([f"{item['ip']}:{item['port']}" for item in RESULT])