自动化收邮件
- 2019 年 10 月 5 日
- 筆記

自动化收取你的163邮箱信息
【今日知图】
行数移动
gg 英文单词go 文件顶部 G 文件末尾 数字gg 移动到数字对应行数 数字G 移动到数字对应行数 :数字 移动到数字对应行数
0.说在前面1.模拟登陆2.收件箱信息3.结果展示4.作者的话
0.说在前面
【需求】
由于需求,我最近自己搞了两个大项目,哈哈,开个玩笑,比较小~~
需求一:对知乎所有评论进行可视化及知识图谱建立,利用机器学习基神经网络训练知识图谱,进一步的增强用户的联系,扩充实体关联,这个就比较难了,还在进行时,哈哈~~
需求二:就是大家看到的标题,163邮箱问题,我想下载我邮箱里面的所有数据,比如收件箱的信息及附件等。今天分享163邮箱模拟登录及收件箱信息爬取~~
【吐槽】
这两天特别累,事情特别多~~还是坚持给各位发文章,保证每日一篇
不管怎么样,还是坚持下去!
【技术点】
采用selenium模拟登录,利用xpath提取数据~~
下面我们一起来看163问题~~
1.模拟登陆
分析
如下图所示,我们先来定位一下,登录的基本信息~

当我们第一次打开这个页面的时候,iframe是刷新以后才可以登录,所以必须得等它动态加载完毕,才可以~
封装
初始化,我们定义了三个list分别存储,邮件标题,收件箱的信息来自于某位用户,以及邮件时间。
def __init__(self): # 调用Chrome Driver登陆163邮箱 driver = webdriver.Chrome() self.driver = driver title_list = [] sender_list = [] time_list = [] self.title_list = title_list self.sender_list = sender_list self.time_list = time_list
模拟登陆
如下图定位:

def login(self): # 等待页面完全加载 self.driver.implicitly_wait(15) self.driver.get('http://mail.163.com/') # 因为163登录入口在iframe里面,所以先要切换到iframe frame = self.driver.find_element_by_xpath('//iframe[starts-with(@id,"x-URS-iframe")]') self.driver.switch_to.frame(frame) # 使用driver将账号密码填进表单并提交 # 填入用户名及密码 self.driver.find_element_by_xpath("//input[@name='email']").send_keys('xxx@163.com') self.driver.find_element_by_xpath("//input[@name='password']").send_keys('xxxx') self.driver.find_element_by_id('dologin').click() return self.driver
2.收件箱信息
数据抽取
这里将数据进行抽取,提取出标题,邮件来自,时间,如下图:

def page_Info(self,html): selector = etree.HTML(html) text = selector.xpath('//div[@sign="letter"]/@aria-label') print(text) for each_text in text: print(each_text) email_title = each_text.split('发件人 :')[0].strip() self.title_list.append(email_title) print(email_title) email_sender = each_text.split('发件人 :')[1].split('时间:')[0].strip() self.sender_list.append(email_sender) print(email_sender) email_time = each_text.split('发件人 :')[1].split('时间:')[1].strip() self.time_list.append(email_time) print(email_time) print(self.title_list) print(self.sender_list) print(self.time_list)
单页面处理
首先进行登录,登陆后,让页面刷新完成后,所以这里设置了10秒后爬起,定位到收件箱,进行自动化点击,调用上述方法进行爬取!
同时可以在当前页获取总页面数!如下图所示,1/2
通过取出最后一个数字便为总页面数!

def process_Info(self): driver = self.login() time.sleep(10) driver.switch_to.default_content() # 点击收件箱按钮加载邮件列表 driver.find_element_by_id('_mail_component_67_67').click() time.sleep(5) driver.switch_to.default_content() # 获取总的翻页数 sum_page = int(driver.find_element_by_class_name('nui-select-text').text.split('/')[-1]) print('总页数为 ' + str(sum_page) + "页") html = driver.page_source print(html) self.page_Info(html)
多页面数
还是上述那个页面,我们可以定位到下一页的标签,进行自动化点击,抓取下一页数据即可!

for i in range(1,sum_page): time.sleep(7) driver.switch_to.default_content() # 点击下一页按钮加载邮件列表 email_ext = driver.find_element_by_class_name('nui-toolbar-ext') email_ext = email_ext.find_elements_by_class_name('nui-toolbar-item')[-2] email_ext = email_ext.find_elements_by_tag_name('div')[-1] email_ext.click() time.sleep(7) driver.switch_to.default_content() html = driver.page_source print(html) self.page_Info(html)
3.结果展示
