目前,qq邮箱的登录方式有:
1、利用账号、密码登录
2、快捷登录,前提是你本地已有qq账号登录中
和前面一样,还是先到qq邮箱登录首页,审查页面元素,找到我们进行登录操作所相关的链接、按钮或是输入框。
QQ邮箱登录首页:https://mail.qq.com/
打开登录页,可以看到两种登录方式选择,如下图:
审查页面元素,发现快速登录方式,对应ID为“qlogin_list“的一个div,而账号、密码登录方式对应ID为“web_login”的一个div,且这两个div元素都位于ID为“login_frame"的iframe的内嵌html中,如下:
对于快速登录方式,若当前已有qq账号在登录中,在"qlogin_list"下会有一个<a>链接元素,否则没有,因此通过对于该元素的判断,可以实现优先选择快速登录方式,直接点击该链接即可。
对于账号、密码登录,方法同博客园登录一样,找到用户名、密码的对应元素,实现填充后点击登录按钮即可。
登录成功后,可通过browser对象的cookies属性获取当前cookie。Splinter有一个CookieManager对象,该对象为dict类型,并持有添加、删除cookie的方法,具体如下:
cookie_manager.add({'name': 'Tony'}) # 增加一个cookie
cookie_manager.all() # 获取所有cookie
cookie_manager.delete() # 删除所有cookie
cookie_manager.delete('name', 'birthday','favorite_color') # 删除这三个cookie
cookie_manager.delete('name') # 删除一个cookie,cookie的名字为“name”
Splinter为Browser对象提供了get_iframe()方法,用于获取iframe,可通过iframe相关的id,name, 或是index进行查找。
具体参考代码如下:
![](https://i-blog.csdnimg.cn/blog_migrate/8f900a89c6347c561fdf2122f13be562.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/961ddebeb323a10fe0623af514929fc1.gif)
1 def qq_mail_login(username=None, password=None):
2 """
3 模拟登录QQ邮箱,账号密码登录
4 :param username:
5 :param password:
6 :return:
7 """
8
9 url = "https://mail.qq.com/"
10 browser = Browser()
11 browser.visit(url)
12 time.sleep(5)
13
14 with browser.get_iframe("login_frame") as iframe:
15 '''
16 if username is None and password is None:
17 # 切换到"快速登录"
18 div = iframe.find_by_id("qlogin_list").first
19 div.find_by_xpath("a")[0].click()
20 else:
21 # 利用账号,密码登录
22 iframe.find_by_id("u").first.fill(username)
23 iframe.find_by_id("p").first.fill(password)
24 iframe.find_by_id("login_button").first.click()
25 '''
26 # 优先选择"快速登录"
27 div = iframe.find_by_id("qlogin_list").first
28 try:
29 quick_href = div.find_by_xpath("a")
30 quick_href.first.click()
31 except exceptions.ElementDoesNotExist, e:
32 print e.message
33 # 利用账号,密码登录
34 iframe.find_by_id("u").first.fill(username)
35 iframe.find_by_id("p").first.fill(password)
36 iframe.find_by_id("login_button").first.click()
37 time.sleep(10)
38
39 for k, v in browser.cookies.all().iteritems():
40 print k, ":", v