1. 程式人生 > >python3網絡爬蟲學習——基本庫的使用(3)

python3網絡爬蟲學習——基本庫的使用(3)

進行 程序 如果 www int control content cti expires

這一節我們主要講解處理異常

在我們發送請求的時候,有的時候可能網絡不好,出現了異常,程序因為報錯而終止運行,為此我們需要對其進行處理

urllib裏的error模塊定義了request模塊產生的異常,下面便介紹裏面的函數:

  • URLError

該類是繼承自OSError類,是error異常模塊的基類,由request模塊產生的異常都可以由這個類捕抓,它具有一個reason屬性

import urllib.error,urllib.request
try:
    response = urllib.request.urlopen(‘https://cuiqingcai.com/index.htm‘)
except urllib.error.URLError as e:
    print(e.reason)

正常程序會報錯,但最終程序輸出的卻是Not Found

值得註意的是,在程序運行中,如果Import 的是import urllib.error那麽後面使用的時候也要urllib.error.URLError,如果import的是from urllib impoort request,error那麽後面就可以直接request.urlopen,error.URLError等

  • HTTPError

這個是URLError的子類,專門用來處理HTTP的請求錯誤,比如認證請求失敗等,他有三個屬性:

code:返回HTTP狀態碼,比如404表示網頁不存在,505表示服務器內部錯誤

reason:返回錯誤的原因

headers:返回請求頭

下面上實例:

from urllib import request,error
try:
    response = request.urlopen(‘https://cuiqingcai.com/index.htm‘)
except error.HTTPError as e:
    print(e.reason,e.code,e.headers)
===================== RESTART: F:\Python\exercise\ok.py ===================


Not Found 404 Server: nginx/1.10.3 (Ubuntu) Date: Fri, 17 Aug 2018 03:14:05 GMT Content-Type: text/html; charset=UTF-8 Transfer-Encoding: chunked Connection: close Vary: Cookie Expires: Wed, 11 Jan 1984 05:00:00 GMT Cache-Control: no-cache, must-revalidate, max-age=0 Link: <https://cuiqingcai.com/wp-json/>; rel="https://api.w.org/"

因為HTTPError是URLError的子類,所以可以選擇捕獲錯誤時先捕獲子類的,再去捕獲父類的

from urllib import request,error
try:
    response = request.urlopen(‘https://cuiqingcai.com/index.htm‘)
except error.HTTPError as e:
    print(e.reason,e.code,e.headers)
except error.URLError as e:
    print(e.reason)
else:
    print(‘Request Successfully‘)

有時候reason返回的不是一個字符串也可能為一個對象,這時候有可能要用到socket庫

socket 是網絡連接端點。例如當你的Web瀏覽器請求www.jb51.net上的主頁時,你的Web瀏覽器創建一個socket並命令它去連接 www.jb51.net的Web服務器主機,Web服務器也對來自的請求在一個socket上進行監聽。兩端使用各自的socket來發送和 接收信息。

import socket
import urllib.request
import urllib.error

try:
    response = urllib.request.urlopen(‘https://www.baidu.com‘,timeout = 0.01)
except urllib.error.URLError as e:
    print(type(e.reason))
    if isinstance(e.reason,socket.timeout):
        print(‘TIME OUT‘)
===================== RESTART: F:\Python\exercise\ok.py ===================

<class ‘socket.timeout‘>
TIME OUT

可見設置超時時間使程序強制執行了timeout異常(type函數不會認為子類是父類的一種類型,但isinstance會認為是)

python3網絡爬蟲學習——基本庫的使用(3)