我正在通过使用请求模块的很多网站,我想看看该网站是否被打破/存在/如果我可以访问它。我正在使用一个try/except函数,可以看到我得到了什么错误。
我的问题:我有很多网站要浏览,不知道会发生什么错误。我可能见过他们,但我不知道。
下面是一些发生错误的例子:
Err: HTTPSConnectionPool(host='the_site', port=443): Max retries exceeded with url: / (Caused by SSLError(SSLEOFError(8, 'EOF occurred in violation of protocol (_ssl.c:1129)')))
<class 'requests.exceptions.SSLError'>
Err: HTTPSConnectionPool(host='the_site', port=443): Max retries exceeded with url: / (Caused by SSLError(SSLError(1, '[SSL: TLSV1_UNRECOGNIZED_NAME] tlsv1 unrecognized name (_ssl.c:1129)')))
<class 'requests.exceptions.SSLError'>
Err: HTTPSConnectionPool(host='the_site', port=443): Max retries exceeded with url: / (Caused by SSLError(SSLError(1, '[SSL: SSLV3_ALERT_HANDSHAKE_FAILURE] sslv3 alert handshake failure (_ssl.c:1129)')))
<class 'requests.exceptions.SSLError'>
Err: HTTPSConnectionPool(host='the_site', port=443): Max retries exceeded with url: / (Caused by ConnectTimeoutError(<urllib3.connection.HTTPSConnection object at 0x000001D58BAB4850>, 'Connection to the_site timed out. (connect timeout=10)'))
<class 'requests.exceptions.ConnectTimeout'>
Err: HTTPSConnectionPool(host='the_site', port=443): Max retries exceeded with url: / (Caused by NewConnectionError('<urllib3.connection.HTTPSConnection object at 0x000001D58BAB48B0>: Failed to establish a new connection: [Errno 11001] getaddrinfo failed'))
<class 'requests.exceptions.ConnectionError'>
Err: ('Connection aborted.'the_site', ConnectionResetError(10054, 'An existing connection was forcibly closed by the remote host', None, 10054, None))
<class 'requests.exceptions.ConnectionError'>
Err: HTTPSConnectionPool(host='the_site', port=443): Max retries exceeded with url: / (Caused by NewConnectionError('<urllib3.connection.HTTPSConnection object at 0x000001D58BB44C40>: Failed to establish a new connection: [WinError 10061] No connection could be made because the target machine actively refused it'))
<class 'requests.exceptions.ConnectionError'>
296 nan: is Not reachable
Err: Invalid URL 'nan': No schema supplied. Perhaps you meant http://nan?
354 : is Not reachable, status_code: 404
正如您所看到的,它们都略有不同(甚至忽略对象Id和主机)
I have try:
try:
#Get Url
get = requests.get(url, allow_redirects=True, timeout=1,verify=True,headers={"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/99.0.4844.51 Safari/537.36"})
# if the request succeeds
if get.status_code == 200:
print(f"{count} {url}: is reachable. status_code: {get.status_code}")
else:
print(f"{count} {url}: is Not reachable, status_code: {get.status_code}")
#Exception
except requests.exceptions.RequestException as e:
print(e.errno)
print(f"{url}: is Not reachable nErr: {e}")
e.errno只是返回一个值。我不知道它是如何工作的,但我希望它能返回与特定错误相关的唯一数字,但我猜我错了。
我也玩了所有其他的。一些东西和其他的东西从请求模块,但我似乎找不到一种方法来获得所有的独特类型的错误,我得到,以后会得到。
澄清一下,我不是在谈论像SSLError或ConnectionError这样的类。
TLDR:我如何能得到我得到的所有唯一错误的列表,所以我可以搜索如何防止这些错误在线。
如果您只想生成接收到的错误列表而不停止代码,则可以使用所有异常的基类:Exception
:
你的代码将变成:
try:
#Get Url
get = requests.get(url, allow_redirects=True, timeout=1,verify=True,headers={"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/99.0.4844.51 Safari/537.36"})
# if the request succeeds
if get.status_code == 200:
print(f"{count} {url}: is reachable. status_code: {get.status_code}")
else:
print(f"{count} {url}: is Not reachable, status_code: {get.status_code}")
#Exception
except Exception as e:
print(f"{url}: is Not reachable nErr: {e}")
请记住,这显然会捕获可能发生的任何和所有错误,因此请确保正确地记录它们,以便在需要时帮助调试。
回复:
但是e.r no只是返回一个None值。我不知道它是如何工作的,但我希望它能返回与特定错误相关的唯一数字,但我猜我错了。
不,不是这样的。
"errno"是一个旧的Unix错误约定,请参见https://pubs.opengroup.org/onlinepubs/9699919799/basedefs/errno.h.html列出它们的符号名称。如果你想要那些是"OS"错误。
现在如果你看一下Python的异常机制,它确实定义了一个"oserror";异常使用errno
,参见https://docs.python.org/3.8/library/exceptions.html:
exception OSError(errno, strerror[, filename[, winerror[, filename2]]])
如果你想要,Python异常例外在操作系统级别的超集因此errno值。因此,库和您自己的代码定义的所有其他异常绝对不必依赖于此,并且它们没有理由具有errno
属性。
(这很好:所有的库和代码如何能够满足于单个共享数字序列来编码它们自己的异常?)我根本不会缩放)。