利用Python结合Web技术实现图像引擎

本篇指南将教你如何使用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 oslogger = 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 oss2def 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。此版本去除了不必要的复杂性,专注于核心功能的实现。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/63608.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

iPhone 17 Air基本确认,3个大动作

近段时间,果粉圈都在讨论一个尚未发布的新品:iPhone 17 Air,苹果又要来整新活了。 从供应链消息来看,iPhone 17 Air本质上是Plus的替代品,主要是在维持“大屏”这一卖点的同时,增加了“轻薄”属性&#xff…

【Python】可调用对象

声明:以下内容均学习自《流畅的Python》一书 1、可调用对象 如果想判断对 象能否调用,可以使用内置的 callable() 函数。 # callable()检查是否可调用 [callable(obj) for obj in (abs, str, Ni!)] # [True, True, False] 9种可调用对象:…

H5 Admin后台管理系统、用户权限管理设计、按钮级别、数据级别、html+bootstrap后台管理前端界面设计

一、前言 一个高颜值后台管理模板,Light Year Admin后台管理系统模板是一个基于Bootstrap v3.3.7的纯HTML模板,目前也已经更新了基于Bootstrap 4.4.1的版本。都有iframe以及非iframe的两种不同的形式供大家选择使用。简洁而清新的后台模板,功…

Windows环境基于ecplise的spring boot框架新建spring start project

SpringToolSuite4 新建项目实例 前言Windows基于ecplise 工具的spring boot 架构 前言 使用Spring boot 框架向前端传输数据 Windows基于ecplise 工具的spring boot 架构 spring-tool-suite-4官网下载链接spring tool,下载太慢的话可以使用迅雷加速,右…

理解 CAP 理论:分布式系统中的权衡与选择 | 常用组件中的CP和AP

CAP定理是分布式系统设计中的一个基本定理,它指出在一个分布式计算系统中,一致性(Consistency)、可用性(Availability)、分区容忍性(Partition Tolerance)三者不可同时实现&#xff…

AttributeError: module ‘cv2.dnn‘ has no attribute ‘DictValue‘如何解决?

AttributeError: module cv2.dnn has no attribute DictValue如何解决? 出现场景出错原因解决方案 出现场景 当在代码中导入opencv的时候:import cv2,出现: 出错原因 查看大家出现的错误,发现是因为opencv版本问题…

Java Class类文件结构

🧑 博主简介:CSDN博客专家,历代文学网(PC端可以访问:https://literature.sinhy.com/#/literature?__c1000,移动端可微信小程序搜索“历代文学”)总架构师,15年工作经验,…

ThinkPHP开发的原生微信小程序二手物品回收小程序管理系统源码

二手物品回收小程序 一款基于ThinkPHP开发的原生微信小程序二手物品回收小程序管理系统。支持线上下单、免费上门取件、评估价格等功能。提供全部无加密源码,支持私有化部署。

【JAVA】Java项目实战—项目选择(Web应用、命令行工具等)

在Java开发中,选择合适的项目类型是成功的关键之一。Java是一种通用的编程语言,能够支持多种类型的应用程序开发,包括Web应用、命令行工具、桌面应用、移动应用等。每种项目类型都有其特定的应用场景、技术栈和开发模式。因此,理解…

力扣每日一题 - 1812. 判断国际象棋棋盘中一个格子的颜色

题目 还需要你前往力扣官网查看详细的题目要求 地址 1.给你一个坐标 coordinates ,它是一个字符串,表示国际象棋棋盘中一个格子的坐标。下图是国际象棋棋盘示意图。2.如果所给格子的颜色是白色,请你返回 true,如果是黑色&#xff…

教程|使用Conda安装AlphaFold3-个人记录以及遇到的问题

如果有用,感谢收藏、点赞、转发。 经过两天修改使用终于完成af3的安装以及样例测试。 !在clone之前可以看一下自己的编译版本比如:gxx_linux-64和gcc_linux-64 如果不行就利用conda更新 conda install gxx_linux-64 gxx_impl_linux-64 gcc_linux-64 gcc_impl_linux-64=13…

小程序给元素设置line-height为0引起页面更新无效

问题 在小程序中使用setData更新,数据更新完毕,页面却没有更新值,甚至出现渲染错乱现象; 发现 但当点击相应事件的时候,视图又更新了。 思考 开始认为是没有在dom渲染后进行数据更新产生的问题,换了方法执行…

分布式专题(1)之Redis持久化、主从与哨兵架构详解

一、Redis持久化 1.1 RDB快照(snapshot) 在默认的情况下,Redis将内存数据快照保存名字为:dump.rdb的二进制文件中,当然你在配置文件redis.conf中修改对应的二进制文件名。 redis开启RDB快照,可以在redis中…

MySQL Group Replication

参考文档: https://dev.mysql.com/doc/refman/8.4/en/group-replication-configuring-instances.html MySQL版本: mysql> select version(); ----------- | version() | ----------- | 8.4.3 | ----------- 1 row in set (0.00 sec)mysql> …

day1:ansible

ansible-doc <module_name>&#xff08;如果没有网&#xff0c;那这个超级有用&#xff09; 这个很有用&#xff0c;用来查单个模块的文档。 ansible-doc -l 列出所有模块 ansible-doc -s <module_name> 查看更详细的模块文档。 ansible-doc --help 使用 --help …

unity 2D像素种田游戏学习记录(自用)

一、透明度排序轴 改变sprite的排序方式&#xff0c;默认按照z轴进行排序&#xff08;离摄像机的远近&#xff09;。可以将其改变成y轴的排序方式&#xff0c;这样可以使2D人物走在草丛的下方就不被遮挡&#xff0c;走在草丛上方就被遮挡&#xff0c;如下图。 在项目设置-图形…

关于GaussDB

一、GaussDB的层级关系 &#xff0c;关于schemas的定位&#xff0c;到底是个什么&#xff0c;其实就可以理解为一个文件夹 数据库服务器 --> databases --> schemas --> tables schema类似于文件夹&#xff0c;一个数据库database里面可以有多个文件夹&#xff0c;每…

代码随想录第五十五天

并查集理论基础 并查集的本质是一种维护不相交集合的数据结构。其核心思想是用树形结构来表示集合&#xff0c;每个集合是一棵树。 基本概念 并查集维护了一个由不同元素构成的不相交集合每个集合用一棵树来表示&#xff0c;树的根节点是该集合的代表元素同一棵树中的所有节…

【CKA】Kubernetes(k8s)认证之CKA考题讲解

CKA考题讲解 0.考试101 0.1 kubectl命令⾃动补全 在 bash 中设置当前 shell 的⾃动补全&#xff0c;要先安装 bash-completion 包。 echo "source <(kubectl completion bash)" >> ~/.bashrc还可以在补全时为 kubectl 使⽤⼀个速记别名&#xff1a; al…

第4章:颜色和背景 --[CSS零基础入门]

在 CSS 中,颜色和背景属性是用于美化网页元素的重要工具。你可以通过多种方式定义颜色,并且可以设置元素的背景颜色、图像、渐变等。以下是关于如何在 CSS 中使用颜色和背景的一些关键点和示例。 1.颜色表示法 当然!以下是使用不同颜色表示法的 CSS 示例,包括 RGB、RGBA、…