ProxyHandler处理器(代理设置)

我们在做爬虫的过程中经常会遇到这样的情况,最初爬虫正常运行,正常抓取数据,一切看起来都是那么美好,然而一杯茶的功夫可能就会出现错误,比如403 Forbidden,这时候打开网页一看,可能会看到“您的IP访问频率太高”这样的提示。出现这种现象的原因是网站采取了一些反爬虫措施。比如,服务器会检测某个IP在单位时间内的请求次数,如果超过了这个阈值,就会直接拒绝服务,返回一些错误信息,这种情况可以称为封IP。

既然服务器检测的是某个IP单位时间的请求次数,那么借助某种方式来伪装我们的IP,让服务器识别不出是由我们本机发起的请求,不就可以成功防止封IP了吗?

一种有效的方式就是使用代理,后面会详细说明代理的用法。在这之前,需要先了解下代理的基本原理,它是怎样实现IP伪装的呢?

 

基本原理:

代理实际上指的就是代理服务器,英文叫作proxy server,它的功能是代理网络用户去取得网络信息。形象地说,它是网络信息的中转站。在我们正常请求一个网站时,是发送了请求给Web服务器,Web服务器把响应传回给我们。如果设置了代理服务器,实际上就是在本机和服务器之间搭建了一个桥,此时本机不是直接向Web服务器发起请求,而是向代理服务器发出请求,请求会发送给代理服务器,然后由代理服务器再发送给Web服务器,接着由代理服务器再把Web服务器返回的响应转发给本机。这样我们同样可以正常访问网页,但这个过程中Web服务器识别出的真实IP就不再是我们本机的IP了,就成功实现了IP伪装,这就是代理的基本原理

 

代理的作用:

那么,代理有什么作用呢?我们可以简单列举如下。

 

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

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

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

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

使用代理IP,这是爬虫/反爬虫的第二大招,对于爬虫来说,由于爬虫爬取速度过快,在爬取过程中可能遇到同一个IP访问过于频繁的问题,此时网站就会让我们输入验证码登录或者直接封锁IP,这样会给爬取带来极大的不便。通常这种反爬虫手段也是最好用的。

 

很多网站会检测某一段时间某个IP的访问次数(通过流量统计,系统日志等),如果访问次数多的不像正常人,它会禁止这个IP的访问。

 

所以我们可以设置一些代理服务器,每隔一段时间换一个代理,就算IP被禁止,依然可以换个IP继续爬取。

 

常见的代理分类:

1.根据协议划分:

FTP代理服务器:主要用于访问FTP服务器,一般有上传、下载的功能以及缓存的功能,端口号一般为21,2121等。

HTTP代理服务器:主要用于访问网页,一般有内容过滤和缓存的功能,端口号一般为80、8080、3128等

SSL/TLS代理:主要能用于访问加密的网站,一般有SSL或者TLS加密功能

SOCKS代理:只是单纯的用于传输数据包,不关心具体的协议用法,速度快、有缓存功能,端口号一般为1080

 

2.根据匿名内容划分:

 

高度匿名代理:会将数据包原封不动的转发,在服务器看来就好像真的是一个普通的用户短在访问,而记录的IP就是代理服务器的IP

 

普通匿名代理:会在数据包上做一些改动,服务端上有可能发现这个是代理服务器,也有一定的几率追查到客户端的真实IP,代理服务器通常会加入HTTP头有HTTP_VIA和HTTP_X_FORWARDED_FOR.

 

透明代理:不但改动了数据包,还会告诉服务器客户端的真实IP,这种代理除了用缓存技术提高浏览器速度。能用内容过滤提高安全性之外,并没有其他作用。

 

间谍代理:指的是组织和个人创建的用于记录用户传输的数据,然后进行研究,控制等目的的代理服务器。

 

Urllib (urllib2)中通过ProxyHandler来设置使用代理服务器,下面代码说明如何使用自定义opener来使用代理:

 


Python3  中代码如下:

#-*- coding:utf-8 -*-

import urllib.request

 

# 构建了两个代理Handler,一个有代理IP,一个没有代理IP(这个IP是我从免费IP代理网站获取的,如果你使用的时候不能用了,说明代理已失效,可以重新寻找一个)

httpproxy_handler = urllib.request.ProxyHandler({'http':'60.218.112.112:80'})

nullproxy_handler = urllib.request.ProxyHandler({})

 

#定义一个代理开关(设置为False时使用的是没有代理的效果,可以对比一下)

proxySwitch = True

 

# 通过urllib.request.build_opener()方法使用这些代理Handler对象,

# 创建自定义opener对象

# 根据代理开关是否打开,使用不同的代理模式

if proxySwitch: 

    opener = urllib.request.build_opener(httpproxy_handler)

else:

    opener = urllib.request.build_opener(nullproxy_handler)

 

request = urllib.request.Request('http://www.baidu.com/')

 

# 1. 如果这么写,只有使用opener.open()方法发送请求才使用自定义的代理

#,而urlopen()则不使用自定义代理。

response = opener.open(request)

print(response.getheader('Server'))

 

# 2. 如果这么写,就是将opener应用到全局,之后所有的,

# 不管是opener.open()还是urlopen() 发送请求,都将使用自定义代理。

# 将opener定义为全局的

# urllib.request.install_opener(opener)

# response = urlopen(request)

 

print(response.read())

 

实现代码如下:

 

 


urllib2中通过ProxyHandler来设置使用代理服务器,下面代码说明如何使用自定义opener来使用代理:

 

import urllib2

 

