使用Python和Selenium构建一个自动化图像引擎

 更新时间:2024年12月11日 09:34:10   作者:不爱运动的跑者  
这篇文章主要为大家详细介绍了如何使用Python和Selenium库构建一个自动化图像引擎,能够根据指定参数自动截取网页快照,并将生成的图片存储到云端,需要的可以参考下

本篇指南将教你如何使用Python和Selenium库来构建一个自动化图像引擎,该引擎能够根据指定参数自动截取网页快照,并将生成的图片存储到云端。此工具还可以通过消息队列接收任务指令,非常适合需要批量处理网页截图的应用场景。

1. 准备环境

确保你已经安装了Python和必要的库:

pip install selenium oss2 kafka-python-ng

2. 创建配置文件

创建一个简单的config.ini文件来存储你的OSS和Kafka设置:

[oss]
access_key_id = YOUR_OSS_ACCESS_KEY_ID
access_key_secret = YOUR_OSS_ACCESS_KEY_SECRET
bucket_name = YOUR_BUCKET_NAME
endpoint = http://oss-cn-hangzhou.aliyuncs.com

[kafka]
bootstrap_servers = localhost:9092
topic = your_topic_name
notify_topic = your_notify_topic
consumer_group = your_consumer_group

[engine]
driver_path = path/to/chromedriver
image_path = path/to/screenshots
param_path = path/to/params
site_base_path = https://example.com

3. 设置日志记录

为程序添加基本的日志记录功能,以便于调试:

import logging
from logging.handlers import TimedRotatingFileHandler
import os

logger = logging.getLogger('image_engine')
logger.setLevel(logging.DEBUG)

log_file = 'logs/image_engine.log'
os.makedirs('logs', exist_ok=True)
handler = TimedRotatingFileHandler(log_file, when='midnight', backupCount=7, encoding='utf-8')
formatter = logging.Formatter('%(asctime)s - %(levelname)s - %(message)s')
handler.setFormatter(formatter)
logger.addHandler(handler)

4. 初始化Selenium WebDriver

初始化Chrome WebDriver,并设置窗口最大化:

from selenium import webdriver
from selenium.webdriver.chrome.service import Service

# 读取配置文件
import configparser
config = configparser.ConfigParser()
config.read('config.ini')

service = Service(config.get('engine', 'driver_path'))
driver = webdriver.Chrome(service=service)
driver.maximize_window()

5. 图像处理逻辑

编写一个函数来处理每个Kafka消息,打开指定网页,等待页面加载完成,然后保存截图:

from kafka import KafkaConsumer, KafkaProducer
import json
import time
from datetime import datetime
import oss2

def process_task(msg):
    task_params = json.loads(msg.value)
    item_id = task_params['itemId']
    param_value = task_params['paramValue']
    
    logger.info(f"开始处理项【{item_id}】对应参数【{param_value}】")
    
    # 构建请求链接
    url = f"{config.get('engine', 'site_base_path')}/view?param={param_value}&id={item_id}"
    driver.get(url)
    
    try:
        # 简单等待页面加载
        time.sleep(3)  # 根据需要调整或替换为WebDriverWait
        
        # 生成截图文件名
        today = datetime.now().strftime('%Y-%m-%d')
        screenshot_dir = os.path.join(config.get('engine', 'image_path'), 'images', today)
        os.makedirs(screenshot_dir, exist_ok=True)
        fname = os.path.join(screenshot_dir, f"{item_id}_{param_value}.png")
        
        driver.save_screenshot(fname)
        logger.info(f"保存截图到 {fname}")
        
        # 上传至OSS(省略具体实现,根据实际情况添加)
        upload_to_oss(fname)
        
        # 发送完成通知
        notify_completion(item_id, param_value, fname)
        
        logger.info(f"完成处理项【{item_id}】对应参数【{param_value}】")
    except Exception as e:
        logger.error(f"处理项【{item_id}】对应参数【{param_value}】时发生异常: {e}")

def upload_to_oss(file_path):
    """上传文件到阿里云OSS"""
    auth = oss2.Auth(config.get('oss', 'access_key_id'), config.get('oss', 'access_key_secret'))
    bucket = oss2.Bucket(auth, config.get('oss', 'endpoint'), config.get('oss', 'bucket_name'))
    remote_path = os.path.relpath(file_path, config.get('engine', 'image_path'))
    bucket.put_object_from_file(remote_path, file_path)

