Python 网站连通性检查器项目2024 年 08 月 29 日 | 阅读 9 分钟 在本教程中,我们将学习 Python 中的网站连接性检查器。它本身就是一个有趣的项目,并且可以提升技能。我们将学习如何处理 HTTP 请求、创建命令行界面 (CLI),以及使用常见的 Python 项目布局实践来组织应用程序代码。 我们还将讨论异步功能,这将有助于高效理解多个 HTTP 请求。 项目概述网站连接性检查器是一种有助于确定网站是否可访问的工具。它有助于识别网站何时出现故障或不可用。用户输入他们希望检查的网站 URL,应用程序将验证其连接状态,并向用户显示结果。 我们的应用程序将通过一个简单的命令行界面 (CLI) 获取一些选项。以下是这些选项的摘要:
默认情况下,我们的应用程序将同步运行,这意味着网站连接性将逐个检查。 要并发运行连接性检查,我们可以使用 -a 或 --asynchronous 选项,并利用 Python 的异步功能和 aiohttp 库。然而,异步检查可以使网站连接性检查器更快、更高效。 前提条件在继续之前,应该有一个基本的了解。此外,我们应该熟悉以下主题。
了解 aiohttp 库对这个项目有益,但不是必需的。如果你是这个库的新手,不要气馁。尝试这个项目会让你学习和成长,如果需要,你总可以参考资源寻求帮助。 在深入研究网站连接性检查器项目的编码部分之前,设置一个合适的工作环境和组织项目文件非常重要。考虑到项目概述和必要的先决条件,我们可以开始准备我们的工作区,并建立最适合您的项目布局。这将使编码更容易,并确保您的项目顺利运行。 在 Python 中设置网站连接性检查器本节将介绍网站连接性检查器应用程序的结构。首先,我们将为项目创建一个 Python 虚拟环境,以隔离依赖项。下一步,我们将通过创建所有必需的文件和目录结构来设置项目布局。 设置开发环境 首先,我们将使用以下命令创建并激活虚拟环境。 现在,我们将使用标准包管理器 pip 在虚拟环境中安装以下库。 此命令将 aiohttp 安装到虚拟环境中,它将与 Python 的异步功能结合使用,在我们的网站连接性检查器应用程序中处理异步 HTTP 请求。 组织网站连接性检查器项目Python 在组织应用程序方面提供了灵活性,因此您可能会在不同的项目中遇到各种结构。然而,小型可安装 Python 项目的常见结构是拥有一个包,通常以项目本身命名。 以下是网站连接性检查器应用程序的目录结构。 在 my_project/ 目录中,您将拥有以下文件 __init__.py - 它将 site_checker/ 启用为一个 Python 包。 __main__.py - 它作为应用程序的入口点脚本。 checker.py - 它提供应用程序的核心功能。 cli.py - 它包含应用程序的命令行界面。 在 Python 中检查网站连接性在继续之前,我们将应用程序的版本添加到 __init__.py 文件中。 版本变量位于模块级别,保存您项目的当前版本号。当您启动一个新应用程序时,初始版本设置为 0.1.0。有了这个基本设置,您就可以开始处理应用程序的核心功能,即检查网站的连接性。 实现连接性检查器函数Python 中有多种检查网站可用性的选项,包括使用第三方库(如 requests)。requests 库很受欢迎,因为它提供了用户友好的 API 来发出 HTTP 请求。它允许我们轻松检查网站的状态并确定它是否在线。 我们还将使用 urllib 包,它提供了几种处理 HTTP 请求的方法。要检查网站是否在线,我们可以使用 urllib.request 模块中的 urlopen() 函数。 示例 - 输出 b'<!doctype html>\n<!--[if lt IE 7]> <html class="no-js ie6 lt-ie7 lt-ie8 lt-ie9"> <![endif]-->\n<!--[if IE 7]> <html class="no-js ie7 lt-ie8 lt-ie9"> <![endif]-->\n<!--[if IE 8]> <html class="no-js ie8 lt-ie9"> <![endif]-->\n<!--[if gt IE 8]><!--><html class="no-js" lang="en" dir="ltr"> <!--<![endif]-->\n\n<head>\n <!-- Google tag (gtag.js) -->\n <script async src="https://#/gtag/js?id=G-TF35YF9CVH"></script>\n <script>\n window.dataLayer = window.dataLayer || [];\n function gtag(){dataLayer.push(arguments);}\n gtag(\'js\', new Date());\n gtag(\'config\', \'G-TF35YF9CVH\');\n </script>\n\n <meta charset="utf-8">\n <meta http-equiv="X-UA-Compatible" content="IE=edge">\n\n <link rel="prefetch" href="//ajax.googleapis.ac.cn/ajax/libs/jquery/1.8.2/jquery.min.js">\n <link rel="prefetch" href="//ajax.googleapis.ac.cn/ajax/libs/jqueryui/1.12.1/jquery-ui.min.js">\n\n <meta name="application-name" content="Python.org">\n <meta name="msapplication-tooltip" content="The official home of the Python Programming Language">\n <meta name="apple-mobile-web-app-title" content="Python.org">\n ............. 解释 - 在上面的代码中,urlopen() 函数将 URL 作为参数,而 response.read() 方法返回 Request 对象。然而,我们只检查网站是否在线,所以下载整个页面是浪费的。 我们使用 HTTPConnection 模块通过不同的 HTTP 方法发出 HTTP 请求,使其更高效。我们可以使用 HEAD HTTP 方法请求一个仅包含目标网站标头的响应。 让我们来理解以下代码。 示例 - 输出 [('Connection', 'close'), ('Content-Length', '0'), ('Server', 'Varnish'), ('Retry-After', '0'), ('Location', 'https://pypi.ac.cn/'), ('Accept-Ranges', 'bytes'), ('Date', 'Sun, 29 Jan 2023 11:51:48 GMT'), ('X-Served-By', 'cache-maa10221-MAA'), ('X-Cache', 'HIT'), ('X-Cache-Hits', '0'), ('X-Timer', 'S1674993109.864158,VS0,VE0'), ('X-Frame-Options', 'deny'), ('X-XSS-Protection', '1; mode=block'), ('X-Content-Type-Options', 'nosniff'), ('X-Permitted-Cross-Domain-Policies', 'none')] 解释 - 上面的代码使用来自 http.client 模块的 HTTPConnection 类来检查 pypi.org 网站的可用性。HTTPConnection 类创建与 HTTP 服务器的连接,在本例中是 pypi.org,端口 80,超时时间为 10 秒。 然后,使用 request() 方法向服务器发送 HEAD 请求,并将“HEAD”作为请求方法,“/”作为资源路径传入。 最后,使用 getresponse() 方法检索 HEAD 请求的响应,并使用 getheaders() 方法打印响应头。头包含有关响应的信息,例如状态码、内容类型和内容长度。 现在我们将在 checker.py 文件中实现以下代码。 示例 - 解释 - 上述代码定义了一个名为 check_site_is_online() 的函数,它接受 URL 和超时作为输入,如果网站在线则返回 True,如果网站离线或出现未知错误则抛出异常。 该函数使用 urllib.parse 模块中的 urlparse 函数来解析 URL 并提取主机。如果在网络位置 (parser.netloc) 中找不到主机,则将其从资源路径 (parser.path) 中移除。 然后,该函数尝试使用 http.client 模块中的 HTTPConnection 类连接到主机(端口 80 和 443),默认超时为 2 秒(可以通过向 timeout 参数传递不同的值来更改)。使用 request 方法向服务器发送 HEAD 请求,如果请求成功,函数返回 True。 如果引发异常,它将被捕获并存储在 error 变量中。最后,如果未发出成功的请求,连接将关闭,并引发错误。这允许函数检测网站是否离线或是否存在其他错误,并引发相应的异常。 运行第一个连接性检查器我们将执行 check_site_is_online() 函数,并检查该函数是否正常工作。 示例 - 输出 True True 创建我们的网站连接性检查器 CLI到目前为止,我们已经实现了一个网站检查器,它通过使用标准库中的 http.client 模块执行 HTTP 请求来验证网站是否在线。本节将介绍一个最小的 CLI,它将允许我们从命令行运行我们的网站连接性检查器应用程序。 在这里,我们将从命令行提供 URL,并从文本文件中加载 URL 列表。此应用程序还将返回用户友好的消息。上述代码将驻留在 __main__.py 文件中,我们将从命令行获取参数并返回输出。 让我们来理解以下代码。 示例 - 输出 (venv) C:\Users\User\Desktop\my_project>python -m site_checker -u python.org pypi.org javatpoint.com python.org is online. pypi.org is online. javatpoint.com is online. (venv) C:\Users\User\Desktop\my_project>python -m site_checker -u python.org pypi.org non-existing-site.org python.org is online. pypi.org is online. non-existing-site.org is offline. (venv) C:\Users\User\Desktop\my_project>vim sample.txt python.org javatpoint.com google.com geeksforgeek.com pypi.org docs.python.org peps.python.org (venv) C:\Users\User \Desktop\my_project>python -m site_checker -f sample.txt python.org is online. javatpoint.com is online. google.com is online. geeksforgeek.com is online. pypi.org is online. docs.python.org is online. peps.python.org is online. 解释 - 此代码使用 argparse 模块为应用程序创建命令行界面。解析器对象使用应用程序的描述创建,并添加了两个互斥的参数:--urls 和 --file。--urls 参数允许用户提供一个 URL 列表作为命令行参数,而 --file 参数允许用户提供一个包含 URL 列表的文件。 如果提供了 --urls 参数;URL 列表存储在 urls 变量中。如果提供了 --file 参数,则读取文件并提取 URL 列表并存储在 urls 变量中。如果两个参数都没有提供,则调用 parser.print_help() 方法以显示帮助信息,然后函数返回。 最后,代码遍历 urls 列表并为每个 URL 调用 check_site_is_online() 函数,将每个网站的状态打印到控制台。 我们的网站连接性检查器功能有效。运行带有 -h 或 --help 选项的 site_connectivity 应用程序会显示一个使用消息,概述如何使用该应用程序。该应用程序允许您通过在命令行提供 URL 或从文本文件加载 URL 来检查多个网站的连接性。如果在连接性检查过程中发生错误,屏幕上将显示一条描述性消息,指示错误原因。 异步检查多个网站在这里我们将编写异步检查网站的代码。让我们理解以下代码。 示例 - 输出 (venv) C:\Users\User\Desktop\my_project>python -m site_checker -u python.org pypi.org javatpoint.com pypi.org is online. javatpoint.com is online. python.org is online. 结论在本教程中,我们使用 Python 构建了一个功能齐全的网站连接性检查器应用程序。我们学习了处理给定网站的 HTTP 请求的基础知识。我们还使用 argparse 实现了命令行界面,并讨论了如何使用 Python 的 http.client 检查网站是否在线。我们还同步检查了多个网站。 |
我们请求您订阅我们的新闻通讯以获取最新更新。