采用selenium和beautifulsoup获取163邮箱所有未读邮件内容
说明:23年暑假找了个公司赚点生活费。其中我的任务是copy163邮箱的邮件,然后将邮件的内容复制到公司的销售系统(53快服)。
任务可以分以下几步:
1,复制邮件内容;
2,根据邮件内容分割,提取信息;
3,将信息填到客服系统。
如果不使用脚本,原始人纯手戳,每天一两来条邮件,个人感觉还是可以接受的,那么一天两千多条,就是不吃饭也干不完。(下面这个图是每天要录入系统的邮件数据量)
当我接到这个任务的时候离数据爆发增长还有不到一周时间。(果然公司是要招一个牛马来干活)为此在前两天干完活的闲余时间琢磨如何使用python帮我完成这个任务。
经过我大量查找网上的相关资料,总结为以下几个方法
-
方法一、通过Urllib实现
这种方法主要是应用requests请求的方法,获取邮件需要找到对应的url链接。关键步骤如下:
- 1、模拟登录163邮箱,并获取收件箱邮件的url;
- 2、获取cookie信息;
- 3、提取邮件对应的sid数据;
- 4、利用sid和cookie重新请求,获得响应;
- 5、提取收件箱列表信息。
-
方法二、使用第三方的邮件协议
这种方法需要邮箱打开第三方的邮件协议。有对应的第三方库专门处理邮件。由于我当时的邮箱没有权限开打开第三方邮件协议,因此就没考虑这种方法。
-
方法三、使用selenium模拟登录邮箱,获取网页信息,然后提取
selenium的用法很接近于人的操作习惯,实现的过程主要分为两步:
- 1、使用selenium模拟登录邮箱;
- 2、使用beautifulsoup处理网页,提取未读邮件的信息。
-
方法四、模拟点击,模拟复制邮件,然后提取信息
这个是类似selenium的思路想到的。大量的邮件信息提取,我们可以人为打开浏览器,进入163收件箱邮件列表页,然后使用
pyautogui
和pyperclip
模拟键鼠操作,循环复制、粘贴、保存每一封邮件。
传送门
方法一的实现可以参考我的这篇文章:使用selenium和requests的方法获取163邮箱的所有邮件
方法四的实现可以参考我的这篇文章:采用pyautogui和pyperclip获取163邮箱邮件内容
方法四是很容易想到的,程序执行过程和人的操作过程一模一样,简单粗暴。我们这里主要介绍使用selenium模拟登录邮箱,获取网页信息。
方法三可分为以下两个步骤
- 使用selenium模拟登录邮箱;
- 使用beautifulsoup处理网页,提取未读邮件的信息。
Selenium和Requests
:
Selenium和Requests是两个用途不同的工具,主要用于不同的Web应用程序自动化任务。
Selenium
:- 用途:Selenium主要用于自动化Web应用程序的测试和交互。它可以模拟用户在浏览器中与Web应用程序进行交互的行为,如点击、填写表单、提交数据等。Selenium适用于需要在真实浏览器环境下模拟用户行为的场景。
- 工作原理:Selenium通过控制浏览器来执行操作,它会打开一个浏览器窗口,并在其中加载和操作页面。这使得Selenium能够模拟用户真实的浏览器体验,并进行相关的测试和自动化任务。
- 优点:
- 模拟真实用户行为,更接近真实环境。
- 跨浏览器支持,可以在多种浏览器上运行。
- 定位元素能力强,可以准确地定位并操作页面上的元素。
- 支持多种编程语言。
Requests
:- 用途:Requests是一个用于发送HTTP请求的库,用于从Web服务端获取数据。它主要用于处理Web API调用、爬取网页内容、发送POST请求等。
- 工作原理:Requests通过HTTP协议与服务器进行通信,发送请求并接收响应。它不加载页面或执行JavaScript,仅处理HTTP请求和响应的数据。
- 优点:
- 简单易用,学习曲线较低。
- 可以发送各种类型的HTTP请求(GET、POST等)并处理响应。
- 轻量级,适用于快速获取和处理Web数据。
总结: Selenium适用于模拟用户与Web应用程序的交互,并进行自动化测试,包括复杂的JavaScript应用程序。而Requests则适用于发送HTTP请求,从Web服务端获取数据。两个工具在使用场景、功能和工作原理上有所区别,开发人员根据需求选择合适的工具来完成相应的任务。
在处理163邮件登录和获取邮件的这个任务如果采用requests处理过程会比较麻烦,还可能会面对各种反扒机制,从速度上来讲,还是requests更快,对于新手而言还是更推荐Selenium。
使用selenium模拟登录邮箱
登录的过程比较简单,需要注意的是提交用户名和密码的元素在iframe标签内,需要先进入iframe标签才能定位到我们需要交互的元素
import time
from selenium import webdriver
from selenium.webdriver.common.by import By
from bs4 import BeautifulSoup
from selenium.webdriver import ActionChains
mail_url='https://mail.163.com/'
email='your_uesrname'#邮箱用户名
password='your_password'#邮箱密码
#options = webdriver.ChromeOptions()
#options.add_experimental_option('excludeSwitches', ['enable-logging'])
driver = webdriver.Chrome()
driver.get('https://mail.163.com/')#打开浏览器,并打开163网站
# 因为登录位置处于iframe标签中,所以要切换进去
iframe=driver.find_element(By.TAG_NAME, "iframe")
driver.switch_to.frame(iframe)#进入iframe标签
#提交邮箱用户名和密码,并登录
driver.find_element(By.NAME, "email").send_keys(email)
driver.find_element(By.NAME, "password").send_keys(p