Part1:登陆实例
import time
import requests
from selenium import webdriver
driver=webdriver.Chrome()
driver.get('https://login.taobao.com/member/login.jhtml')
driver.maximize_window() # 全屏显示
while driver.current_url == url :
# 链接跳转则表示登陆成功
time.sleep(3)
pass
list_cookies=driver.get_cookies() # 获取selenium cookie
driver.quit()
cookie={}
# 转换dict调用
for item in list_cookies:
cookie[item['name']]=item['value']
url='https://i.taobao.com/my_taobao.htm'
header={
'Connection':'keep-alive',
'Cache-Control':'max-age=0',
'Accept':'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8',
'Upgrade-Insecure-Requests':'1',
'User-Agent':'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1;Trident/5.0)',
'Accept-Encoding':'gzip, deflate',
'Accept-Language':'zh-CN,zh;q=0.8',}
response=requests.get(url,headers=header,cookies=cookie)
代码超乎想象的简单,这也是普遍的做法,将提取的cookie转换一下格式就可以直接调用,操作思路都是一样的,对于登陆验证过于复杂的网页推荐使用。
Part2:调试思路
在实际操作过程中会遇到各式各样的问题,抓包要仔细留意各个参数的变化。
在part1中,顺利取到cookie值,但是传递给requests后就失效了,一直没登录成功。用fiddler抓包观察。
cookie参数抓到一堆,实际selenium返回的值远少于fiddler里看到的,用排除法逐个对差异的值调用,某些值并非必须的,很多可以去掉,不影响结果。
到后面发现一个名为【cookie2】的值,这个是关键值,少了它,就会登录失败,selenium返回的cookie里面异常的少了这个关键的值,可以断定是它导致的了。带着问题去解决他吧!
思考:为什么selenium能正常登录,get_cookies{} 里就没有这个值呢?1、调试的时候没有添加header,以为是这个问题导致,后面添加上一样是异常,失败
2、cookie2是一开始get登录页面就生成的,尝试用浏览器正常登录,然后复制cookie2给requests,惊喜的发现,居然直接登录成功了。
注:每GET登录页一次就会生成一个新的cookie2值,只要这个值成功登录过就可以重复调用
3、把cookie2值保存下来,下次直接调用,前几次是没有问题的,后面失效了,说明cookie2值有时效性限制。
4、(极端做法)selenium 能正常登录既然里面没有cookie值,那是不是手动加一个上去呢?
如图,selenium 打开登录页面同时requests也GET一次登录页面取得这个cookie2,然后添加到selenium里面,让它带着这个值POST登录。
url='https://login.taobao.com/member/login.jhtml'
driver=webdriver.Chrome()
driver.get(url)
response=requests.get(url)
cookie_list=response.cookies # 获取cookie
for cookie in cookie_list:
if cookie.name=='cookie2':
# 历遍名称判断,添加cookie的name 和value
driver.add_cookie({'name':cookie.name, 'value':cookie.value})
每GET登录页一次就会生成一个新的cookie2值,只要这个值成功登录过就可以重复调用
以为问题解决了??
然并卵!登录失败,事实证明这种极端的做法是行不通的。
最终解决办法:
driver版本导致,更新一下版本成功了。搞了半天发现居然是版本过低导致,升级后重试居然成功了。必要的时候还是要留意一下驱动版本。
后面试了几个版本的驱动和浏览器,分别取值发现都是不同的。
Drivers for selenium下载
官方说明: https://github.com/SeleniumHQ/selenium/tree/master/py
Part3:调用Cookie
在part1里的最后一行就是调用的指定的cookie值,在requests中调用cookie方法很多,简单说下。
# 第一种:
s = requests.Session()
requests.utils.add_dict_to_cookiejar(s.cookies, cookies)
# 第二种:
requests.get(url, cookies=cookies)
# 上面两种都是dict格式调用
# 第三种:
# 添加到header里面
cookiestr = ';'.join(item for item in cookie) # 用 ; 隔开
header={'Cookie':cookiestr}
r=s.get(url,headers=header)