화이트 학교 파이썬 파충류 (13) : URLLIB 기본 (C)

인생은 짧고, 파이썬을 사용

앞서 언급 한 포털 :

화이트 학교 파이썬 파충류 (1) : 열기

화이트 파이썬 크롤러 과학 (2) : 사전 준비 (a)는 실질적으로 도서관 장착

리눅스 시작하기하는베이스 (B)-준비를 사전 : 흰색 파충류 파이썬을 배울 수 (3)

사전 엔트리 준비의 도커 기준 (III) : 흰색 파충류 파이썬을 배우기 (4)

화이트 학교 파이썬 파충류 (5) : 사전 준비 (4 개) 데이터베이스 인프라

화이트 학교 파이썬 파충류 (6) : 사전 준비 (E) 크롤러 프레임 설치

화이트 학교 파이썬 파충류 (7) : HTTP 기본

화이트 학교 파이썬 파충류 (8) : 페이지 단위

화이트 학교 파이썬 파충류 (9) : 파충류 기준

화이트 학교 파이썬 파충류 (10) : 세션 및 쿠키

(가) URLLIB 기본 : 화이트 학교 파이썬 파충류 (11)

화이트 학교 파이썬 파충류 (12) : URLLIB 기본 (B)

소개

이전 두의 기초는, 우리는 요청을 보내는 과정을 소개합니다.

당신은 학생들이 이러한 급격한 속도에서 네트워크, 급격한 변동을 실행 파충류의 과정에서 경우, 프로그램 가능성을 직접 걸어되어 현재 요청 시간이 초과의 결과로, 매우 느리게 아주 느리게, 이러한 문제에 대해 생각하지 않은 모른다.

이 방법은 우리가 현재 요청은 확실히 다음 전화를 끊습니다 끊지 경우,보고 다른 요청 또는 다음 요청에 영향을 미치지 않습니다 싶어, 우리가보고 싶은 분명하지 않다.

우리가 요청, 예외 처리를 보낼 때, 그것은 매우 필요하다.

URLLIB 모듈에 문제가 발생하는 경우, 그 모듈에 정의 예외 오류 요청 모듈을 던지는 것이다 요청 모듈에 의해 생성 된 오류의 예외를 정의한다.

URLError

OSError로부터 상속 오류 예외 기본 클래스 모듈 URLLIB에서 URLError 에러 클래스 라이브러리 모듈은, 예외는 캡처 요청 모듈에 의해 생성 된 클래스에 의해 처리 될 수있다.

그것은 잘못된 이유를 반환 할 경우에만 하나의 속성 이유가 있습니다.

의 우리가 보는 간단한 예제를 만들어 보자 :

from urllib import request, error

# 访问明显不存在的地址,报错:Not Found
try:
    response = request.urlopen('https://www.geekdigging.com/aa')
except error.URLError as e:
    print(e.reason)

# 访问超时,报错:timed out
try:
    response = request.urlopen('https://www.baidu.com', timeout=0.001)
except error.URLError as e:
    print(e.reason)

这里我们访问了一个明显不存在的链接和限定了极短的超时时间,这里会抛出异常,但是我们捕获了 URLError 这个异常,运行结果如下:

Not Found
timed out

程序没有直接抛出异常终止运行,而是输出了上面这个异常,通过这样的操作,我们可以避免程序异常终止,同时还可以对这个异常做出针对性的处理。

此外,异常捕捉抛出的异常不一定都是字符串类型,比如访问超时的报错,我们将打印结果的代码稍作改动:

from urllib import request, error
import socket

# 异常类型示例
try:
    response = request.urlopen('https://www.baidu.com', timeout=0.001)
except error.URLError as e:
    print(type(e.reason))
    if isinstance(e.reason, socket.timeout):
        print('TIME OUT')

结果如下:

<class 'socket.timeout'>
TIME OUT

HTTPError

它是 URLError 的子类,专门用来处理 HTTP 请求错误,比如认证请求失败等。它有如下 3 个属性。

  • code:返回HTTP状态码,比如404表示网页不存在,500表示服务器内部错误等。
  • reason:同父类一样,用于返回错误的原因。
  • headers:返回请求头。

还是先看一个最简单的示例:

from urllib import request, error

# 访问明显不存在的地址,使用 HTTPError 捕捉异常
try:
    response = request.urlopen('https://www.geekdigging.com/aa')
except error.HTTPError as e:
    print(e.reason, e.code, e.headers, sep='\n')

运行结果如下:

Not Found
404
Date: Sun, 01 Dec 2019 15:11:48 GMT
Content-Type: text/html
Content-Length: 49307
Connection: close
Server: tencent-cos
Last-Modified: Sun, 01 Dec 2019 15:03:24 GMT
X-NWS-UUID-VERIFY: c89959eb27b89a0fb1c0326d1b2e7171
Accept-Ranges: bytes
ETag: "1bb6cc2c28a5621cf0c3238107edc229"
x-cos-error-code: NoSuchKey
x-cos-error-detail-Key: aa
x-cos-error-message: The specified key does not exist.
x-cos-request-id: NWRlM2Q4MzRfMzNhNzAzMDlfYTljZl8yNGU1NTgx
x-cos-trace-id: OGVmYzZiMmQzYjA2OWNhODk0NTRkMTBiOWVmMDAxODc0OWRkZjk0ZDM1NmI1M2E2MTRlY2MzZDhmNmI5MWI1OTQ5YWUxMjNkYTk3NzdjZmZlMDQzOTgxOThkOTNlOWFkOGJiN2YzOGQ5MDdjNGY0ODQ1MGIzYjUyMzg2NjFhNzc=
X-Daa-Tunnel: hop_count=2
X-NWS-LOG-UUID: 7c3fe80b-af9a-4e59-969b-10c8b3963a1d
X-Cache-Lookup: Hit From Upstream
X-Cache-Lookup: Hit From Upstream

因为 URLError 是 HTTPError 的父类,所以可以先选择捕获子类的错误,再去捕获父类的错误,这样对异常的处理更具针对性。

注意: 捕捉异常一般先捕捉子类异常,再捕捉父类异常。

所以我们可以更改下前面的异常捕捉的代码进行一些优化:

# 优化异常捕捉代码
try:
    response = request.urlopen('https://www.geekdigging.com/aa')
except error.HTTPError as e:
    print(e.reason, e.code, e.headers, sep='\n')
except error.URLError as e:
    print(e.reason)
else:
    print('Request Success!')

示例代码

本系列的所有代码小编都会放在代码管理仓库 Github 和 Gitee 上,方便大家取用。

示例代码-Github

示例代码-Gitee

参考

https://www.cnblogs.com/zhangxinqi/p/9170312.html

추천

출처www.cnblogs.com/babycomeon/p/12008967.html