代理的原理及类型总结

本文介绍了代理的基本原理,代理在Python爬虫中的作用,以及根据匿名程度分类的代理类型,包括透明代理、匿名代理和高匿名代理。通过示例说明了在Python中如何设置代理,并提到了代理的获取、验证和使用代理库的重要性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

个人理解:
最近迷上了python爬虫,想来这还是我最初接触python的目的之一。在开始爬虫前,有必要要先了解一下代理,因为没有代理的爬虫,就感觉是一只死虫子。现在各大中小型网站基本都有反爬虫措施,而代理是绕过这些限制最有效的方法之一。

0x00 代理原理

代理实际上指的是代理服务器(proxy sever),他的功能是代理用户去获得网络信息。形象地说,他是网络信息的中转站。在我们正常访问一个网站时,时发送了请求跟Web服务器,Web服务器把相应传回给我们。如果设置代理,实际上是在本机和服务器之间搭了一个桥,此时本机不是直接向web服务器发送请求,而是向代理服务器发送请求,然后代理服务器再发送给web服务器,接着w代理服务器把web服务器返回的相应转发给本机,这样我们就可以正常访问网页。但这个过程服务器识别出的IP不再是我们本机的IP,就实现了IP伪装,这就是代理原理。

0x01 代理的作用

  1. 突破自身IP访问限制,访问一些平时不能访问的站点

  2. 访问一些单位或团体内部资源,比如使用教育网内地址段免费代理服务器,就可以用于对教育网开放的各类FTP下载上传,以及各类资料查询共享等服务。

  3. 提高访问速度:通常代理服务器都设置一个较大的硬盘缓冲区,当有外界的信息通过时,同时也将其保存到缓冲区中,当其他用户再访问相同的信息时,则直接由缓冲区中取出信息,传给用户,以提高访问速度。

  4. 隐藏真实IP:上网者也可以通过这种方法隐藏自己的IP,免受攻击。对于爬虫来说,我们用代理就是为了隐藏自身IP,防止自身的IP被封锁。

0x02 根据匿名程度分类

正常访问头
REMOTE_ADDR = 真实IP
HTTP_VIA = 空值或无此头
HTTP_X_FORWARDED_FOR = 空值或无此头
透明代理(Transparent Proxies):目标服务器能够检测到真实IP。

使用透明代理,对方服务器可以知道你使用了代理,并且知道你的真实IP。透明代理访问对方服务器所带的HTTP头信息如下:

REMOTE_ADDR = 代理服务器IP
HTTP_VIA = 代理服务器IP
HTTP_X_FORWARDED_FOR = 真实IP

透明代理将真实IP发送给了对方服务器,因此无法达到隐藏身份的目的

(普通)匿名代理(Anonymous Proxies)

对方服务器无法检测到真实IP,但能够检测到使用了代理。匿名代理访问对方服务器所带的HTTP头信息如下:

REMOTE_ADDR = 代理服务器IP
HTTP_VIA = 代理服务器IP
HTTP_X_FORWARDED_FOR = 代理服务器IP

匿名代理隐藏了你的真实IP,但是想对方透漏了你试试用代理服务器访问他们的。

高匿名代理(High Anonymity Proxies-Elite proxies)目标服务器无法检测到你在使用代理

高匿名代理访问对方服务器所带HTTP头信息如下:

REMOTE_ADDR = 代理服务器IP
HTTP_VIA 不显示
HTTP_X_FORWARDED_FOR 不显示

高匿名代理隐藏了真实IP,同事访问对象也不知道你使用了代理,因此隐蔽度最高。但是在检测严格的情况下,即使没有HTTP_VIAHTTP_X_FORWARDED_FOR头,如果存在HTTP_PROXY_CONNECTION头,也会被认为是在使用普通匿名代理。该类型的代理非常适用数据采集。

0x03 代理的使用(以python脚本为例)

一、 在使用python请求网页内容时,可以添加代理,如下

下面是使用requests支持代理的代码:

