搜索
首页后端开发Python教程使用 Selenium 和 Python 构建强大的 Web 自动化

网络自动化现在是现代软件开发和测试中不可或缺的工具。在这个全面的 Selenium Python 教程中,您将学习如何构建一个能够处理现实场景的强大的 Web 自动化框架。如果您有兴趣在 Python 中实现自动化测试或创建复杂的网页抓取自动化解决方案,本指南将为您提供经过行业测试的方法和 Selenium 最佳实践。

了解 Web 自动化基础知识

网络自动化对于现代软件开发、测试和数据收集至关重要。其应用程序涵盖从 Web 应用程序的端到端测试到简化重复的工作流程,例如表单提交或网页抓取。虽然 Selenium WebDriver Python 集成提供了强大的功能,但强大的 Web 自动化不仅仅是编写脚本来模拟用户交互。它涉及设计可维护、适应性强且能够适应目标 Web 应用程序更改的工作流程和框架。

以下是我们将在本教程中介绍的关键方面:

  • 选择适当的定位器(XPath、CSS 等)
  • 动态元素和状态加载
  • 实施重试机制
  • 正确管理浏览器会话
  • 代码的可维护性结构

我们将使用 Books to Scrape 作为演示网站,为电子商务网站上的价格跟踪器构建一个网络抓取自动化项目,以演示这些概念,同时遵循 Selenium 最佳实践。

先决条件

要学习本教程,您需要:

  • Python 3.x 安装在您的计算机上。
  • Python编程基础知识
  • 使用 Selenium 进行网页抓取的基础知识

本教程的代码可在我们的 github 存储库中找到,请随意克隆它以继续学习。

设置开发环境

让我们设置一个合适的开发环境并安装必要的Python包。首先,通过运行以下命令创建项目文件夹和新的虚拟环境:

mkdir price_tracker_automation && cd price_tracker_automation
python3 -m venv env
source env/bin/activate

然后,创建以下 Python 包并将其添加到您的requirements.txt 文件中:

selenium==4.16.0
webdriver-manager==4.0.1
python-dotenv==1.0.0
requests==2.31.0

在上面的代码中,我们定义了核心依赖项。 selenium 包为我们的 Web 自动化框架提供了基础,而 webdriver-manager 自动处理浏览器驱动程序管理。 python-dotenv 包用于环境配置,requests 包用于 HTTP 请求处理。

现在运行以下命令来安装您的requirements.txt 文件中的所有Python 包:

pip install -r requirements.txt

最后,为我们的项目创建以下文件夹结构:

mkdir price_tracker_automation && cd price_tracker_automation
python3 -m venv env
source env/bin/activate

在这里,我们遵循软件工程最佳实践建立了模块化项目结构。 core 目录包含我们的主要自动化组件,而 database 处理数据持久性。

构建价格跟踪工具

创建了项目环境、依赖项和文件夹结构后,让我们继续使用 Selenium 和 Python 构建价格跟踪器自动化工具。

实施我们的浏览器管理系统

让我们实现我们的浏览器管理系统,这是稳定的 Selenium WebDriver Python 集成的重要组件。将下面的代码片段添加到您的 core/browser.py 文件中:

selenium==4.16.0
webdriver-manager==4.0.1
python-dotenv==1.0.0
requests==2.31.0

上面的代码创建了一个 BrowserManager 类来处理 WebDriver 的初始化和配置。该课程通过配置 Chrome 选项来实现稳定性和性能,从而实现 Selenium 最佳实践。 headless 参数允许在没有可见浏览器窗口的情况下运行测试,这对于 CI/CD 管道至关重要。

现在将以下方法添加到 BrowserManager 类中以实现核心浏览器管理功能:

pip install -r requirements.txt

在上面的代码中,start_browser 方法利用 webdriver-manager 自动处理驱动程序安装和更新,而 close_browser 则确保正确的资源清理。该实现包括隐式等待配置,以优雅地处理动态页面加载。

创建元素处理程序

接下来,让我们继续实现元素交互系统,这在任何 Web 自动化框架中都很重要,因为它使我们能够以可靠的方式检测元素并与元素交互,同时遵循 Selenium 的最佳实践。将代码片段添加到您的 core/element_handler.py

price_tracker_automation/
├── core/
│   ├── browser.py
|   ├── scraper.py
│   └── element_handler.py
├── database/
│   └── db_manager.py
├── notifications/
|   └── price_alert.py
├── requirements.txt
├── run.py
└── main.py

