[Python自动化办公]--从网页登录网易邮箱进行邮件搜索并下载邮件附件

[Python自动化办公]–从网页登录网易邮箱进行邮件搜索并下载邮件附件

使用说明

​ 本文使用Python的selenium库进行操作邮箱登录、固定名称搜索邮件并下载附件,Python版本:3.9.16, selenium版本:4.19.0,EdgeBrowser版本:126.0.2592.87。

准备工作

安装Python及selenium不多赘述,可自行搜索安装,除了具备基本的Python编程知识外还需要了解网页知识。
安装Edge浏览器驱动:
查看当前使用的Edge浏览器版本:设置 -->关于 即可查看

在这里插入图片描述

驱动下载地址

下载并解压缩。记住文件路径,后面会用到。(浏览器会定期更新的话需要及时更新驱动)

编写代码

首先给出一段完整的代码,再来分步骤讲解。

完整demo
from selenium import webdriver
from selenium.webdriver.edge.service import Service
from selenium.webdriver.edge.options import Options
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.keys import Keys
from datetime import datetime, timedelta
import timedef input_info():'''用于生成文件名称字符如果你需要自动下载的邮件名称是每天根据日期变化的可以参考此函数进行适当修改'''# 获取当天日期today = datetime.now().date()# 获取当天日期减去2天的日期target_date = today - timedelta(days=2)# 格式化日期为“4月6日”的形式formatted_date = target_date.strftime("%m月%d日").lstrip("0").replace("月0", "月")# 拼接字符串res = formatted_date + "你要的邮件"return resdriver_path = r"C:\Users\JA043204\Desktop\getMail\edgedriver_win64\msedgedriver.exe"
edge_options = Options()
edge_options.use_chromium = True  # 如果正在使用新的基于 Chromium 的 Edge,设置为 True
service = Service(executable_path=driver_path)driver = webdriver.Edge(service=service, options=edge_options)# 打开登录页面
driver.get("https://mailh.qiye.163.com/")# 填写用户名和密码
usrname = "yourusrname" # 需替换为自己的用户名
pwd = "yourpwd" # 需替换为自己的密码try:# 在 Selenium 4 中,推荐使用 find_element 方法代替 find_element_by_* 方法driver.find_element("id", "account_name").send_keys(usrname)driver.find_element("id", "password").send_keys(pwd)# 点击登录按钮driver.find_element("id", "submit-btn").click()# 等待一段时间,确保登录成功后的页面加载完成time.sleep(5)# 执行登录后的操作,比如获取用户信息等# 比如,获取登录后的页面标题print(driver.title)# 找到搜索的input框,并输入"质量部基础数据"input_box = driver.find_element(By.XPATH,'//input[@placeholder="搜索邮件"]')input_box.send_keys(input_info())# 发送回车键操作,触发搜索或相应的动作input_box.send_keys(Keys.RETURN)time.sleep(2)# 使用显式等待尝试定位元素target_div = WebDriverWait(driver, 3).until(EC.presence_of_element_located((By.XPATH, ('//span[@class="summary-content summary-content-maxwidth"]'))))target_div.click() # 点击打开邮件time.sleep(2)# 找到邮件后定位到打包下载邮件附件相关元素tar_a = WebDriverWait(driver, 5).until(EC.presence_of_element_located((By.XPATH, '//span[@class="save-all"]')))driver.execute_script("arguments[0].click();", tar_a)finally:# 关闭浏览器if input("是否关闭浏览器? (y/n): ").lower().startswith('y'):driver.quit()
导入必要包
  1. from selenium import webdriver:
    • 导入 Selenium 的 WebDriver 类,用于启动浏览器和执行操作。
  2. from selenium.webdriver.edge.service import Service:
    • 导入 Edge 浏览器的 Service 类,用于配置和启动 Edge 浏览器的 WebDriver 服务。
  3. from selenium.webdriver.edge.options import Options:
    • 导入 Edge 浏览器的 Options 类,用于设置 Edge 浏览器的选项,如设置浏览器启动参数。
  4. from selenium.webdriver.support.ui import WebDriverWait:
    • 导入 WebDriverWait 类,用于显式等待页面元素加载并设定等待条件。
  5. from selenium.webdriver.common.by import By:
    • 导入 By 类,用于指定查找元素的方法,例如通过 ID、Class Name、XPath 等。
  6. from selenium.webdriver.support import expected_conditions as EC:
    • 导入 expected_conditions 模块,这是 WebDriverWait 的一部分,包含了预期条件,如元素可见、元素存在、元素包含文本等。
