个人理解:
最近迷上了python爬虫,想来这还是我最初接触python的目的之一。在开始爬虫前,有必要要先了解一下代理,因为没有代理的爬虫,就感觉是一只死虫子。现在各大中小型网站基本都有反爬虫措施,而代理是绕过这些限制最有效的方法之一。
0x00 代理原理
代理实际上指的是代理服务器(proxy sever),他的功能是代理用户去获得网络信息。形象地说,他是网络信息的中转站。在我们正常访问一个网站时,时发送了请求跟Web服务器,Web服务器把相应传回给我们。如果设置代理,实际上是在本机和服务器之间搭了一个桥,此时本机不是直接向web服务器发送请求,而是向代理服务器发送请求,然后代理服务器再发送给web服务器,接着w代理服务器把web服务器返回的相应转发给本机,这样我们就可以正常访问网页。但这个过程服务器识别出的IP不再是我们本机的IP,就实现了IP伪装,这就是代理原理。
0x01 代理的作用
-
突破自身IP访问限制,访问一些平时不能访问的站点
-
访问一些单位或团体内部资源,比如使用教育网内地址段免费代理服务器,就可以用于对教育网开放的各类FTP下载上传,以及各类资料查询共享等服务。
-
提高访问速度:通常代理服务器都设置一个较大的硬盘缓冲区,当有外界的信息通过时,同时也将其保存到缓冲区中,当其他用户再访问相同的信息时,则直接由缓冲区中取出信息,传给用户,以提高访问速度。
-
隐藏真实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_VIA
和HTTP_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爬虫使用动态代理
================================================================================