import requests
response = requests.get(url,proxies={"http":"127.0.0.1:8080}, header, timeout=5)  
  • 127.0.0.1:8080为使用本地代理
  • 设置timeout是因为代理一般经常失效,尤其是使用网上抓取的免费代理,适当的timeout可以提高采集信息效率。

使用代理时,代理方并不会给你添加User-Agent等请求头信息,所以可以自定义一些请求头,也是应对一些反爬虫措施。

import random
import requests
user_agent_list = [
	{'Mozilla/5.0(compatible;MSIE9.0;WindowsNT6.1;Trident/5.0)'},
    {'Mozilla/4.0(compatible;MSIE8.0;WindowsNT6.0;Trident/4.0)'},
    {'Mozilla/4.0(compatible;MSIE7.0;WindowsNT6.0)'},
    {'Opera/9.80(WindowsNT6.1;U;en)Presto/2.8.131Version/11.11'},
    {'Mozilla/5.0(WindowsNT6.1;rv:2.0.1)Gecko/20100101Firefox/4.0.1'},
    {'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.1 (KHTML, like Gecko) Chrome/21.0.1180.71 Safari/537.1 LBBROWSER'},
    {'Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; QQDownload 732; .NET4.0C; .NET4.0E)'},
    {'Mozilla/5.0 (Windows NT 5.1) AppleWebKit/535.11 (KHTML, like Gecko) Chrome/17.0.963.84 Safari/535.11 SE 2.X MetaSr 1.0'},
    {'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Maxthon/4.4.3.4000 Chrome/30.0.1599.101 Safari/537.36'},
    {'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/38.0.2125.122 UBrowser/4.0.3214.0 Safari/537.36'}
]
referer_list = [
	{'http://xxx.com'},
	{'http://xxx.com'},
	{'http://xxx.com'}
]
header = {
	'User-Agent':random.choice(user_agent_list),
	'Referer':random.choice(referer_list)
}
url = "采集信息的网址,该网址可通过分析网站源码格式读取一系列网址,在进行遍历"
response = requests.get(url=url,header=header,proxies={'http':'127.0.0.1:8080},timeout=5)  

二、 使用代理

上文中使用的127.0.0.1:8080为本地代理,需要更换为高匿代理。在正常情况下,1分钟内即可浏览一个网页,所以在代理ip池足够大的情况下,一个ip只使用不到一分钟(其实测试网上免费代理的有效期也就1分钟),所以需要动态代理池进行持续更新。

可以通过简单地python代码到网上获取免费代理ip,以西刺代理为例

import requests
import random
import re

url = 'https://www.xicidaili.com/nn'
headers = {"User-Agent":"Mozilla/5.0 (Windows NT 6.3; WOW64; rv:27.0) Gecko/20100101 Firefox/27.0"}
response = requests.get(url=url, headers=headers) #该网站不加headers属性头无法访问
text = response.text
print text
regip = r'<td>(\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})</td>\s*?<td>(\d*)</td>'
matcher = re.compile(regip)
ipstr = re.findall(matcher,text)
ip_list = []
print ipstr
for ipport in ipstr:
    ip_list.append(ipport[0] + ':' + ipport[1])
ip = random.choice(ip_list)

上述代码使用了re正则表达式匹配了源码中的ip格式,也可是使用BeautifulSoup进行匹配,更加简单明了。

from bs4 import BeautifulSoup;
import requests
import random

url = 'http://www.xicidaili.com/nn/'
headers = {"User-Agent":"Mozilla/5.0 (Windows NT 6.3; WOW64; rv:27.0) Gecko/20100101 Firefox/27.0"}
html = requests.get(url=url, headers=headers).text
soup = BeautifulSoup(html, 'lxml')
ips = soup.find(id='ip_list').find_all('tr')
ip_list = []
for i in range(1, len(ips)):
    ip_info = ips[i]
    tds = ip_info.find_all('td')
    ip_list.append(tds[1].text + ':' + tds[2].text)
ip = random.choice(ip_list)

然而,还需要实时检验代理ip的有效性进行更新删除,而这时使用普通文档存储功能不足,所以有必要使用数据库进行实时更新。学习了一下大牛写的ip代理池python爬虫代理IP池,在配置环境时依赖包解决有问题,后期处理好之后再来记录。

代理检测接口

浏览器中访问即可显示当前使用的代理类型。
http://proxies.site-digger.com/proxy-detect/
http://icanhazip.com/

匿名代理网站

以下代理网站均来自于网上搜索的代理,还未使用:

k快代理
西刺免费代理IP
云代理
无忧代理
66免费代理
IP海
大象代理
米扑代理
站大爷
讯代理
89免费代理
开心代理

参考

使用高匿代理IP怎样完全不暴露本机身份?
数据采集爬虫ip代理基本原理
免费代理ip网站总结
哪种代理适合用于Web数据采集
数据采集爬虫ip代理基本原理-飞蚁代理
Python爬虫使用动态代理

================================================================================

小白成长记,大佬请指点。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值