鱼c笔记——Python爬虫(五):访问网页的异常处理

访问网页的异常处理。

当我们的urlopen() 方法无法处理一个响应的时候,就会引发URLError异常。通常在没有网络连接或者对方服务器压根不存在的时候,都会引发这个异常。同时URL会伴随一个reason的属性,用于包含一个由错误编码和错误信息组成的元组。

>>> import urllib.request
>>> import urllib.error  #URLError存在的模块

>>> req = urllib.request.Request('http://412-dfas.com')  #尝试访问一个不存在的链接

>>> try:
	urllib.request.urlopen(req)
except urllib.error.URLError  as e:
	print(e.reason)

	
[Errno 11004] getaddrinfo failed

HTTPError:HTTPError是URLError的一个子类,服务器上每一个HTTP的响应都会返回一个状态码,如404。有时候状态码会指出服务器无法完成的请求类型,一般情况下,Python会帮我们处理一部分这样的请求,例如说响应重定向,要求客户端从别的地方获取文档,urllib模块会自动帮我们处理响应。但是有一些情况是无法处理的。比如404问题,需要人工过滤。


HTTP状态码大全:http://bbs.fishc.com/thread-103840-1-1.html

ps. 400~499表示问题来自客户端,问题是自己。500~599表示问题来自服务器,问题与我们无关。


当出现一个错误的时候,服务器就会返回一个HTTP错误号和错误的页面。我们可以使用HTPPError实例对象作为页面返回的响应对象,它同样也拥有read()、geturl()、info()等方法。

>>> req = urllib.request.Request('http://www.Fishc.com/ooxx.html')

>>> try:
	urllib.request.urlopen(req)
except urllib.error.HTTPError as e:
	print(e.code)  #返回状态码,不一定是错误码,如果返回的是200状态码表示的是成功响应
	print(e.read())  #HTTPError也会返回一个页面,可以将其打印出来

	
404
b'\n\n404 Not Found\n\n

Not Found

\n

The requested URL /ooxx.html was not found on this server.

\n
\n
Apache Server at www.fishc.com Port 80
\n\n'


处理异常的第一种写法:

from urllib.request import Request, urlopen
from urllib.error import URLError, HTTPError
req = Request(someurl)
try:
    response = urlopen(req)

except HTTPError as e:
    print('The server couldn\'t fulfill the request.')
    print('Error code: ', e.code)

except URLError as e:   #注意except HTTPError需要写在except URLError的前面才会响应到e.code。因为HTTPError是URLError的一个子类
    print('We failed to reach a server.')
    print('Reason: ', e.reason)

else:
#everything is fine


第二种写法:

from urllib.request import Request, urlopen
from urllib.error import URLError, HTTPError
req = Request(someurl)
try:
    response = urlopen(req)

except URLError as e:
    if hasattr(e, 'reason'):
        print('We failed to reach a server')
        print('Reason: ', e.reason)
    elif hasattr(e, 'code'):
        print('The server couldn\'t fulfill the request.')
        print('Error code: ', e.code)
else:
#everything is fine

比较推荐第二种的写法。

你可能感兴趣的:(#,Python学习笔记)