python爬虫入门教程之五——Requests库的异常及处理

Python kingmo888 362℃ 0评论

1、Requests异常情况

在进行网络访问时,经常会遇到各种错误的情况发生,Requests库的主要异常情况如下:

  1. requests.Connection 网络连接错误异常,如DNS查询失败、拒绝连接等
  2. requests.HTTPError HTTP错误异常
  3. requests.URLRequired URL缺失异常
  4. requests.TooManyRedirects 超过最大重定向次数,产生重定向异常
  5. requests.ConnectTimeout 连接远程服务器超时异常
  6. requests.Timeout 请求URL超时,产生超时异常

在Requests库中所有Requests显式抛出的异常都继承自 requests.exceptions.RequestException

2、Requests异常处理

当我们无论是get/post请求后赋值给response变量,response返回所有内容或者抛出异常,同时在response对象还提供一个方法——
response.raise_for_status(),其作用是当访问网页后的HTTP状态码不是200时,产生requests.HTTPError。基于此,就不用判断很多种状态码不为200情况了,在大批量爬取网页内容时,只要出现HTTPError异常,直接记录或者跳过,爬完所有数据后在进行处理。

3、异常处理小例子

在这里举几个例子,构造几个url链接,分别模拟错误地址、连接远程服务器超时等2种异常情况。

# -*- coding: utf-8 -*-
"""
Created on Tue Apr 16 23:08:21 2019

@author: www.lizenghai.com
"""

import requests

urls = ['http://www.lizenghai.com', 
        'http://www.lizenghai.com/404',
        'http://www.lizenghai.comXX/']

for i,u in enumerate(urls):
    print(u)
    timeout = 3
    if i ==0:
        # 这里只对第一个url(正确的url)进行超时测试
        # 在千分之一秒内肯定无法完成连接的,所以会报超时的错误。
        timeout = 0.001 
    try:
        response = requests.get(u, timeout=timeout)   
        response.raise_for_status()   # 检查http状态码是否为200
    except requests.ConnectTimeout:
        print('超时!')
    except requests.HTTPError:
        print('http状态码非200')
    except Exception as e:
        print('未进行容错处理的情况:', e)

 

执行上述例子,将返回如下结果:

http://www.lizenghai.com
超时!
http://www.lizenghai.com/404
http状态码非200
http://www.lizenghai.comXX/
未进行容错处理的情况: HTTPConnectionPool(host=’www.lizenghai.comxx’, port=80): Max retries exceeded with url: / (Caused by NewConnectionError(‘<urllib3.connection.HTTPConnection object at 0x00000000096FB5F8>: Failed to establish a new connection: [Errno 11004] getaddrinfo failed’))

转载请注明:Python量化投资 » python爬虫入门教程之五——Requests库的异常及处理

喜欢 (0)or分享 (0)
发表我的评论
取消评论
表情

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址