配置浏览器驱动
driver_path = r"C:\Users\JA043204\Desktop\getMail\edgedriver_win64\msedgedriver.exe" # 替换为准备工作中的路径
edge_options = Options()
edge_options.use_chromium = True  # 如果正在使用新的基于 Chromium 的 Edge,设置为 True
service = Service(executable_path=driver_path)driver = webdriver.Edge(service=service, options=edge_options)
打开网页

使用 driver.get()方法,传入参数为登录界面url。

从浏览器中定位元素
  1. 从浏览器打开登录界面,然后 按下F12 打开开发工具。
    在这里插入图片描述

  2. 使用检查元素来定位网页内容
    在这里插入图片描述

    先点击检查元素工具图标,然后点击用户名输入框
    在这里插入图片描述

这样就能快速找到该元素网页源码的位置

使用selenium定位元素
  1. 通过元素 ID 定位:
    使用 find_element_by_id 方法可以通过元素的 ID 属性来定位元素。例如:

    element = driver.find_element_by_id("element_id")
    
  2. 通过元素名称定位:
    使用 find_element_by_name 方法可以通过元素的名称属性来定位元素。例如:

    element = driver.find_element_by_name("element_name")
    
  3. 通过类名定位:
    使用 find_element_by_class_name 方法可以通过元素的类名来定位元素。注意,如果有多个元素具有相同的类名,它会返回第一个匹配的元素。例如:

    element = driver.find_element_by_class_name("element_class")
    
  4. 通过标签名定位:
    使用 find_element_by_tag_name 方法可以通过元素的标签名来定位元素。例如:

    element = driver.find_element_by_tag_name("tag_name")
    
  5. 通过链接文本定位:
    使用 find_element_by_link_text 方法可以通过链接的文本内容来定位元素。例如:

    element = driver.find_element_by_link_text("Link Text")
    
  6. 通过部分链接文本定位:
    使用 find_element_by_partial_link_text 方法可以通过链接的部分文本内容来定位元素。例如:

    element = driver.find_element_by_partial_link_text("Partial Link Text")
    
  7. 通过 XPath 表达式定位:
    使用 find_element_by_xpath 方法可以通过 XPath 表达式来定位元素。XPath 是一种强大的定位方式,可以根据元素的层次结构、属性等来精确定位元素。例如:

    element = driver.find_element_by_xpath("//div[@id='example']/p[1]")
    
  8. 通过 CSS 选择器定位:
    使用 find_element_by_css_selector 方法可以通过 CSS 选择器来定位元素。CSS 选择器也是一种强大的定位方式,可以根据元素的样式、层次结构等来定位元素。例如:

    element = driver.find_element_by_css_selector("div#example > p:first-child")
    

在完整demo代码中只用到了元素ID定位和XPath定位,以上是不同的定位方式,可根据个人喜好选择使用,下面再介绍一下啊XPath表达式定位:XPath 是一种用于在 XML 文档中定位和选择元素的查询语言。它同样适用于 HTML 文档,因为 HTML 也可以被视为一种 XML 变体。以下是 XPath 的基本写法和一些常用的表达式:

  1. 选择元素
    • 绝对路径:从根节点开始的路径,以斜杠 / 开头。例如:/html/body/div
    • 相对路径:相对于当前节点的路径,以双斜杠 // 开头。例如://div/p
  2. 谓语(Predicate):用于过滤元素的附加条件,放在方括号内。
    • 例如://div[@class='content'] 选择 class 属性为 ‘content’ 的 div 元素。
  3. 选取节点
    • nodename:选择所有指定节点名的元素。例如://div 选择所有 div 元素。
    • *:选择当前节点的所有子元素。
    • @attribute:选择当前节点的指定属性。例如://@href 选择所有 href 属性。
    • text():选择当前节点的文本内容。
  4. 逻辑运算符
    • and, or, not:用于组合多个条件。
  5. (Axis):用于指定相对于当前节点的节点集合。
    • ancestor, parent, child, following-sibling, preceding-sibling 等。
  6. 通配符
    • *:匹配任何元素节点。
    • @*:匹配任何属性节点。
  7. 函数
    • name():获取当前节点的名称。
    • contains():检查一个字符串是否包含另一个字符串。
    • text():获取当前节点的文本内容。

