Urllib和URLError异常处理(2)

Urllib和URLError异常处理(2)

代理服务器设置

有时候使用同一个IP去爬同一个网站上的网页, 久了之后会被该网站屏蔽. 使用代理会解决这个问题.

代理服务器寻找

程序编写

#encoding:utf-8
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) ## 创建一个自定义opener对象, 第一个参数是代理信息, 第二个
参数是类
urllib.request.install_opener(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.request

httphd = 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.request
import urllib.error

try:
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.request
import urllib.error

try:
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)