【自动化】如何从列表中找到图片并命名保存下来

ops/2024/11/28 23:27:09/

以下是对这段 Python 代码的分析:

代码功能概述

这段代码主要使用了 DrissionPage 库(看起来是用于自动化网页操作相关的库)来与浏览器(基于 Chromium 内核)进行交互,实现以下功能:

  1. 打开豆瓣图书最新页面,并等待 1 秒让页面加载完成。
  2. 对整个页面进行截图保存为 ./img1/pic.jpg
  3. 循环 3 次,每次在当前页面查找所有符合 x://li[@class="media clearfix"] 选择器的元素(可能代表每本图书的相关元素),然后获取图书的名称、封面图片的链接,并下载封面图片保存到 ./img/ 目录下(文件名以图书名称命名),每成功下载一个封面图片会打印相应提示信息。之后点击页面上的 “后页” 按钮进行翻页,同时等待页面开始加载新内容。

代码可能存在的问题及改进点

1. 导入模块问题

如果 DrissionPage 库没有正确安装,代码在运行时会出现 ModuleNotFoundError 导入模块失败的错误。需要提前确保通过 pip 等包管理工具正确安装该库,例如在命令行执行 pip install DrissionPage(假设它在 Python 包索引中有发布)。

2. 元素定位稳定性

代码中使用的 x:// 这种定位方式(推测是 DrissionPage 自定义的定位语法)选择元素,其准确性依赖于网页的 HTML 结构是否稳定。如果豆瓣图书页面的 HTML 结构发生变化,比如图书列表项的 class 属性改变了,或者内部元素的层级结构调整了,那么像 x://li[@class="media clearfix"] 等选择器可能就无法正确定位到元素,导致代码后续获取图书信息、封面等操作失败。可以考虑增加一些异常处理逻辑,比如当定位元素失败时进行适当提示或者尝试其他备用的定位方式。

3. 保存图片相关问题
  • 文件名合法性:图书名称有可能包含一些操作系统不允许作为文件名的特殊字符(如 /\:* 等),直接用图书名称作为文件名保存图片可能会导致保存失败。需要对名称进行适当的处理,比如去除或替换这些非法字符,可以使用 Python 的 re 模块结合正则表达式来实现。
  • 图片下载的可靠性:在下载图片时只是简单地调用了某个保存方法(代码中的 img.save ,具体实现依赖 DrissionPage 库),没有对下载失败等情况做额外处理,比如网络问题导致图片下载中断等情况。可以添加代码来检查图片是否真的完整下载成功,比如检查文件大小是否符合预期或者验证图片文件的完整性等。
4. 翻页逻辑可能的问题
  • 点击 “后页” 的有效性:代码中直接通过 page("后页>").click() 来点击 “后页” 按钮,依赖于页面上有对应文本为 “后页” 且能被正确识别点击的元素存在,如果页面的翻页按钮文字或者结构变化,这行代码就会失效。可以通过更稳定的定位方式,比如通过查找具有特定 id 或者符合特定相对位置等条件的按钮元素来进行点击操作。
  • 加载等待问题:代码中使用 page.wait.load_start() 等待页面加载开始,但可能更好的做法是等待页面加载完成(例如等待某些关键元素出现或者页面状态变为 ready 等),仅等待加载开始可能后续操作会因为页面还未完全加载而出现元素找不到等错误情况。可以使用 page.wait.load_end() (如果 DrissionPage 库有提供这样的方法来等待加载结束)之类更合适的等待机制。

以下是一种简单的改进示例(仅示意对文件名处理和增加部分异常处理逻辑方面,假设 DrissionPage 库相关方法按常规预期工作,其他如更稳定的元素定位等完整改进会更复杂):