例如,以下是一些示例 XPath 表达式:

  • //div[@id='content']:选择 id 属性为 ‘content’ 的所有 div 元素。
  • //a[@href='https://example.com']:选择所有 href 属性为 ‘https://example.com’ 的 a 元素。
  • //div[@class='main']//p:选择 class 属性为 ‘main’ 的 div 元素下的所有 p 元素

比如现在我需要定位用户名输入框,那么根据网页源码可以写Xpath表达式为: //input[@id='account_name']

然后再网页元素界面按下 Ctrl+F会跳出查找框,输入你写好的的XPath表达式后按下回车
在这里插入图片描述

可以看到查询结果之后在搜索框右侧有 1 of 1 字样表示当前是符合表达的结果中的唯一一个,定位的位置和刚才查找的网页源码一致,说明是我们想要的结果。

对网页元素进行操作

下面是操作详解:

  1. 定位元素:为了在网页上进行任何操作,Selenium需要首先找到需要操作的元素。定位元素通常通过选择器来完成,如ID、class、tag name、name、link text、partial link text、css selector或XPath。例如,driver.find_element_by_id("username")会找到ID为username的元素。
  2. 操作输入框:可以通过send_keys方法向输入框(通常是<input>标签)发送输入,如用户名或密码。例如,username_field.send_keys("myusername")
  3. 点击按钮:使用click()方法可以点击按钮或链接。例如,submit_button.click()会点击ID为submit_button的按钮。
  4. 提交表单:通过点击<form>标签上的提交按钮,或者直接调用submit()方法可以在表单提交时触发动作。例如,form.submit()会提交表单。
  5. 获取和设置元素属性:可以通过get_attribute()方法获取元素的属性值,还可以利用set_attribute()方法设置属性值。例如,element.get_attribute("class")会获取元素的class属性值。
  6. 执行JavaScript:Selenium提供了一个execute_script()方法,可以用来执行任何JavaScript代码。这意味着可以通过JavaScript与DOM交互来完成操作。
  7. 处理下拉框:可以使用select_by_visible_text()select_by_index()select_by_value()等方法来选择下拉框中的选项。这些方法位于Select类中。例如,dropdown.select_by_visible_text("option2")会选择下拉框中的可见文本为option2的选项。
  8. 处理弹出框:Selenium提供了的方法来处理JavaScript警告、确认框和提示框。例如,alert.accept()会确认一个警告框。
  9. 切换窗口:当网页上打开新窗口时,Selenium提供的方法switch_to.window可以用来切换到另一个窗口或标签页。例如,`driver.switch_to.window

对于登录界面我们要做的是,输入用户名和密码然后按下登录按钮也就是用到了 send_keys()click()方法

但是网页中的某些元素被JavaScript或css限制不可见或者不可点击,那么无法使用使用 click(),这时候需要通过execute_script()来完成点击操作。

比如完整demo中的 driver.execute_script("arguments[0].click();", tar_a)

然后解释一下下面这段代码

tar_a = WebDriverWait(driver, 5).until(EC.presence_of_element_located((By.XPATH, '//span[@class="save-all"]')))
  1. WebDriverWait(driver, 5):
    • WebDriverWait 是 Selenium 提供的等待方式,它会在指定的时间内等待某个条件成立后继续执行下面的代码。
    • driver 是你创建的 WebDriver 实例,用于控制浏览器的操作。
    • 5 是最长等待时间,即最多等待5秒。
  2. .until() 方法:
    • until() 方法是 WebDriverWait 的一个函数,它接受一个条件(Expected Condition,EC)作为参数,并且会不断地调用这个条件,直到返回 True 或者超过最长等待时间为止。
  3. EC.presence_of_element_located((By.XPATH, '//span[@class="save-all"]')):
    • EC.presence_of_element_located 是预定义的一个条件,表示等待直到页面上至少出现一个满足条件的元素。
    • (By.XPATH, '//span[@class="save-all"]') 是定位元素的方式,指定了使用 XPath 来找到页面上 class 属性为 "save-all"span 元素。
  4. tar_a = ...:
    • 最后将等待到的元素赋值给变量 tar_a,这样就可以进一步操作这个元素了。

综上所述,这段代码的作用是等待页面中的一个 span 元素,该元素的 class 属性为 "save-all",等待时间最多为5秒。一旦找到该元素,就将它赋值给变量 tar_a,以便后续对该元素进行操作,比如点击或者获取其文本内容等。

an[@class=“save-all”]')是定位元素的方式,指定了使用 XPath 来找到页面上class属性为"save-all"span元素。 4. tar_a = …: - 最后将等待到的元素赋值给变量 tar_a`,这样就可以进一步操作这个元素了。

