[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://www.mzph.cn/web/43031.shtml

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

相关文章

LVS集群及其它的NAT模式

1.lvs集群作用&#xff1a;是linux的内核层面实现负载均衡的软件&#xff1b;将多个后端服务器组成一个高可用、高性能的服务器的集群&#xff0c;通过负载均衡的算法将客户端的请求分发到后端的服务器上&#xff0c;通过这种方式实现高可用和负载均衡。 2.集群和分布式&#…

用户增长 - 私域 - 社群运营自检清单SOP(社群运营30问)

Check List: 1.你的目标用户是谁&#xff1f; 2.你的目标用户有哪些需要立马解决的需求&#xff1f;有哪些长期需求&#xff1f;这些需求的优先级是什么&#xff1f; 3.做社群的目的是什么&#xff1f; 4.你的用户和业务是否适合做社群&#xff1f; 5.你做哪类社群才能更好的帮…

确定适合您需求的负载组

大多数关键任务行业都使用 UPS 和发电机等备用电源在停电期间为其设施提供持续电力。负载组允许您在需要时测试电源&#xff0c;以确保在您最需要的时候提供可靠的电力。 选择正确的负载组对于准确的电源测试至关重要。为了帮助您找到最适合您设施需求的负载组&#xff0c;EAK…

【机器学习】主成分分析(PCA):数据降维的艺术

&#x1f308;个人主页: 鑫宝Code &#x1f525;热门专栏: 闲话杂谈&#xff5c; 炫酷HTML | JavaScript基础 ​&#x1f4ab;个人格言: "如无必要&#xff0c;勿增实体" 文章目录 主成分分析&#xff08;PCA&#xff09;&#xff1a;数据降维的艺术引言PCA的基…

技术成神之路:设计模式(四)工厂方法模式

1.定义 工厂方法模式&#xff08;Factory Method Pattern&#xff09;是一种创建型设计模式&#xff0c;它提供了一种创建对象的接口&#xff0c;而不是通过具体类来实例化对象。工厂方法模式的主要作用是让子类决定实例化哪一个类&#xff0c;从而实现对象创建的延迟到具体子类…

2024年6月国产数据库大事记-墨天轮

本文为墨天轮社区整理的2024年6月国产数据库大事件和重要产品发布消息。 目录 2024年6月国产数据库大事记 TOP102024年6月国产数据库大事记&#xff08;时间线&#xff09;产品/版本发布兼容认证代表厂商大事记厂商活动相关资料 2024年6月国产数据库大事记 TOP10 2024年6月国…

【Python】已解决:SyntaxError invalid syntax

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

案例|水上水下一体化测量,为九寨沟精准把脉

​ 九寨沟&#xff0c;被誉为“人间仙境”&#xff0c;其湖群以独特的地理位置和优美的自然景观吸引着世界各地的游客&#xff0c;更是九寨沟生态系统中不可或缺的重要组成部分。因此&#xff0c;精准地掌握湖群的地形数据、水体分布及变化情况&#xff0c;能够揭示水下生态系…

【数据结构与算法基础】算法复杂度

欢迎光顾我的homepage 前言 算法就是定义良好的计算过程&#xff0c;它取一个活一组的值输入&#xff0c;并产生出一个或一组值作为输出。简单来说&#xff0c;算法就是一系列的计算步骤&#xff0c;用来将输入数据转化成输出结果。 一、算法效率 如何去衡量一个算法的好坏&am…

[C++]——同步异步日志系统(3)

同步异步日志系统 一、日志系统框架设计1.1模块划分1.1.1 日志等级模块1.1.2 日志消息模块1.1.3 日志消息格式化模块1.1.4 日志落地模块&#xff08;日志落地的方向是工厂模式&#xff09;1.1.5 日志器模块&#xff08;日志器的生成是建造者模式&#xff09;1.1.6 异步线程模块…

强化学习总结(有具体代码实现)

文章目录 第一部分 强化学习基础第1章 强化学习概述1.1 强化学习概念1.2 强化学习的环境1.3 强化学习的目标1.4 强化学习的数据 第2章 多臂老虎机问题&#xff08;MAB问题&#xff09;2.1 问题描述2.1.1 问题定义2.1.2 形式化描述2.1.3 累积懊悔2.1.4 估计期望奖励 2.2 解决方法…

【机器学习】必会数学知识:一文掌握数据科学核心数学知识点(上),值得收藏~

核心数学知识点 1、引言2、数据科学必会数学知识2.1 线性代数2.2 微积分2.3 概率论2.4 数理统计2.5 随机过程2.6 数据分布2.7 贝叶斯统计2.8 线性回归2.9 逻辑回归2.10 矩阵分解2.11 主成分分析&#xff08;PCA&#xff09;2.12 奇异值分解&#xff08;SVD&#xff09; 3、总结…

【人工智能大语言模型技术发展研究报告 2024】

文末‍有福利&#xff01; 人工智能作为引领新一轮科技产业革命的战略性技术和新质生产力重要驱动力&#xff0c;正在引发经济、社会、文化等领域的变革和重塑&#xff0c;2023 年以来&#xff0c;以 ChatGPT、GPT-4 为代表的大模型技术的出台&#xff0c;因其强大的内容生成及…

提升教师健康,聚焦智慧校园人事系统的职工体检功能

智慧校园人事管理系统内置的职工体检管理&#xff0c;是专为教职员工设计的一项健康管理创新实践&#xff0c;巧妙融合先进信息技术&#xff0c;致力于为教职工提供更加便捷、易懂且持续性的健康检查与管理支持。该服务从多个维度出发&#xff0c;全面呵护教职工的身心健康。 该…

给你的博客加上评论区

一个网站如果有评论功能&#xff0c;可以更好的和读者互动。VuePress 也有很多评论插件&#xff0c;这里简单介绍下&#xff0c;最后介绍本站所使用的 Twikoo。 大部分评论插件都是使用的 Github 或 Gitee 的 issue 功能&#xff0c;也就是用 issue 去存储评论&#xff1b;而 …

脚本实现保留文本中特定字符之后的字符串

#目的背景 原始txt文本如下图 目的是为了去除序号&#xff0c;每行只单独呈现域名 手工删除漫长又麻烦&#xff0c;使用脚本快捷些 代码实现逻辑&#xff1a; 1.使用open函数打开文本&#xff0c;之后用变量lines存储文本的所有行&#xff0c;使用for循环&#xff0c;让变量te…

暑假学习计划怎么做 用待办计划软件安排更科学

暑期来临&#xff0c;无论是学生还是老师&#xff0c;做好暑期计划都至关重要。记得去年暑假&#xff0c;我给自己定下了阅读十本书的目标&#xff0c;却因为缺乏明确的计划&#xff0c;最后只草草读完了两本。而今年&#xff0c;我决定尝试一种新的方式——使用待办计划软件来…

谷粒商城实战笔记-24-分布式组件-SpringCloud Alibaba-Nacos配置中心-命名空间与配置分组

文章目录 一&#xff0c;命名空间1&#xff0c;简介1.1&#xff0c;命名空间的主要功能和特点1.2&#xff0c;使用场景1.3&#xff0c;如何指定命名空间 2&#xff0c;命名空间实战2.1&#xff0c;环境隔离2.2&#xff0c;服务隔离 二&#xff0c;配置集三&#xff0c;配置集ID…

js原型和类---prototype,__proto__,new,class

原型和原型链 在js中&#xff0c;所有的变量都有原型&#xff0c;原型也可以有原型&#xff0c;原型最终都指向Object 什么是原型 在js中&#xff0c;一个变量被创建出来&#xff0c;它就会被绑定一个原型&#xff1b;比如说&#xff0c;任何一个变量都可以使用console.log打…

PostgreSQL 中如何实现数据的增量更新和全量更新的平衡?

文章目录 一、增量更新与全量更新的概念增量更新全量更新 二、考虑的因素1. 数据量2. 数据更改的频率和规模3. 数据一致性要求4. 系统性能和资源利用5. 业务逻辑和流程 三、解决方案&#xff08;一&#xff09;混合使用增量更新和全量更新&#xff08;二&#xff09;使用临时表…