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

以下是对这段 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 ChromiumPage

page = 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)}")

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

地平线 bev_cft_efficientnetb3 参考算法-v1.2.1

01 概述 在自动驾驶感知算法中 BEV 感知成为热点话题,BEV 感知可以弥补 2D 感知的缺陷构建 3D “世界”,更有利于下游任务和特征融合。 地平线集成了基于 bev 的纯视觉算法,目前已支持 ipm-based 、lss-based、 transformer-based&#xff…

C#里怎么样检测文件的属性?

C#里怎么样检测文件的属性? 对于文件来说,在C#里有一种快速的方法来检查文件的属性。 比如文件是否已经压缩, 文件是否加密, 文件是否是目录等等。 属性有下面这么多: 例子演示如下: /** C# Program to View the Information of the File*/ using System; using Syste…

最新‌VSCode保姆级安装教程(附安装包)

文章目录 一、VSCode介绍 二、VSCode下载 下载链接:https://pan.quark.cn/s/19a303ff81fc 三、VSCode安装 1.解压安装文件:双击打开并安装VSCode 2.勾选我同意协议:然后点击下一步 3.选择目标位置:点击浏览 4.选择D盘安装…

传输控制协议(TCP)和用户数据报协议(UDP)

一、传输控制协议(TCP) 传输控制协议(Transmission Control Protocol,TCP)是一种面向连接的、可靠的、基于字节流的传输层通信协议,由 IETF 的 RFC 793 定义。 它通过三次握手建立连接,确保数…

linux从0到1——shell编程9

声明! 学习视频来自B站up主 **泷羽sec** 有兴趣的师傅可以关注一下,如涉及侵权马上删除文章,笔记只是方便各位师傅的学习和探讨,文章所提到的网站以及内容,只做学习交流,其他均与本人以及泷羽sec团队无关&a…

nature communications论文 解读