综上所述,这段代码的作用是等待页面中的一个 span 元素,该元素的 class 属性为 "save-all",等待时间最多为5秒。一旦找到该元素,就将它赋值给变量 tar_a,以便后续对该元素进行操作,比如点击或者获取其文本内容等。

最后,对于网页验证这一步骤在这个示例中不涉及,可以从代码中启动网页,填写信息登录后获取手机验证码并填写,之后一段时间网站cookie会保留登录信息。

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

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

无线网的ip地址固定吗

在数字化日益普及的今天&#xff0c;无线网络已成为我们生活与工作中不可或缺的一部分。然而&#xff0c;对于许多非专业用户来说&#xff0c;无线网络背后的技术细节仍然充满了神秘感。其中&#xff0c;一个常见的问题是&#xff1a;无线网的IP地址是固定的吗&#xff1f;本文…

使用“nvm use 版本号“命令无效

使用"nvm use 版本号"命令无效 为什么无效?解决 为什么无效? 解决 将这个nodejs文件夹删除,然后在运行nvm use 版本号,则 node生效.

QT开发积累——qt中的注释和多行注释的几种方式,函数方法注释生成

目录 引出qt中的注释和多行注释方法的注释生成 总结日积月累&#xff0c;开发集锦方法参数加const和不加const的区别方法加static和不加static的区别Qt遍历list提高效率显示函数的调用使用&与不使用&qt方法的参数中使用&与不使用&除法的一个坑 项目创建相关新建…

window下载安装clang

执行clang报错&#xff1a; c:/>clang test.cclang: warning: unable to find a Visual Studio installation; try running Clang from a developer command prompt [-Wmsvc-not-found] clang: error: unable to execute command: program not executable clang: error: li…

数据隐私: 什么是数据隐私以及如何保护数据安全?

什么是数据隐私&#xff1f; 数据隐私&#xff08;或信息隐私&#xff09;是数据保护的一个领域。它指的是个人可以决定何时、如何以及在多大程度上与他人分享或交换他们的个人数据。 换句话说&#xff0c;数据隐私围绕着用户的个人数据如何被收集、存储、管理和与第三方共享…

Win-ARM联盟的端侧AI技术分析

Win-ARM联盟&#xff0c;端侧AI大幕将起 微软震撼发布全球首款AI定制Windows PC——Copilot PC&#xff0c;搭载全新NPU与重塑的Windows 11系统&#xff0c;纳德拉盛赞其为史上最快、最强、最智能的Windows PC。该设备算力需求高达40TOPS&#xff0c;支持语音翻译、实时绘画、文…

NesT : 嵌套层次Transformer

探讨了在不重叠的图像块上嵌套基本局部变换的思想,并以分层的方式对它们进行聚合。发现块聚合功能在实现跨块非局部信息通信中起着至关重要的作用。 这个观察结果引导我们设计一个简化的体系结构,它需要在原始视觉转换器上进行少量的代码更改。所提出的明智选择的设计有三个好…

【Spring Boot 教程:从入门到精通】掌握 Spring Boot 开发技巧与窍门(一)-java语法(1)

一些Java基本语法的基本介绍&#xff0c;语法更新结束会紧跟项目实战&#xff0c;后续会持续在该专栏进行更新&#xff01;&#xff01;&#xff01; 目录 前言 一、基本概念 1.JDK、JRE、JVM的关系&#xff1a; 2.JDK版本选择 3.Java代码的编译运行流程 4.JSE、JEE、J…

SolidWorks滚花螺栓制作-cnblog

目标 规划基准图形 确定尺寸&#xff0c;单位mm 我 对固定好的图形进行旋转 倒角 设置螺纹 注意改变深度为15mm 收尾位置补全 滚花 建立基准面 制作多边形 添加穿透 扫描切除 圆周阵列 成品完成

[AI 快手 LivePortrait] 引领高效肖像动画新时代