# 构建了两个代理Handler,一个有代理IP,一个没有代理IP

httpproxy_handler = urllib2.ProxyHandler({"http" : "60.218.112.112:80"})

nullproxy_handler = urllib2.ProxyHandler({})

 

proxySwitch = True #定义一个代理开关(设置为False时使用的是没有代理的效果,可以对比一下)

 

# 通过 urllib2.build_opener()方法使用这些代理Handler对象,创建自定义opener对象

# 根据代理开关是否打开,使用不同的代理模式

if proxySwitch:

opener = urllib2.build_opener(httpproxy_handler)

else:

opener = urllib2.build_opener(nullproxy_handler)

 

request = urllib2.Request("http://www.baidu.com/")

 

# 1. 如果这么写,只有使用opener.open()方法发送请求才使用自定义的代理,而urlopen()则不使用自定义代理。

response = opener.open(request)

 

# 2. 如果这么写,就是将opener应用到全局,之后所有的,不管是opener.open()还是urlopen() 发送请求,都将使用自定义代理。

# urllib2.install_opener(opener)

# response = urlopen(request)

 

print response.read()

 


 

那么我们工作中获取代理的途径有哪些呢?

免费的开放代理获取基本没有成本,我们可以在一些代理网站上收集这些免费代理,测试后如果可以用,

就把它收集起来用在爬虫上面。

 

免费短期代理网站举例(

免费的代理IP大多数情况下只有极少部分能够使用

,这些免费开放代理一般会有很多人都在使用,而且代理有寿命短,速度慢,匿名度不高,HTTP/HTTPS支持不稳定等缺点(免费没好货)。

所以,专业爬虫工程师或爬虫公司会使用高品质的私密代理,这些代理通常需要找专门的代理供应商购买,再通过用户名/密码授权使用(舍不得孩子套不到狼)。

):

 

 

另外各大代理IP的平台对比网址可做如下参考:

https://cuiqingcai.com/5094.html

 

当然如果爬取数据过程中,我们使用的IP被封掉后,我们就需要更换IP了

如果代理IP足够多,我们就可以创建一个简单的数组,随机选择一个IP代理取访问网站:

#-*- coding:utf-8 -*-

import urllib.request

import random

 

proxy_list = [

    {'http':'111.170.105.230:61234'},

    {'http':'60.218.112.112:80'},

    {'http':'60.177.227.195:18118'},

    {'http':'218.72.109.175:18118'},

    {'http':'49.79.195.51:61234'},

    {'http':'27.209.251.182:61234'},

    {'http':'183.159.88.211:18118'},

]

 

#随机选择一个代理

proxy = random.choice(proxy_list)

#使用选择的代理构建代理处理器对象

httpproxy_handler = urllib.request.ProxyHandler(proxy)

opener = urllib.request.build_operer(httpproxy_handler)

request = urllib.request.Request('http://www.baidu.com/')

response = opener.open(request)

print(response.read())

 

编辑器中代码如下图所示

 


 

Python2下具体代码如下:

import urllib2

import random

 

proxy_list = [

    {'http':'111.170.105.230:61234'},

    {'http':'60.218.112.112:80'},

    {'http':'60.177.227.195:18118'},

    {'http':'218.72.109.175:18118'},

    {'http':'49.79.195.51:61234'},

    {'http':'27.209.251.182:61234'},

    {'http':'183.159.88.211:18118'},

]

# 随机选择一个代理

proxy = random.choice(proxy_list)

# 使用选择的代理构建代理处理器对象

httpproxy_handler = urllib2.ProxyHandler(proxy)

opener = urllib2.build_opener(httpproxy_handler)

request = urllib2.Request("http://www.baidu.com/")

response = opener.open(request) print response.read()

  • 2
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在Python中设置代理需要使用urllib库中的ProxyHandler类。以下是设置代理的示例代码: ```python import urllib.request # 设置代理服务器 proxy_handler = urllib.request.ProxyHandler({'http': 'http://127.0.0.1:8080', 'https': 'https://127.0.0.1:8080'}) # 创建opener对象,包含代理信息 opener = urllib.request.build_opener(proxy_handler) # 使用opener发送请求 response = opener.open('https://www.example.com') # 打印响应内容 print(response.read()) ``` 在上面的示例中,我们首先创建了一个ProxyHandler对象并指定了http和https协议的代理服务器地址。然后使用该对象创建了一个opener对象并发送请求。由于opener对象包含了代理信息,因此请求会经过代理服务器并返回响应。最后我们打印了响应内容。 需要注意的是,如果你使用的是私人代理服务器,你需要提供代理服务器的用户名和密码。可以通过如下代码设置代理服务器的认证信息: ```python import urllib.request # 设置代理服务器认证信息 proxy_auth_handler = urllib.request.ProxyBasicAuthHandler() proxy_auth_handler.add_password('realm', 'host', 'username', 'password') # 设置代理服务器 proxy_handler = urllib.request.ProxyHandler({'http': 'http://127.0.0.1:8080', 'https': 'https://127.0.0.1:8080'}) # 将认证信息和代理信息组合成opener对象 opener = urllib.request.build_opener(proxy_handler, proxy_auth_handler) # 使用opener发送请求 response = opener.open('https://www.example.com') # 打印响应内容 print(response.read()) ``` 在上面的示例中,我们创建了一个ProxyBasicAuthHandler对象并使用add_password()方法设置代理服务器的认证信息。然后将该对象与之前创建的ProxyHandler对象一起传递给build_opener()方法创建opener对象。最后发送请求并打印响应内容。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值