Python爬虫入门 ~ urllib的两个异常

95 阅读2分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第18天,点击查看活动详情

简介

  1. HTTPError 类是URLError类的子类
  2. 包路径:urllib.error.HTTPError
  3. http异常:是指针对浏览器无法连接到服务器而增加出来的错误提示,引导并告诉浏览者该页面出现问题的地方。
  4. 通过urllib发送请求的时候,有可能会发送失败,这个时候如果不想让代码中断运行,可以通过try-except来捕获相关的异常,异常类型有URLError\HTTPError

案例演示

当我们在爬取数据的过程中,如果遇到网络问题或者一些其它的问题,导致了请求无法得到响应,程序就会抛出异常,例如抓取自己掘金的主页:

import urllib.request
import urllib.parse

# 创建请求对象
def create_request(page):
    url = 'https://juejin.cn/user/2670059720028061'
    headers = {
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.116 Safari/537.36'
    }
    return urllib.request.Request(url=url, headers=headers)

# 得到响应数据
def getResponseData(request):
    response = urllib.request.urlopen(request)
    return response.read().decode('utf-8')

if __name__ == '__main__':
        request = create_request(1)
        result = getResponseData(request)
        print(result)

image.png

正常的情况获取到的结果如上图所示,能够拿到返回页面的源码。但如果请求有问题,例如url错了或者是其它的原因,则程序就会发生异常:

image.png

为了防止因为该类的异常造成程序的中止,我们需要考虑对代码块进行相关的异常信息捕获。通过try-except来捕获对应的异常信息,给出友好的提示内容。

import urllib.request
import urllib.parse
import urllib.error

# 创建请求对象
def create_request(page):
    url = 'https://juejin.cn/user/26700597200280611111'
    headers = {
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.116 Safari/537.36'
    }
    return urllib.request.Request(url=url, headers=headers)

# 得到响应数据
def getResponseData(request):
    response = urllib.request.urlopen(request)
    return response.read().decode('utf-8')

if __name__ == '__main__':
        try:
            request = create_request(1)
            result = getResponseData(request)
            print(result)
        except urllib.error.HTTPError:
            print('系统升级中......')

image.png

上面的异常是HTTPError,一般是参数之类错误导致的,还有一种异常类似是URLError,这种一般是访问无效域名导致的,如下图所示:

image.png