import re
from DrissionPage._pages.chromium_page import ChromiumPagepage = ChromiumPage()
page.get("https://book.douban.com/latest?subcat=%E5%85%A8%E9%83%A8")
page.wait(1)
page.get_screenshot(path='./img1/', name="pic.jpg", full_page=True)for i in range(3):for book in page.eles('x://li[@class="media clearfix"]'):name = book.ele('x://h2[@class="clearfix"]/a').text# 处理文件名中的非法字符,替换为下划线等合法字符valid_name = re.sub(r'[^\w\.]', '_', name)url = book.ele('x://img[@class="subject-cover"]').attr('src')img = book('x://img')try:img.save(path="./img/", name=f"{valid_name}.jpg")print(f"图书封面img.src{name}下载成功")except Exception as e:print(f"图书封面 {name} 下载失败,原因: {str(e)}")try:page("后页>").click()print(i)page.wait.load_end()  # 改为等待加载结束except Exception as e:print(f"翻页操作失败,原因: {str(e)}")

总之,这段代码实现了一个简单的豆瓣图书页面信息抓取和封面图片下载的自动化流程,但在实际应用中,为了保证其稳定性和可靠性,需要对上述提到的一些方面进行进一步优化和完善。


http://www.ppmy.cn/ops/137502.html

相关文章

ARM(安谋) China处理器

0 Preface/Foreword 0.1 参考博客 Cortex-M23/M33与STAR-MC1星辰处理器 ARM China,2018年4月established,独立运行。 1 处理器类型 1.1 周易AIPU 1.2 STAR-MC1(星辰处理器) STAT-MC1,主要为满足AIOT应用性能、功…

小米note pro一代(leo)线刷、twrp、magisk、TODO: android源码编译

本文主要说android5 整体思路 android 5.1 twrp magisk Zygisk(Riru) Dreamland(xposed) Riru不支持android5.1, 因此只能选择Zygisk : 如果你正在使用 Android 5,你必须使用 Zygisk 因为 Riru 并不支持 Android 5. 基于magisk之上的xposed 其中提到的 作者…

SQL盲注攻击详解及防御措施

文章目录 基于布尔的盲注工作原理示例代码防御措施 基于时间的盲注工作原理示例代码防御措施 其他防御措施输入验证错误处理使用WAF(Web应用防火墙) 基于布尔的盲注 工作原理 基于布尔的盲注通过构造SQL查询来判断数据库的响应是否满足某个条件。攻击者…

unity 使用UI上的数字按钮,给text添加数字,并且显示光标,删除光标前数字,

今天有个需求,输入身份证,但是不用键盘,要点击按钮输入数字,并且可以控制光标, 1、数字按钮:点击后text添加数字内容 2、删除按钮:删除光标前的一个字符 3、左箭头:移动光标向左移动…

centos和ubuntu有什么区别?

CentOS与Ubuntu的区别在于以下几个方面:1、源码基础不同;2、设计理念不同;3、使用场景不同;4、软件包管理不同;整体上看,CentOS更倾向于企业级服务器应用,稳定性较强;而Ubuntu更注重…

蓝桥杯每日真题 - 第21天

题目:(空间) 题目描述(12届 C&C B组A题) 解题思路: 转换单位: 内存总大小为 256MB,换算为字节: 25610241024268,435,456字节 计算每个整数占用空间: 每个 32 位整数占用…

物联网实验室建设方案

一、物联网实验室建设 (1) 基础理论教学云平台 唯众基础理论教学云平台是一个专为物联网相关专业教学打造的综合性在线教学平台。该平台凭借先进的技术架构和丰富的教学资源,为师生提供了一个高效、便捷、互动的学习环境。以下是该平台的主要特点和功能描述&#…

2023年十四届蓝桥杯Scratch01月stema选拔赛—鹦鹉学舌

第14届蓝桥杯Scratch01月stema选拔赛真题 点击下方链接,查看程序演示效果: https://www.hixinao.com/scratch/creation/show-331.html 如需查看选择题、编程题、全套真题可自行前往题库中心,按需查找~ 题库中心支持在线刷题&…