Python+Selenium 持续化传递Cookie登陆淘宝 实践


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值,那是不是手动加一个上去呢?

Created with Raphaël 2.1.0 selenium selenium requests requests Get_Cookie Add_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

浏览器 下载
Chrome: https://sites.google.com/a/chromium.org/chromedriver/downloads
Edge: https://developer.microsoft.com/en-us/microsoft-edge/tools/webdriver/
Firefox: https://github.com/mozilla/geckodriver/releases
Safari: https://webkit.org/blog/6900/webdriver-support-in-safari-10/

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)

猜你喜欢

转载自blog.csdn.net/joson1234567890/article/details/70768124