Python处理程序处理器和自定义刀原理详解

  

我们之前一直都在使用的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)      

免费的开放代理获取基本没有什么成本,我们可以在一些代理网站上收集这些免费代理,测试后如果可以用,就把它收集起来用在爬虫上面。

Python处理程序处理器和自定义刀原理详解