Urllib和URLError异常处理(2) 代理服务器设置
有时候使用同一个IP去爬同一个网站上的网页, 久了之后会被该网站屏蔽. 使用代理会解决这个问题.
代理服务器寻找
代理服务器网站
在网站中, 尽量学着验证时间比较短的, 新的代理IP地址.
程序编写 import urllib.request def use_proxy (proxy_addr,url) : """use proxy :returns: data """ try : proxy = urllib.request.ProxyHandler({'http' :proxy_addr}) opener = urllib.request.build_opener(proxy,urllib.request.HTTPHandler) 参数是类 urllib.request.install_opener(opener) data = urllib.request.urlopen(url).read() except Exception as reason: print(reason) finally : if 'data' in locals(): return data proxy_addr = input('输入代理IP:端口 : ' ) url = input('输入要代理的网址 : ' ) data = use_proxy(proxy_addr,url) save_file = open('/mnt/c/Users/Hox/Desktop/save.html' ,'wb' ) save_file.write(data) save_file.close()
DebugLog
有时候, 我们希望在程序运行的过程中, 边运行边打印调试日志.
分别使用urllib.request.HTTPHandler()和urllib.request.HTTPSHandler() 将debuglevel设置为1.
使用urllib.request.build_opener()创建自定义的opener对象, 并使用1)中设置的值作为参数
用urllib.request.build_opener()创建全局默认的opener对象
进行后续操作.
import urllib.requesthttphd = urllib.request.HTTPHandler(debuglevel=1 ) httpshd = urllib.request.HTTPSHandler(debuglevel=1 ) opener = urllib.request.build_opener(httphd,httpshd) urllib.request.install_opener(opener) data=urllib.request.urlopen("http://edu.51cto.com" )
URLError 异常处理
主要介绍两个类, 一个是URLError类, 一个是URLError类的子类, HTTPError类.
一个实例 import urllib.requestimport urllib.errortry : urllib.request.urlopen("http://blog.csdn.net" ) except urllib.request.URLError as e: print(e.reason)
URLError的原因
链接不上服务器
远程URL不存在
无网络
触发了HTTPError
HTTPError的状态的码的含义
200 一切正常
301 重定向到新的URL 永久的
302 重定向到新的URL, 暂时的
304 请求的资源未更行
400 非法请求
401 请求未经授权
403 禁止访问
404 没有找到对应的页面’
500 服务器内部出现错误
501 服务器不支持实现请求所需要的功能
对两者的整合
因为URLError是HTTPError的父类, 所以理论上URLError可以处理HTTP类型的异常. 但是, 如果出发的不是HTTPError, 则e的属性中没有code, 所以需要经过以下处理, 即可合并!
import urllib.requestimport urllib.errortry : data = urllib.request.urlopen("http://blog.csdn.net" ).read() print(data) except urllib.request.URLError as e: if hasattr(e,"code" ): print(e.code) if hasattr(e,'reason' ): print(e.reason)