Pythonの:二つの方法のキャプチャurllib.requestタイムアウト例外
1.背景
urllib.request.urlopenを使用する場合は、頻繁にタイムアウト例外は、プログラムが実行して停止します。各停止は、プログラムの堅牢性を助長されていませんプログラムを、再起動してください。今、私たちは残業を行うために処理するタイムアウト例外のurllibはをキャプチャしたいです。
from urllib import request
headers = { # 用户代理,伪装浏览器用户访问网址
'User-Agent': 'Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3941.4 Safari/537.36'
}
# 测试url是否有效
def test_url(url):
r = request.Request(url, headers=headers)
r1 = request.urlopen(r, timeout=0.1)
print(r1.status)
if __name__ == '__main__':
url1 = 'https://www.baidu.com/'
url2 = 'http://httpbin.org/get'
url3 = 'https://www.jianshu.com/p/5d6f1891354f'
test_url(url2)
2.方法
電子などの例外を除いて2.1
from urllib import request
headers = { # 用户代理,伪装浏览器用户访问网址
'User-Agent': 'Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3941.4 Safari/537.36'
}
# 测试url是否有效
def test_url(url):
try:
r = request.Request(url, headers=headers)
r1 = request.urlopen(r, timeout=0.1)
print(r1.status)
except Exception as e: # 捕获除与程序退出sys.exit()相关之外的所有异常
print(e)
if __name__ == '__main__':
url1 = 'https://www.baidu.com/'
url2 = 'http://httpbin.org/get'
url3 = 'https://www.jianshu.com/p/5d6f1891354f'
test_url(url2)
eとerror.URLError除く2.2
from urllib import request, error
import socket
headers = { # 用户代理,伪装浏览器用户访问网址
'User-Agent': 'Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3941.4 Safari/537.36'
}
# 测试url是否有效
def test_url(url):
try:
r = request.Request(url, headers=headers)
r1 = request.urlopen(r, timeout=0.1)
print(r1.status)
except error.HTTPError as e:
print(str(e.code) + ':' + e.reason)
except error.URLError as e:
print(e.reason)
if isinstance(e.reason, socket.timeout):
print('时间超时')
if __name__ == '__main__':
url1 = 'https://www.baidu.com/'
url2 = 'http://httpbin.org/get'
url3 = 'https://www.jianshu.com/p/5d6f1891354f'
test_url(url2)
注3
- 場合は、テストURL1、Baiduの高速応答は、通常は問題なくプログラムを実行します。
url1 = 'https://www.baidu.com/'
- ときにテストURL2、プログラムが実際にタイムアウト例外をキャプチャすることができます。
url2 = 'http://httpbin.org/get'
方法1を実行し結果:
方法2を実行し結果:
- 試験URL3、1は、タイムアウト例外、方法2エラー終了をキャッチすることができるとき。その理由は、Webコンテンツのための過度の印加による貧困ネットワークの状態であってもよいです。
url3 = 'https://www.jianshu.com/p/5d6f1891354f'
方法1を実行し結果:
方法2を実行し結果:
4まとめ
「error.URLError除きeと」唯一のタイムアウト例外のすべてをキャプチャすることができ、「電子などの例外を除いて」、urllibは例外に関連付けられたタイムアウトをキャプチャすることができます。