def notify_completion(item_id, param_value, image_path):
    """发送完成通知"""
    producer.send(config.get('kafka', 'notify_topic'), {
        'itemId': item_id,
        'paramValue': param_value,
        'imagePath': image_path
    })

6. 启动Kafka消费者

启动Kafka消费者,监听消息并调用处理函数:

if __name__ == "__main__":
    consumer = KafkaConsumer(
        config.get('kafka', 'topic'),
        bootstrap_servers=config.get('kafka', 'bootstrap_servers').split(','),
        group_id=config.get('kafka', 'consumer_group'),
        auto_offset_reset='latest',
        enable_auto_commit=True,
        value_deserializer=lambda m: m.decode('utf-8')
    )

    for msg in consumer:
        try:
            process_task(msg)
        except Exception as ex:
            logger.error(f"消费消息发生异常: {ex}")

总结

通过上述简化步骤,你可以快速搭建一个基于Python和Selenium的图像引擎。该引擎能够从Kafka接收任务指令,访问指定网站,截取页面快照,并将截图上传到阿里云OSS。此版本去除了不必要的复杂性,专注于核心功能的实现。

到此这篇关于使用Python和Selenium构建一个自动化图像引擎的文章就介绍到这了,更多相关Python Selenium构建图像引擎内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Python编写一个验证码图片数据标注GUI程序附源码

    Python编写一个验证码图片数据标注GUI程序附源码

    这篇文章主要介绍了Python编写一个验证码图片数据标注GUI程序,本文给大家附上小编精心整理的源码,需要的朋友可以参考下
    2019-12-12
  • 使用Python的requests库来发送HTTP请求的操作指南

    使用Python的requests库来发送HTTP请求的操作指南

    使用 Python 的 requests 库发送 HTTP 请求是非常简单和直观的,requests 库提供了丰富的 API,可以发送各种类型的 HTTP 请求,下面我会介绍一些常用的 HTTP 请求方式,并提供实际的代码示例,需要的朋友可以参考下
    2025-08-08
  • 解决Python2.7中IDLE启动没有反应的问题

    解决Python2.7中IDLE启动没有反应的问题

    今天小编就为大家分享一篇解决Python2.7中IDLE启动没有反应的问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-11-11
  • 使用pd.merge表连接出现多余行的问题解决

    使用pd.merge表连接出现多余行的问题解决

    本文主要介绍了使用pd.merge表连接出现多余行的问题解决,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-06-06
  • 基于Python编写一个单位转换(长度/温度)工具

    基于Python编写一个单位转换(长度/温度)工具

    这篇文章主要为大家详细介绍了如何开发一个Python单位转换工具,核心是通过嵌套字典存储各类单位转换关系,包括长度、温度等,感兴趣的小伙伴可以了解下
    2025-05-05
  • OpenManus安装教程

    OpenManus安装教程

    OpenManus是一个开源AIAgent平台,通过复刻Manus项目实现,OpenManus不仅复刻了Manus的核心功能,还具备模块化Agent系统,开发者可以根据需求自由组合不同的功能模块,创造出符合自己需求的AI助手‌,本文介绍OpenManus安装教程,感兴趣的朋友一起看看吧
    2025-03-03
  • PyTorch详解经典网络种含并行连结的网络GoogLeNet实现流程

    PyTorch详解经典网络种含并行连结的网络GoogLeNet实现流程

    今天小编就为大家分享一篇Pytorch实现GoogLeNet的方法,GoogLeNet提出了一个名为“Inception”的深度卷积神经网结构,其目标是将分类、识别ILSVRC14数据集的技术水平提高一个层次。这一结构的主要特征是对网络内部计算资源的利用进行了优化
    2022-05-05
  • python 如何用map()函数创建多线程任务

    python 如何用map()函数创建多线程任务

    这篇文章主要介绍了python 使用map()函数创建多线程任务的操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2021-04-04
  • 浅谈Python的自省Introspection和反射机制Reflection

    浅谈Python的自省Introspection和反射机制Reflection

    这篇文章主要介绍了浅谈Python的自省Introspection和反射机制Reflection,反射就是通过字符串的形式去对象(模块)中操作(查找/获取/删除/添加)成员,一种基于字符串的事件驱动,需要的朋友可以参考下
    2023-08-08
  • 小学生也能看懂的python语法之循环语句精解

    小学生也能看懂的python语法之循环语句精解

    这篇文章主要介绍了详解Python中的条件,循环语句,包括while循环for循环,循环语句是学习各个编程语言的最基本的基础知识,需要的朋友可以参考下
    2021-09-09

最新评论