我们之前一直都在使用的urlopen,这是一个特殊的刀(也就是模块帮我们构建好的)。
但是基本的urlopen()方法不支持代理,饼干等其他的HTTP/HTTPS高级功能,所以要支持这些功能:
1。使用相差的处理程序处理器来创建特定功能的处理器对象,
2。然后通过urllib.request.build_opener()方法,创建自定义揭幕战对象
3。使用自定义的揭幕战对象,调用open()方法发送请求。
如果程序里所有的请求都使用自定义的刀,可以使用urllib.request.install_opener()将自定义的揭幕战对象定义为全局比赛,表示如果之后凡是调用urlopen,都将使用这开个刀(根据自己的需求来选择)
简单的自定义刀()
# !/usr/bin/python3 # - * -编码:utf - 8 - * __author__=奥硪卮濉? 进口urllib.request #构建一个HTTPHandler处理器对象,支持处理HTTP请求。 http_handler=urllib.request.HTTPHandler () # #构建一个HTTPSHandler处理器对象,支持处理HTTPS请求 # https_handler=urllib.request.HTTPSHandler () #调用urllib.request.build_opener()方法,创建支持处理HTTP请求的揭幕战对象 刀=urllib.request.build_opener (http_handler) #构建请求请求 请求=urllib.request.Request (“http://www.baidu.com/? #调用自定义揭幕战对象的open()方法,发送请求请求 响应=opener.open(请求) #获取服务器响应内容 html=response.read () 打印(html)
这种方式发送请求得到的结果,和使用urllib.request.urlopen()发送HTTP/HTTPS请求得到的结果是一样的。
如果在HTTPHandler()增加debuglevel=1参数,还会将调试日志打开,这样程序在执行的时候,会把收包和发包的报头在屏幕上自动打印出来,方便调度,有时可以省去抓包的工作。
#仅需要修改的代码部分: #构建一个HTTPHandler处理器对象,支持处理HTTP请求,同时开启调试日志,debuglevel值默认0 http_handler=urllib.request。HTTPHandler (debuglevel=1) #构建一个HTTPHSandler处理器对象,支持处理HTTPS请求,同时开启调试日志,debuglevel值默认0 https_handler=urllib.request。HTTPSHandler (debuglevel=1)
<强> ProxyHandler处理器(IP代理设置)强>
很多网站会检测某一段时间IP的访问次数(通过流量统计,系统日志等),如果某个IP访问次数多的不像正常的人,它会禁止这个IP的访问。
所以我们通常可以设置一些代理服务器,每隔一段时间换一个代理,就算IP被禁止,依然可以换个IP继续爬取。
urllib.request中通过ProxyHandler来设置使用代理服务器、下面代码说明如何使用自定义刀来使用代理:
# !/usr/bin/python3 # - * -编码:utf - 8 - * __author__=奥硪卮濉? ”“” ProxyHandler处理器(代理设置) 很多网站会检测某一段时间某个IP的访问次数(通过流量统计,系统日志等),如果 访问次数多的不像正常的人,它会禁止这个IP的访问。 所以我们可能通过设置一些代理服务器,每隔一段时间换一个代理IP,就算IP被禁 止,我们依然可以换个IP继续爬取。 ”“” 进口urllib.request #构建了两个代理处理程序,一个有代理IP,一个没有代理IP http_proxy_handler=urllib.request.ProxyHandler ({“http”:“222.33.192.238:8118”}) null_proxy_handler=urllib.request.ProxyHandler ({}) #定义一个代理开关 proxy_switch=True #根据代理开关是否拱形,使用不同的代理模式 #通过urllib.request.build_opener()方法使用这些代理处理程序对象,创建自定义揭幕战对象 如果proxy_switch: 刀=urllib.request.build_opener (http_proxy_handler) 其他: 刀=urllib.request.build_opener (null_proxy_handler) 请求=urllib.request.Request (“http://www.baidu.com/? # 1。如果这么写,只有使用opener.open()方法发送请求才使用自定义的代理,而urlopen()则不使用自定义代理。 响应=opener.open(请求) # 2。如果这么写,就是将刀应用到全局,之后所有的,不管是opener.open()还是urlopen()发送请求,都将使用自定义代理。 # urllib.request.install_opener(刀) #反应=urlopen(请求) html=response.read () 打印(html)
免费的开放代理获取基本没有什么成本,我们可以在一些代理网站上收集这些免费代理,测试后如果可以用,就把它收集起来用在爬虫上面。