在上面的代码中,我们创建了一个 ElementHandler 类,它封装了 Selenium WebDriver Python 交互模式。该类接受 WebDriver 实例和可配置的超时参数。

更新您的 ElementHandler 类以添加核心元素交互方法:

from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.support import expected_conditions as EC
import logging

class BrowserManager:
    def __init__(self, headless=False):
        self.options = webdriver.ChromeOptions()
        if headless:
            self.options.add_argument('--headless')

        # Add additional stability options
        self.options.add_argument('--no-sandbox')
        self.options.add_argument('--disable-dev-shm-usage')
        self.options.add_argument('--disable-gpu')

        self.driver = None
        self.logger = logging.getLogger(__name__)

上述方法使用Selenium的WebDriverWait和expected_conditions来检测元素,以便它也可以处理元素可能异步加载的动态网页。

添加另一种方法来实现文本提取逻辑:

    def start_browser(self):
        """Initialize and return a ChromeDriver instance"""
        try:
 service = webdriver.ChromeService()
            self.driver = webdriver.Chrome(service=service, options=self.options)
            self.driver.implicitly_wait(10)
            return self.driver
        except Exception as e:
            self.logger.error(f"Failed to start browser: {str(e)}")
            raise

    def close_browser(self):
        """Safely close the browser"""
        if self.driver:
            self.driver.quit()
            self.driver = None

该方法包含重试逻辑来处理 StaleElementReferenceException,这是 Web 自动化中的常见挑战。

实施价格跟踪器核心

现在让我们构建主要的抓取功能,结合自动化测试 Python 概念和强大的错误处理。将下面的代码片段添加到您的 core/scraper.py 文件中:

mkdir price_tracker_automation && cd price_tracker_automation
python3 -m venv env
source env/bin/activate

在上面的代码中,我们创建了 BookScraper 类,它集成了浏览器和元素处理组件。该类遵循页面对象模型模式,这是 Web 自动化框架设计中的一个关键概念,通过集中元素定位器并为抓取操作提供干净的 API。

接下来,更新BookScraper类以添加核心产品数据提取方法:

selenium==4.16.0
webdriver-manager==4.0.1
python-dotenv==1.0.0
requests==2.31.0

上述方法使用结构化方法来收集产品信息,维护详细日志以进行调试和监控。

设置数据库管理

让我们实现 Web 自动化框架的数据库层,它将处理我们抓取的数据的持久存储。该组件将使我们能够跟踪价格随时间的变化。将以下代码片段添加到您的database/db_manager.py:

pip install -r requirements.txt

在上面的代码中,我们定义了处理所有数据库操作的 DatabaseManager 类。我们使用 SQLite 是为了简单性和可移植性,以避免设置和配置数据库,而且 SQLite 也是我们的网络抓取自动化项目的理想选择,因为我们不存储大量数据。

接下来,更新你的database/db_manager.py以添加数据库初始化方法:

price_tracker_automation/
├── core/
│   ├── browser.py
|   ├── scraper.py
│   └── element_handler.py
├── database/
│   └── db_manager.py
├── notifications/
|   └── price_alert.py
├── requirements.txt
├── run.py
└── main.py

在这里,我们使用 SQL DDL 语句建立数据库模式,并为产品和价格历史创建单独的表,并具有适当的关系和约束,这将使我们能够跟踪价格并对我们存储的数据执行历史分析。

现在让我们添加另一种方法来将数据保存到数据库:

from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.support import expected_conditions as EC
import logging

class BrowserManager:
    def __init__(self, headless=False):
        self.options = webdriver.ChromeOptions()
        if headless:
            self.options.add_argument('--headless')

        # Add additional stability options
        self.options.add_argument('--no-sandbox')
        self.options.add_argument('--disable-dev-shm-usage')
        self.options.add_argument('--disable-gpu')

        self.driver = None
        self.logger = logging.getLogger(__name__)

在上面的代码中,我们使用参数化查询实现了数据持久化逻辑,以防止SQL注入。该方法使用 SQLite 的 ON CONFLICT 子句处理插入和更新操作。

主要应用集成

让我们将所有内容与我们的主应用程序类联系在一起,合并 Selenium WebDriver Python 实现的所有元素。将以下代码片段添加到您的 main.py 文件中:

    def start_browser(self):
        """Initialize and return a ChromeDriver instance"""
        try:
 service = webdriver.ChromeService()
            self.driver = webdriver.Chrome(service=service, options=self.options)
            self.driver.implicitly_wait(10)
            return self.driver
        except Exception as e:
            self.logger.error(f"Failed to start browser: {str(e)}")
            raise

    def close_browser(self):
        """Safely close the browser"""
        if self.driver:
            self.driver.quit()
            self.driver = None

