基本环境配置

1. Selenium - 建议使用低版本的Python-Selenium库,因为高版本在Chrome中不支持。

pip3 install selenium==2.48.0

2. chromedriver.exe - 下载地址:http://npm.taobao.org/mirrors/chromedriver/, 版本要匹配。将 .exe 程序放在"..Python\Python36\Scripts"目录下。

3. pymysql

pip3 install pymysql

1.登录界面iframe

iframe的id值添加了时间戳,直接获取相对麻烦。可通过XPATH或CSS选择器获取该节点。如图:

login_frame

2. "写信"节点

写信节点的元素定位li节点, 不要定位span子节点,否则获取不到。另外,如果是获取APP节点,可以选择小一级的。

3. 邮件主题

主题节点不可交互,无法输入文字,这里选择不设置。

4. 邮件内容

邮件内容的文本输入框处于iframe中,输入文本前需要切换frame,可直接通过class获取并切换。如图:

content_frame

5. "发送"节点

由于输入邮件内容时切换至子页面,在点击发送前需要切换到父级Frame。

6. 登录限制

不要频繁使用Selenium, 否则会出现点触式验证。当然,完全可以破解。但是,网易相对友好,短时间过后便可恢复正常访问,也不会ban IP。

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.common.exceptions import NoSuchElementException
from utils.config import *
import pymysql
import re
import time
'''
想要学习Python?Python学习交流群:984632579满足你的需求,资料都已经上传群文件,可以自行下载!
'''
class Mailbox(object):def __init__(self):"""初始化"""self.url = URLself.browser = webdriver.Chrome()self.wait = WebDriverWait(self.browser, TIME_OUT)   # 显式等待时间10秒# 邮箱账号密码self.mail_user = MAIL_USERself.mail_pass = MAIL_PASS# MySql用户名密码# self.user = MYSQL_USER# self.pass_ = MYSQL_PASSdef __del__(self):self.browser.close()def login_email(self):"""登陆网页版网易163邮箱:return: None"""self.browser.get(self.url)# 获取iframe节点frame_1 = self.wait.until(EC.presence_of_element_located((By.XPATH,'//*[@id="loginDiv"]/iframe')))# 切换Frameself.browser.switch_to.frame(frame_1)time.sleep(3)# 账号输入框user = self.wait.until(EC.presence_of_element_located((By.NAME, 'email')))# 密码输入框password = self.wait.until(EC.presence_of_element_located((By.NAME, 'password')))# 登录按钮button = self.wait.until(EC.element_to_be_clickable((By.ID, 'dologin')))# 输入账号user.clear()user.send_keys(self.mail_user)time.sleep(3)# 输入密码password.clear()password.send_keys(self.mail_pass)time.sleep(3)# 登录button.click()time.sleep(10)# 获取登录成功后界面左上角的Logo,验证登录成功.logo = self.wait.until(EC.presence_of_element_located((By.ID, 'h1Logo')))if logo:print('Successful login!')def send_email(self):"""发送邮件:return: None"""try:# "写信"节点send_ = self.wait.until(EC.presence_of_element_located((By.XPATH, '//*[contains(@class, "mD0")]')))send_.click()time.sleep(5)# 收件人recipient = self.wait.until(EC.presence_of_element_located((By.CLASS_NAME, 'nui-editableAddr-ipt')))recipient.clear()recipient.send_keys(RECIPIENT)time.sleep(3)# 切换frameframe = self.wait.until(EC.presence_of_element_located((By.XPATH, '//*[@class="APP-editor-iframe"]')))self.browser.switch_to.frame(frame)# 邮件内容content = self.wait.until(EC.presence_of_element_located((By.XPATH, '//*[@class="nui-scroll"]')))content.clear()content.send_keys(CONTENT)time.sleep(3)# 切换至父级frameself.browser.switch_to.parent_frame()# 发送send_button = self.wait.until(EC.element_to_be_clickable((By.XPATH, '//*[@class="jp0"]/div[1]/span[1]')))send_button.click()time.sleep(3)# 确定不添加主题sure = self.wait.until(EC.presence_of_element_located((By.XPATH, '//*[@class="nui-msgbox-ft-btns"]/div[1]/span')))sure.click()time.sleep(3)print('Send successfully!')except NoSuchElementException as e:print('Failed!')'''def get_email_info(self):"""获取邮件的相关信息:return: None"""# 收件箱节点Inbox = self.wait.until(EC.presence_of_element_located((By.XPATH, '//*[@id="dvNavTree"]/ul/li[1]')))# 切换至"收件箱"页面Inbox.click()# 延时等待time.sleep(10)# messagemessages = list()try:# 获取包含页码的节点page_element = self.wait.until(EC.presence_of_element_located((By.XPATH, '//*[@class="nui-select-text"]')))# 获取收件箱总页码page = page_element.text.split('/')[-1]time.sleep(3)if page:for i in range(int(page)):# 获取当前页面所有邮箱节点divs = self.browser.find_elements((By.XPATH, '//*[contains(@class, "rF0")]'))print(divs)# divs = self.wait.until(EC.presence_of_element_located((By.CSS_SELECTOR,'')))for div in range(len(divs)):# 获取每个div节点的aria-label属性(包含所有有效信息)summary = div.get_attritubute('aria-label')# 获取aria-label属性值result = summary.split()# result = re.findall(r'(.*?) 发件人 :(.*?) 时间:(.*?$)', s)  正则匹配有效数据messages.append({'sender': result[3],'content': result[0],'time': '{} {} {}'.format(result[5], result[6], result[7])})# 下拉底部self.browser.execute_script('window.scrollTo(0, document.body.scrollHeight)')# 下一页time.sleep(3)print('正在爬取第{}页'.format(str(i)))next_page = self.wait.until(EC.presence_of_element_located((By.XPATH, '//*[@class="nui-btn-text"]')))next_page.click()return messagesexcept NoSuchElementException as e:print('Error acquiring information!')return Nonedef connect_db(self):"""创建数据库连接对象:return: db"""db = pymysql.connect(host=MYSQL_LOCALHOST, user=self.user, password=self.pass_,port=MYSQL_PORT, db=MYSQL_DB)# print('Successful connection!')return dbdef save_db(self, messages):"""数据入库:messages: 邮件信息:return: None"""db = self.connect_db()# 获取数据库操作指针cursor = db.cursor()# 数据库表格table = '163'for message in messages:keys = ', '.join(message.keys)values = ', '.join(['%s'] * len(message))sql = 'INSERT INTO {table}({keys}) VALUES ({values})'.format(table = table, keys=keys, values=values)try:if cursor.execute(sql, tuple(message.values())):# print('Successful')db.commit()except:# print('Failed')db.rollback()db.close()'''def main(self):"""主函数:return: None"""# 登录邮箱self.login_email()# 发送邮件self.send_email()if __name__ == '__main__':mail = Mailbox()mail.main()

