前言
说明:23年暑假找了个公司赚点生活费。其中我的任务是copy163邮箱的邮件,然后将邮件的内容复制到公司的销售系统(53快服)。
任务可以分以下几步:
1、复制邮件内容
2、根据邮件内容,分割提取信息
3、将信息填到客服系统
如果不使用脚本,原始人纯手戳,每天一两来条邮件,个人感觉还是可以接受的,那么一天两千多条,就是不吃饭也干不完。下面这个图是每天要录入系统的邮件数据量,可以看到一天邮件数量峰值达到2600条左右,可以说这个量以及不再是纯手戳能够承受得了的了
当我接到这个任务的时候离数据爆发增长还有不到一周时间,为此在前两天干完活的闲余时间琢磨如何使用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和beautifulsoup获取163邮箱邮件内容
方法四的实现可以参考我的这篇文章:采用pyautogui和pyperclip获取163邮箱邮件内容
使用selenium和requests的方法获取163邮箱的所有邮件
本文主要是参考方法一的思路,使用requests的方法获取163邮箱的邮件信息。
方法一的难点如下:
- 1、登录163次数超过一定数量后会有滑动验证;
- 2、获取收件箱邮件的请求如何找到。
为了避免掉滑动验证这个问题,我们采用selenium登录163邮箱,在出现滑动验证的时候人为滑动验证就行。因此问题的重点在于我们登录邮箱后如何找到邮件的url请求,找到了这个请求我们就可以使用requests请求获取请求响应,得到邮件信息。
找到邮件的url请求
登录邮箱,点击进入收件箱,按快捷键F12打开浏览器开发者工具,在Fetch/XHR栏找到了收件箱邮件的请求包,我们在右侧的preview栏看到的内容就是收件箱的当前页的所有邮件信息。(找到这个请求包是需要经验的,实在不行只能一个一个包看,说实话这步时比较难的,好的是抓取163邮件前人做过,可以直接看别人抓的哪个包)
点击Headers查看请求头,可以看出获取163邮件的这个请求是POST请求,请求链接为:https://mail.163.com/js6/s?sid=CCGXGcDDURnhdXKNCTDDsadFTHxTiiYc&func=mbox:listMessages。请求中还包括cookies信息,我们将请求头的Origin,Referer,User-Agent参数也添加到请求中去。
点击Pyload,可以看到这个请求的额外参数,Query String Parameters参数有两个,一个是sid,一个是func。这两个参数在请求链接上直接有体现。Form Data参数为var,该参数限定了该请求获取邮件的格式和数量。我们获取该页的所有邮件则需要将这两个参数也添加到请求当中去。
需要注意的是Query String Parameters参数sid不是固定的,每一次登录查看sid都会不一样。
总结:抓包发现收件箱邮件的请求为POST请求,重点是找到cookies和sid。别的参数都是可以通过浏览器工具查看请求头参数复制过去的。
获取到cookies
使用Selenium可以方便地获取和管理浏览器的Cookies。以下是使用Python和Selenium获取Cookies的示例代码:
from selenium import webdriver
# 创建一个浏览器实例
driver = webdriver.Chrome()
# 打开目标网页
driver.get("https://example.com")
# 获取所有的Cookies
cookies_list = driver.get_cookies()
# 打印每个Cookie的名称和值
for cookie in cookies_list:
print("Name:", cookie['name'])
print("Value:", cookie['value'])
print("-------------")
# 关闭浏览器
driver.quit()
在上面的示例中,我们首先创建了一个浏览器实例(这里使用的是Chrome浏览器),然后通过driver.get(url)
打开了目标网页。接下来,我们使用driver.get_cookies()
方法获取了当前页面的所有Cookies,并将其存储在cookies
变量中。最后,我们遍历cookies
列表,并打印出每个Cookie的名称和值。
我们使用Selenium成功登录163邮箱,网站会保存一个cookies,我们下次获取163收件箱邮件时的请求带上这个cookies参数。获取到的cookies是列表类型,需要将其转换为字典类型作为requests请求的参数。转换的代码如下:
cookies