在上面的代码中,我们创建了主要的 PriceTracker 类,该类协调我们的网络抓取自动化解决方案的所有组件。 PriceTracker 类遵循依赖注入模式来保持模块化和可测试性。

接下来,更新我们的 PriceTracker 类以添加核心跟踪方法:

from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.common.exceptions import TimeoutException, StaleElementReferenceException

class ElementHandler:
    def __init__(self, driver, timeout=10):
        self.driver = driver
        self.timeout = timeout

在这里,我们实现了主要的产品跟踪逻辑,用于处理网络抓取并存储抓取的数据。

运行应用程序

让我们创建一个执行脚本来运行我们的自动化脚本。将以下代码片段添加到您的 run.py 文件中:

   def wait_for_element(self, locator, timeout=None):
        """Wait for element with retry mechanism"""
 timeout = timeout or self.timeout
        try:
 element = WebDriverWait(self.driver, timeout).until(
 EC.presence_of_element_located(locator)
 )
            return element
        except TimeoutException:
            raise TimeoutException(f"Element {locator} not found after {timeout} seconds")

    def get_text_safely(self, locator, timeout=None):
        """Safely get text from element with retry mechanism"""
 max_retries = 3
        for attempt in range(max_retries):
            try:
 element = self.wait_for_element(locator, timeout)
                return element.text.strip()
            except StaleElementReferenceException:
                if attempt == max_retries - 1:
                    raise
                continue

现在在终端上运行以下命令来运行脚本:

mkdir price_tracker_automation && cd price_tracker_automation
python3 -m venv env
source env/bin/activate

上面的命令将在下面的屏幕截图中显示输出:

Building Robust Web Automation with Selenium and Python

从上面的脚本中,您可以看到我们的自动化脚本正在跟踪所有指定 URL 的价格。

追踪价格变化

我们当前的实施仅跟踪和保存产品价格。跟踪价格后,让我们增强我们的价格跟踪器以通知用户价格变化。将以下代码片段添加到您的 notification/price_alert.py 文件中:

selenium==4.16.0
webdriver-manager==4.0.1
python-dotenv==1.0.0
requests==2.31.0

在上面的代码片段中,我们创建了一个具有基本依赖项的 PriceAlertManager 类。管理器将数据库管理器实例作为参数,并设置日志记录以跟踪警报操作。该类使用复杂的连接来比较当前和以前的价格。然后我们实现了动态价格变化百分比计算,并为价格变化信息创建了一个结构化字典。

接下来,更新您的 PriceAlertManager 类以添加电子邮件通知功能:

pip install -r requirements.txt

在这里,我们使用 Python 的电子邮件和 SMTP 库创建了电子邮件通知。该实现使用 MIMEText 类来创建格式正确的电子邮件。电子邮件正文是使用 f 字符串动态生成的,包含详细的价格变化信息和精确的货币格式。

现在让我们修改运行脚本以包含价格警报:

price_tracker_automation/
├── core/
│   ├── browser.py
|   ├── scraper.py
│   └── element_handler.py
├── database/
│   └── db_manager.py
├── notifications/
|   └── price_alert.py
├── requirements.txt
├── run.py
└── main.py

现在,如果您再次运行该脚本,它将跟踪产品价格并提醒您价格发生变化的产品,如下面的屏幕截图所示:

Building Robust Web Automation with Selenium and Python

也许您可以在 cron 作业中运行此脚本来跟踪产品价格并实时提醒您价格变化,而无需每次都手动运行它。
例如。 0 */6 * * * python run.py --urls
“http://books.toscrape.com/catalogue/a-light-in-the-attic_1000/index.html”
“http://books.toscrape.com/catalogue/tipping-the-velvet_999/index.html”
“http://books.toscrape.com/catalogue/soumission_998/index.html”

结论

通过本教程,您学习了如何使用 Selenium 和 Python 构建强大的 Web 自动化工具。我们首先了解网络自动化基础知识,然后为我们为本教程中的演示构建的 Price Traker 工具建立一个开发环境。然后,我们进一步构建了价格跟踪应用程序,用于跟踪产品价格并提醒用户价格变化。现在您已经掌握了这些知识,接下来您将构建什么工具。请在评论部分告诉我。快乐编码!

以上是使用 Selenium 和 Python 构建强大的 Web 自动化的详细内容。更多信息请关注PHP中文网其他相关文章!