python模拟登录网易163邮箱并发送SOS邮件相关推荐

  1. python登录网易163邮箱,爬取邮件

    1 from common importMyRequests,LoggerUntil,handle_exception2 3 myRequests.update_headers({ 'Accept': ...

  2. python模拟登录网易邮箱

    python模拟登录网易邮箱 #coding:utf-8 import urllib2,urllib import cookielib from bs4 import BeautifulSoup#设置 ...

  3. 用Foxmail for Mac客户端登录网易163邮箱

    1.下载Foxmail for Mac客户端: 2.进入163邮箱,点设置--邮箱设置--设置POP3/SMTP/IMAP: 选择开通 3.开通后会获取一个授权码,该授权码即Foxmail for M ...

  4. selenium自动化登录网易163邮箱全部代码(网易的邮箱好像都能用)

    **注意点:**: 1.延时:防止长时间未加载完成,程序运行 2.iframe框架切换,不然会定位不到元素 import tracebackfrom selenium import webdriver ...

  5. 关于selenium自动化测试退出登录网易163邮箱的总结感想

    网易邮箱的退出按钮在弹出框中,在页面代码中可以定位到这一元素,但是想直接定位并click这样的操作无法成功并且会报出selenium.common.exceptions.ElementNotInter ...

  6. 一键登录网易163邮箱

    文件名: 163.bat ---------------我是分隔线-------------------------------------- @echo off set "var=user ...

  7. python模拟登录163邮箱_python模拟登录网易邮箱-阿里云开发者社区

    python模拟登录网易邮箱 #coding:utf-8 import urllib2,urllib import cookielib from bs4 import BeautifulSoup #设 ...

  8. 新技能获取:如何查询网易163邮箱具体的注册日期,包括年月日

    这几天突发奇想,脑子里凭空产生了壹個困扰我好几天的问题:应该怎么做才能查询到网易163邮箱的具体注册日期?之所以会产生这样的疑问,是因为网易163邮箱本身提供的信息不够精确,在网易免费邮箱官方博客里, ...

  9. 邮件附件att00.html,我的网易163邮箱收到的邮件里有个这样的附件ATT00002.bin打不开,到底是什么?...

    我的网易163邮箱收到的邮件里有个这样的附件ATT00002.bin打不开,到底是什么?以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容,让我们赶快一 ...

最新文章

  1. SQL数据库的数据体系结构
  2. openfire开发文档
  3. 联合国粮农组织总干事屈冬玉 对话国际农民丰收节贸易会
  4. OSS在线迁移服务剖析
  5. 【Clickhouse】ClickHouse 内部架构介绍
  6. 编程之美 4.4点是否在三角形内
  7. 仿网易云音乐小程序-uniapp
  8. Mysql的explain,你真的会用吗?
  9. 笔记——关于每次重启之后,虚拟机网络无网络访问权限的解决方法
  10. STM32:SPI驱动ADXL345
  11. JeeSite4 一些前端资料 - 来自作者ThinkGem
  12. 生动形象解释虚数的意义
  13. 【转】苏宁500万日订单下的高可用拼购系统,到底暗藏了什么“独门秘籍”?
  14. ES 创建索引设置(setting)基础
  15. 织梦模板之家:如何安装更换织梦cms模板
  16. 跨考计算机考研华科还是中科大,2018中科大计算机考研经验贴
  17. Win32_PhysicalMemory 内存条 参数说明
  18. [BUUCTF-pwn] qwb2018_opm
  19. python葡萄酒数据_用python进行葡萄酒质量预测
  20. IDL中提供的[source]属性,是为了让实现类宣扬它支持哪几个对外接口注册。

热门文章

  1. arduino 下16进制转2进制
  2. Vue项目二:设置标题搜索栏,以及图片的轮播。
  3. APP打开提示 应用未安装
  4. 51nod 1001
  5. 原生JS中的三大家族(offset/scroll/client)与jQuery中对应的方法
  6. Stata进行矩阵运算,求逆矩阵、特征根、特征向量
  7. Vegas使用技巧—— 如何实现三维立体调整?
  8. 图像处理与计算机视觉:2D射影变换
  9. 防抖和节流的理解与实现
  10. set和setenv的区别