[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()
导入必要包
from selenium import webdriver
:- 导入 Selenium 的 WebDriver 类,用于启动浏览器和执行操作。
from selenium.webdriver.edge.service import Service
:- 导入 Edge 浏览器的 Service 类,用于配置和启动 Edge 浏览器的 WebDriver 服务。
from selenium.webdriver.edge.options import Options
:- 导入 Edge 浏览器的 Options 类,用于设置 Edge 浏览器的选项,如设置浏览器启动参数。
from selenium.webdriver.support.ui import WebDriverWait
:- 导入 WebDriverWait 类,用于显式等待页面元素加载并设定等待条件。
from selenium.webdriver.common.by import By
:- 导入 By 类,用于指定查找元素的方法,例如通过 ID、Class Name、XPath 等。
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。
从浏览器中定位元素
-
从浏览器打开登录界面,然后 按下
F12
打开开发工具。
-
使用检查元素来定位网页内容
先点击检查元素工具图标,然后点击用户名输入框
这样就能快速找到该元素网页源码的位置
使用selenium定位元素
-
通过元素 ID 定位:
使用find_element_by_id
方法可以通过元素的 ID 属性来定位元素。例如:element = driver.find_element_by_id("element_id")
-
通过元素名称定位:
使用find_element_by_name
方法可以通过元素的名称属性来定位元素。例如:element = driver.find_element_by_name("element_name")
-
通过类名定位:
使用find_element_by_class_name
方法可以通过元素的类名来定位元素。注意,如果有多个元素具有相同的类名,它会返回第一个匹配的元素。例如:element = driver.find_element_by_class_name("element_class")
-
通过标签名定位:
使用find_element_by_tag_name
方法可以通过元素的标签名来定位元素。例如:element = driver.find_element_by_tag_name("tag_name")
-
通过链接文本定位:
使用find_element_by_link_text
方法可以通过链接的文本内容来定位元素。例如:element = driver.find_element_by_link_text("Link Text")
-
通过部分链接文本定位:
使用find_element_by_partial_link_text
方法可以通过链接的部分文本内容来定位元素。例如:element = driver.find_element_by_partial_link_text("Partial Link Text")
-
通过 XPath 表达式定位:
使用find_element_by_xpath
方法可以通过 XPath 表达式来定位元素。XPath 是一种强大的定位方式,可以根据元素的层次结构、属性等来精确定位元素。例如:element = driver.find_element_by_xpath("//div[@id='example']/p[1]")
-
通过 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 的基本写法和一些常用的表达式:
- 选择元素:
- 绝对路径:从根节点开始的路径,以斜杠
/
开头。例如:/html/body/div
- 相对路径:相对于当前节点的路径,以双斜杠
//
开头。例如://div/p
- 绝对路径:从根节点开始的路径,以斜杠
- 谓语(Predicate):用于过滤元素的附加条件,放在方括号内。
- 例如:
//div[@class='content']
选择 class 属性为 ‘content’ 的 div 元素。
- 例如:
- 选取节点:
nodename
:选择所有指定节点名的元素。例如://div
选择所有 div 元素。*
:选择当前节点的所有子元素。@attribute
:选择当前节点的指定属性。例如://@href
选择所有 href 属性。text()
:选择当前节点的文本内容。
- 逻辑运算符:
and
,or
,not
:用于组合多个条件。
- 轴(Axis):用于指定相对于当前节点的节点集合。
ancestor
,parent
,child
,following-sibling
,preceding-sibling
等。
- 通配符:
*
:匹配任何元素节点。@*
:匹配任何属性节点。
- 函数:
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
字样表示当前是符合表达的结果中的唯一一个,定位的位置和刚才查找的网页源码一致,说明是我们想要的结果。
对网页元素进行操作
下面是操作详解:
- 定位元素:为了在网页上进行任何操作,Selenium需要首先找到需要操作的元素。定位元素通常通过选择器来完成,如ID、class、tag name、name、link text、partial link text、css selector或XPath。例如,
driver.find_element_by_id("username")
会找到ID为username
的元素。 - 操作输入框:可以通过
send_keys
方法向输入框(通常是<input>
标签)发送输入,如用户名或密码。例如,username_field.send_keys("myusername")
。 - 点击按钮:使用
click()
方法可以点击按钮或链接。例如,submit_button.click()
会点击ID为submit_button
的按钮。 - 提交表单:通过点击
<form>
标签上的提交按钮,或者直接调用submit()
方法可以在表单提交时触发动作。例如,form.submit()
会提交表单。 - 获取和设置元素属性:可以通过
get_attribute()
方法获取元素的属性值,还可以利用set_attribute()
方法设置属性值。例如,element.get_attribute("class")
会获取元素的class
属性值。 - 执行JavaScript:Selenium提供了一个
execute_script()
方法,可以用来执行任何JavaScript代码。这意味着可以通过JavaScript与DOM交互来完成操作。 - 处理下拉框:可以使用
select_by_visible_text()
,select_by_index()
,select_by_value()
等方法来选择下拉框中的选项。这些方法位于Select
类中。例如,dropdown.select_by_visible_text("option2")
会选择下拉框中的可见文本为option2
的选项。 - 处理弹出框:Selenium提供了的方法来处理JavaScript警告、确认框和提示框。例如,
alert.accept()
会确认一个警告框。 - 切换窗口:当网页上打开新窗口时,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"]')))
WebDriverWait(driver, 5)
:WebDriverWait
是 Selenium 提供的等待方式,它会在指定的时间内等待某个条件成立后继续执行下面的代码。driver
是你创建的 WebDriver 实例,用于控制浏览器的操作。5
是最长等待时间,即最多等待5秒。
.until()
方法:until()
方法是WebDriverWait
的一个函数,它接受一个条件(Expected Condition,EC)作为参数,并且会不断地调用这个条件,直到返回True
或者超过最长等待时间为止。
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
元素。
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会保留登录信息。
相关文章:

[Python自动化办公]--从网页登录网易邮箱进行邮件搜索并下载邮件附件
[Python自动化办公]–从网页登录网易邮箱进行邮件搜索并下载邮件附件 使用说明 本文使用Python的selenium库进行操作邮箱登录、固定名称搜索邮件并下载附件,Python版本:3.9.16, selenium版本:4.19.0,EdgeBrowser版本:126.0.2…...

mysql8多值索引
MySQL8新出了一个多值索引,我还没体验过呢,今天试一试。 建表 我先建个表试一试多值索引的效果。我粗略地看了下多值索引的介绍,发现是只适用于数组类型的。所以我建一个含有数组字段的表试一试。语法还是挺麻烦的: create tabl…...

MT3055 交换排列
1.思路 若数对为(1,4)和(4,7),则说明14可以互换,47可以互换,并且17也可以互换。所以把可以交换的元素放到一个集合中。 例如样例1:有三个集合,…...

Zkeys三方登录模块支持QQ、支付宝登录
1,覆盖到根目录,并导入update.sql数据库文件到Zkeys数据库里 2. 后台系统权限管理,配置管理员权限-系统类别-找到云外科技,全部打勾 3,后台系统设置找到云外快捷登录模块填写相应的插件授权配置和登录权限配置&#x…...

数字探秘:用神经网络解密MNIST数据集中的数字!
用神经网络解密MNIST数据集中的数字! 一. 介绍1.1 MNIST数据集简介1.2 MLP(多层感知器)模型介绍1.3 目标:使用MLP模型对MNIST数据集中的0-9数字进行分类 二.数据预处理2.1 数据集的获取与加载2.2 数据集的探索性分析(E…...

11个IT运维领域必考证书,每一个都含金量极高
这几年,网络方向里,IT运维其实还是挺吃香的。 运维人员的职责不仅仅是确保系统的正常运行,还需要应对突发事件、优化性能以及保障信息安全。 面对如此复杂的工作环境,拥有专业认证不仅是对自身技能的肯定,更是提升职业…...
VScode 常用插件
基础开发插件 Chinese (Simplified)(简体中文语言包):这是适用于VS Code的中文(简体)语言包,适用于英语不太流利的用户。Auto Rename Tag:这个插件可以同步修改HTML/XML标签,当用户修…...

299k stars利用Public APIs提升开发效率:探索APILayer提供的开源资源
299k stars利用Public APIs提升开发效率:探索APILayer提供的开源资源 在现代软件开发中,API(应用程序接口)是实现应用间通信和功能扩展的关键工具。公共API(Public APIs)则为开发者提供了宝贵的资源&#…...

在目标检测数据集上微调Florence-2
Florence-2是由微软开源的轻量级视觉-语言模型,采用MIT许可。该模型在任务如图像描述、目标检测、定位和分割中展示了强大的零样本和微调能力。 图1。图示展示了每个任务所表达的空间层次和语义细粒度水平。来源:Florence-2:推进多种视觉任务的统一表示。 该模型将图…...

AI提示词:AI辅导「数学作业」
辅导孩子作业对许多家长来说可能是一件头疼的事,但这部分工作可以在一定程度上交给AI来完成。 打开ChatGPT4,输入以下内容: # Role 数学辅导专家## Profile - author: 姜小尘 - version: 02 - LLM: Kimi - language: 中文 - description: 专门为小学生…...
odoo文档的安装
步骤 1: 安装必要的软件 确保你已经安装了Git和Python 3.6、3.7或3.8之一。 步骤 2: 克隆 Odoo 文档存储库 打开终端,然后使用Git克隆Odoo的文档存储库。 git clone https://github.com/odoo/documentation.git cd documentation步骤 3: 安装 Python 依赖项 …...

02STM32软件安装新建工程
STM32软件安装&新建工程 1.软件安装:1.1Keil5 MDK安装1.2安装器件支持包离线安装支持包在线安装支持包 1.3软件注册:1.4安装驱动STLINK驱动JLink驱动在此文件夹下USB转串口 2.新建工程2.1STM32开发方式:1.寄存器2.标准库3.HAL库 固件库压…...

社区6月月报 | Apache DolphinScheduler重要修复和优化记录
各位热爱Apache DolphinScheduler的小伙伴们,社区6月月报更新啦!这里将记录Apache DolphinScheduler社区每月的重要更新,欢迎关注。 月度Merge Stars 感谢以下小伙伴上个月为Apache DolphinScheduler所做的精彩贡献(排名不分先后…...

Docker 使用基础(2)—镜像
🎬慕斯主页:修仙—别有洞天 ♈️今日夜电波:秒針を噛む—ずっと真夜中でいいのに。 0:34━━━━━━️💟──────── 4:20 🔄 ◀️ ⏸ …...

Docker学习笔记(三)Dockerfile
一、什么是Dockerfile Dockerfile 是一个用于自动化构建 Docker 镜像的文本文件,其中包含了从一个基础镜像开始,到最终形成所需定制镜像的所有指令集。这个文件中的每一条指令都对应着构建镜像过程中的一个步骤或一层,指导 Docker 如何安装软…...
学懂C#编程:C# 索引器(Indexer)的概念及用法
C#中的索引器(Indexer)是一种特殊的成员,它允许类或结构的实例像数组那样通过索引来访问其内部的数据。索引器提供了一种灵活的方式来暴露集合或数组类型的内部数据,使得客户端代码可以使用类似于数组下标的语法来访问类的成员&am…...

汇川CodeSysPLC教程03-2-14 与HMI通信
硬件连接 PLC与HMI连接采用何种连接方式,通常是参考双方支持哪些接口。PLC(可编程逻辑控制器)与HMI(人机界面)之间的通讯方式主要有以下几种: 串行通讯(Serial Communication)&…...

centos部署jar包
第一步: 将IDEA中的项目打包为jar,将这个jar文件放到centos服务器上的目录里,我在opt新建api目录,将jar文件放入,如下图: 第二步: 将需要读取的配置文件也放入此目录(其他目录也可以,和脚本中…...

CSS相对定位和绝对定位的区别
CSS相对定位和绝对定位的区别 区别1:相对的对象不同 相对定位是相对于自己绝对定位是相对于离自己最近的有定位的祖先 区别2:是否会脱离文档流 相对定位不会脱离文档流,不会影响其他元素的位置绝对定位会脱离文档流,会影响其他元素的布局 代…...
SpringCloud之nacos共享配置文件实现多数据源灵活切换
目录 前言 1.引入Springboot相关的aop切面依赖 2.创建自定义注解DataSourceKey 3.创建对ThreadLocal类 4.创建aop切面 5.创建动态数据源类 6.创建多数据库连接配置类 7.关键代码讲解 8.nacos主要配置 前言 通过Spring AOP(面向切面编程)的功能来动…...

手游刚开服就被攻击怎么办?如何防御DDoS?
开服初期是手游最脆弱的阶段,极易成为DDoS攻击的目标。一旦遭遇攻击,可能导致服务器瘫痪、玩家流失,甚至造成巨大经济损失。本文为开发者提供一套简洁有效的应急与防御方案,帮助快速应对并构建长期防护体系。 一、遭遇攻击的紧急应…...

安宝特方案丨XRSOP人员作业标准化管理平台:AR智慧点检验收套件
在选煤厂、化工厂、钢铁厂等过程生产型企业,其生产设备的运行效率和非计划停机对工业制造效益有较大影响。 随着企业自动化和智能化建设的推进,需提前预防假检、错检、漏检,推动智慧生产运维系统数据的流动和现场赋能应用。同时,…...

基于Flask实现的医疗保险欺诈识别监测模型
基于Flask实现的医疗保险欺诈识别监测模型 项目截图 项目简介 社会医疗保险是国家通过立法形式强制实施,由雇主和个人按一定比例缴纳保险费,建立社会医疗保险基金,支付雇员医疗费用的一种医疗保险制度, 它是促进社会文明和进步的…...

visual studio 2022更改主题为深色
visual studio 2022更改主题为深色 点击visual studio 上方的 工具-> 选项 在选项窗口中,选择 环境 -> 常规 ,将其中的颜色主题改成深色 点击确定,更改完成...

[10-3]软件I2C读写MPU6050 江协科技学习笔记(16个知识点)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16...
在QWebEngineView上实现鼠标、触摸等事件捕获的解决方案
这个问题我看其他博主也写了,要么要会员、要么写的乱七八糟。这里我整理一下,把问题说清楚并且给出代码,拿去用就行,照着葫芦画瓢。 问题 在继承QWebEngineView后,重写mousePressEvent或event函数无法捕获鼠标按下事…...

推荐 github 项目:GeminiImageApp(图片生成方向,可以做一定的素材)
推荐 github 项目:GeminiImageApp(图片生成方向,可以做一定的素材) 这个项目能干嘛? 使用 gemini 2.0 的 api 和 google 其他的 api 来做衍生处理 简化和优化了文生图和图生图的行为(我的最主要) 并且有一些目标检测和切割(我用不到) 视频和 imagefx 因为没 a…...
Go语言多线程问题
打印零与奇偶数(leetcode 1116) 方法1:使用互斥锁和条件变量 package mainimport ("fmt""sync" )type ZeroEvenOdd struct {n intzeroMutex sync.MutexevenMutex sync.MutexoddMutex sync.Mutexcurrent int…...
【SpringBoot自动化部署】
SpringBoot自动化部署方法 使用Jenkins进行持续集成与部署 Jenkins是最常用的自动化部署工具之一,能够实现代码拉取、构建、测试和部署的全流程自动化。 配置Jenkins任务时,需要添加Git仓库地址和凭证,设置构建触发器(如GitHub…...
Python竞赛环境搭建全攻略
Python环境搭建竞赛技术文章大纲 竞赛背景与意义 竞赛的目的与价值Python在竞赛中的应用场景环境搭建对竞赛效率的影响 竞赛环境需求分析 常见竞赛类型(算法、数据分析、机器学习等)不同竞赛对Python版本及库的要求硬件与操作系统的兼容性问题 Pyth…...