题目《Transfer learning with graph neural networks for improved molecular property prediction in the multi-fidelity setting》 这篇文章主要讨论了如何在多保真数据环境(multi-fidelity setting)下,利用图神经网络(GNNs&…

基于Qt/C++/Opencv实现的一个视频中二维码解析软件

本文详细讲解了如何利用 Qt 和 OpenCV 实现一个可从视频和图片中检测二维码的软件。代码实现了视频解码、多线程处理和界面更新等功能,是一个典型的跨线程图像处理项目。以下分模块对代码进行解析。 一、项目的整体结构 项目分为以下几部分: 主窗口 (M…

【Elasticsearch入门到落地】2、正向索引和倒排索引

接上篇《1、初识Elasticsearch》 上一篇我们学习了什么是Elasticsearch,以及Elastic stack(ELK)技术栈介绍。本篇我们来什么是正向索引和倒排索引,这是了解Elasticsearch底层架构的核心。 上一篇我们学习到,Elasticsearch的底层是由Lucene实…

鸿蒙主流路由详解

鸿蒙主流路由详解 Navigation Navigation更适合于一次开发,多端部署,也是官方主流推荐的一种路由控制方式,但是,使用起来入侵耦合度高,所以,一般会使用HMRouter,这也是官方主流推荐的路由 Navigation官网地址 个人源码地址 路由跳转 第一步-定义路由栈 Provide(PageInfo) pag…

java使用itext生成pdf

一、利用Adobe Acrobat DC软件创建pdf模板 备好Adobe Acrobat DC软件 1.excel/jpg/png文件转pdf文件 右击打开我们要转换的文件 2.然后点击 添加 域 3.可以看到域的名字 4.调整字体大小/对齐方式等 5.保存 二&#xff0c;代码部分 首先 上依赖 <dependency><group…

生成对抗网络模拟缺失数据,辅助PAMAP2数据集仿真实验

PAMAP2数据集是一个包含丰富身体活动信息的数据集&#xff0c;它为我们提供了一个理想的平台来开发和测试HAR模型。本文将从数据集的基本介绍开始&#xff0c;逐步引导大家通过数据分割、预处理、模型训练&#xff0c;到最终的性能评估&#xff0c;在接下来的章节中&#xff0c…

全面解析:HTML页面的加载全过程(一)--输入URL地址,与服务器建立连接

用户输入URL地址&#xff0c;与服务器建立连接 用户在浏览器地址栏输入一个URL 浏览器开始执行以下三步操作操作&#xff1a;url解析、DNS查询、TCP连接 第一步&#xff1a;URL解析 什么是URL&#xff1f; URL(Uniform Resource Locator&#xff0c;统一资源定位符)是互联网…

STM32总体架构简单介绍

目录 一、引言 二、STM32的总体架构 1、三个被动单元 &#xff08;1&#xff09;内部SRAM &#xff08;2&#xff09;内部闪存存储器 &#xff08;3&#xff09;AHB到APB的桥&#xff08;AHB to APBx&#xff09; 2、四个主动&#xff08;驱动&#xff09;单元 &#x…

postman 调用 下载接口(download)使用默认名称(response.txt 或随机名称)

官网地址&#xff1a;https://www.postman.com 介绍 Postman 是一款流行的 API 开发和测试工具&#xff0c;用于发送 HTTP 请求、测试接口、调试服务器响应以及进行 API 文档管理。它支持多种请求类型&#xff08;如 GET、POST、PUT、DELETE 等&#xff09;&#xff0c;并且功能…

JavaScript将至

JS是什么&#xff1f; 是一种运行在客户端&#xff08;浏览器&#xff09;的编程语言&#xff0c;实现人机交互效果 作用捏&#xff1f; 网页特效 (监听用户的一些行为让网页作出对应的反馈) 表单验证 (针对表单数据的合法性进行判断) 数据交互 (获取后台的数据, 渲染到前…

Vue.js 学习总结(13)—— Vue3 version 计数介绍

前言 Vue3.5 提出了两个重要概念&#xff1a;version计数和双向链表&#xff0c;作为在内存和计算方面性能提升的最大功臣。既然都重要&#xff0c;那就单挑 version 计数来介绍&#xff0c;它在依赖追踪过程中&#xff0c;起到快速判断依赖项有没有更新的作用&#xff0c;所以…

全面解析多种mfc140u.dll丢失的解决方法,五种方法详细解决

当你满心期待地打开某个常用软件&#xff0c;却突然弹出一个错误框&#xff0c;提示“mfc140u.dll丢失”&#xff0c;那一刻&#xff0c;你的好心情可能瞬间消失。这种情况在很多电脑用户的使用过程中都可能出现。无论是游戏玩家还是办公族&#xff0c;面对这个问题都可能不知所…

《Spring 实战:小型项目开发初体验》

一、引言 Spring 作为一款强大的 Java 开发框架&#xff0c;在小型项目开发中有着广泛的应用。本文将带你深入体验 Spring 在小型项目开发中的实战过程&#xff0c;从环境搭建到项目部署&#xff0c;全面展示 Spring 的魅力。 一、引言 Spring 作为一款强大的 Java 开发框架&…

Altium Designer学习笔记 11-15 原理图的封装 编译 检查 _PCB封装库的创建

基于Altium Designer 23学习版&#xff0c;四层板智能小车PCB 更多AD学习笔记&#xff1a;Altium Designer学习笔记 1-5 工程创建_元件库创建Altium Designer学习笔记 6-10 异性元件库创建_原理图绘制 目录 11、Value值的核对 12、封装的统一管理 13、原理图的编译设置和检查…

【Spring Boot】# 使用@Scheduled注解无法执行定时任务

1. 前言 在 Spring Boot中&#xff0c;使用Scheduled注解来定义定时任务时&#xff0c;定时任务不执行&#xff1b;或未在规定时间执行。 import org.springframework.scheduling.annotation.Scheduled; import org.springframework.stereotype.Component;Component public c…