声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
Python vs. C:了解关键差异Python vs. C:了解关键差异Apr 21, 2025 am 12:18 AM

Python和C 各有优势,选择应基于项目需求。1)Python适合快速开发和数据处理,因其简洁语法和动态类型。2)C 适用于高性能和系统编程,因其静态类型和手动内存管理。

Python vs.C:您的项目选择哪种语言?Python vs.C:您的项目选择哪种语言?Apr 21, 2025 am 12:17 AM

选择Python还是C 取决于项目需求:1)如果需要快速开发、数据处理和原型设计,选择Python;2)如果需要高性能、低延迟和接近硬件的控制,选择C 。

达到python目标:每天2小时的力量达到python目标:每天2小时的力量Apr 20, 2025 am 12:21 AM

通过每天投入2小时的Python学习,可以有效提升编程技能。1.学习新知识:阅读文档或观看教程。2.实践:编写代码和完成练习。3.复习:巩固所学内容。4.项目实践:应用所学于实际项目中。这样的结构化学习计划能帮助你系统掌握Python并实现职业目标。

最大化2小时:有效的Python学习策略最大化2小时:有效的Python学习策略Apr 20, 2025 am 12:20 AM

在两小时内高效学习Python的方法包括:1.回顾基础知识,确保熟悉Python的安装和基本语法;2.理解Python的核心概念,如变量、列表、函数等;3.通过使用示例掌握基本和高级用法;4.学习常见错误与调试技巧;5.应用性能优化与最佳实践,如使用列表推导式和遵循PEP8风格指南。

在Python和C之间进行选择:适合您的语言在Python和C之间进行选择:适合您的语言Apr 20, 2025 am 12:20 AM

Python适合初学者和数据科学,C 适用于系统编程和游戏开发。1.Python简洁易用,适用于数据科学和Web开发。2.C 提供高性能和控制力,适用于游戏开发和系统编程。选择应基于项目需求和个人兴趣。

Python与C:编程语言的比较分析Python与C:编程语言的比较分析Apr 20, 2025 am 12:14 AM

Python更适合数据科学和快速开发,C 更适合高性能和系统编程。1.Python语法简洁,易于学习,适用于数据处理和科学计算。2.C 语法复杂,但性能优越,常用于游戏开发和系统编程。

每天2小时:Python学习的潜力每天2小时:Python学习的潜力Apr 20, 2025 am 12:14 AM

每天投入两小时学习Python是可行的。1.学习新知识:用一小时学习新概念,如列表和字典。2.实践和练习:用一小时进行编程练习,如编写小程序。通过合理规划和坚持不懈,你可以在短时间内掌握Python的核心概念。

Python与C:学习曲线和易用性Python与C:学习曲线和易用性Apr 19, 2025 am 12:20 AM

Python更易学且易用,C 则更强大但复杂。1.Python语法简洁,适合初学者,动态类型和自动内存管理使其易用,但可能导致运行时错误。2.C 提供低级控制和高级特性,适合高性能应用,但学习门槛高,需手动管理内存和类型安全。

See all articles

热AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover

AI Clothes Remover

用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Clothoff.io

Clothoff.io

AI脱衣机

Video Face Swap

Video Face Swap

使用我们完全免费的人工智能换脸工具轻松在任何视频中换脸!

热工具

Atom编辑器mac版下载

Atom编辑器mac版下载

最流行的的开源编辑器

SublimeText3 Linux新版

SublimeText3 Linux新版

SublimeText3 Linux最新版

mPDF

mPDF

mPDF是一个PHP库,可以从UTF-8编码的HTML生成PDF文件。原作者Ian Back编写mPDF以从他的网站上“即时”输出PDF文件,并处理不同的语言。与原始脚本如HTML2FPDF相比,它的速度较慢,并且在使用Unicode字体时生成的文件较大,但支持CSS样式等,并进行了大量增强。支持几乎所有语言,包括RTL(阿拉伯语和希伯来语)和CJK(中日韩)。支持嵌套的块级元素(如P、DIV),

禅工作室 13.0.1

禅工作室 13.0.1

功能强大的PHP集成开发环境

SecLists

SecLists

SecLists是最终安全测试人员的伙伴。它是一个包含各种类型列表的集合,这些列表在安全评估过程中经常使用,都在一个地方。SecLists通过方便地提供安全测试人员可能需要的所有列表,帮助提高安全测试的效率和生产力。列表类型包括用户名、密码、URL、模糊测试有效载荷、敏感数据模式、Web shell等等。测试人员只需将此存储库拉到新的测试机上,他就可以访问到所需的每种类型的列表。