快手推出了 LivePortrait&#xff0c;具有拼接和重定向控制的高效肖像动画。 快速开始 下载代码&#xff0c;准备环境 git clone https://github.com/KwaiVGI/LivePortrait cd LivePortrait# create env using conda conda create -n LivePortrait python3.9.18 conda activ…

Data-Juicer:阿里巴巴荣誉出品的大模型数据清洗框架

Diffusion Models专栏文章汇总:入门与实战 前言:如何优雅地进行大规模数据清洗是一门艺术,特别对于大模型,数据的质量是决定模型成功最关键的因素之一。阿里巴巴最近开源了一项专门针对大语言模型和视频生成大模型的数据清洗框架,值得关注! 目录 主要特点 数据处理 分…

移动校园(9):uniapp照片上传,以及从nodejs服务器获取照片

后端&#xff1a; 安装中间件multer,刚好对应前端提交数据 npm install --save multer Multer详解&#xff08;Node.js中间件&#xff09;-CSDN博客 一直这样 又看了二个小时&#xff0c;搜遍全网&#xff0c;改了又改&#xff0c;各种测试&#xff0c;终于让我发现了问题&a…

什么是数据同步服务RSYNC?

大家好呀&#xff01;这里是码农后端。今天来介绍一下数据同步服务RSYNC&#xff0c;作为Linux/Unix系统中远程或本地复制同步&#xff08;复制&#xff09;文件和目录最常用的命令&#xff0c;相比于scp命令&#xff0c;其具有增量备份、数据同步时保持文件的原有属性等优点。…

制作电子名片的小程序系统源码 快速生成电子名片

在当今数字化时代&#xff0c;传统的纸质名片已逐渐被智能电子名片所取代。电子名片小程序作为一种基于微信生态的创新名片交换方式&#xff0c;凭借其便捷性、高效性和环保性&#xff0c;成为了众多商务人士的首选。小编分享一个制作电子名片的小程序系统源码&#xff0c;无忧…

GitHub 站点打不开

遇到的问题 您是否遇到过GitHub网站打不开的情况&#xff0c;正如下图所示&#xff1a; 解决方案 以下是一些常见的解决方案&#xff1a; 1. 检查网络连接 确保你的设备已连接到互联网。尝试访问其他网站&#xff0c;确保不是你的网络问题。 C:\Vinca>ping github.…

Groovy vs Kotlin 在Gradle配置文件中的差异与选择

人不走空 &#x1f308;个人主页&#xff1a;人不走空 &#x1f496;系列专栏&#xff1a;算法专题 ⏰诗词歌赋&#xff1a;斯是陋室&#xff0c;惟吾德馨 目录 &#x1f308;个人主页&#xff1a;人不走空 &#x1f496;系列专栏&#xff1a;算法专题 ⏰诗词歌…

ArkUI开发学习随机——B站视频简介页面,美团购买界面

案例一&#xff1a;B站视频简介页面 代码&#xff1a; build() {Column(){Column(){Stack(){Image($r("app.media.genimpact")).width(200).height(125).borderRadius({topLeft:5,topRight:5})Row(){Image($r("app.media.bz_play")).height(24).fillColor…

【独家揭秘】视频号矩阵系统火爆上线,一键式多平台管理,你的内容营销神器!

在信息爆炸的时代&#xff0c;内容创作者们面临着前所未有的挑战与机遇。如何让自己的内容在众多平台中脱颖而出&#xff0c;快速传播并吸引大量观众&#xff0c;成为了每个创作者关注的焦点。近日&#xff0c;一款名为“迅狐视频号矩阵系统”的神器震撼来袭&#xff0c;它以其…

全面解析BPMN、CMMN、DMN与XML

欢迎来到我的博客&#xff0c;代码的世界里&#xff0c;每一行都是一个故事 &#x1f38f;&#xff1a;你只管努力&#xff0c;剩下的交给时间 &#x1f3e0; &#xff1a;小破站 全面解析BPMN、CMMN、DMN与XML 前言BPMN&#xff08;业务流程模型与标记法&#xff09;定义与用途…

【Python】已解决:SyntaxError invalid syntax

文章目录 一、分析问题背景二、可能出错的原因三、错误代码示例四、正确代码示例五、注意事项 已解决&#xff1a;SyntaxError invalid syntax 一、分析问题背景 在Python编程中&#xff0c;SyntaxError: invalid syntax是一个常见的错误&#xff0c;它通常表示代码中存在语法…