selenium利用cookie减少重复登录

selenium用于自动测试场景比较多,但是由于它本身就是基于浏览器操作模拟的,所以可以用来获取网页数据,这里的数据就不是海量的泛爬取了,而是有目的,有周期的重复爬取。

安装

安装的主要问题就是webdriver的版本号问题,需要完全一致,我就是没有注意自己Chrome已经升级了一个小版本,结果运行不起来。
webdriver.exe路径加入系统path的问题,有试过通过代码webdriver.Chrome(executable_path=“C:\Program Files (x86)\Google\Chrome\Application\chromedriver.exe”)调用,还有将webdriver.exe拷贝一份到python执行环境目录的,还是有各种问题。老实的配windows环境,重启生效最简单。

操作cookie

webdriver启动的浏览器没有把浏览器本身的cookie带出来,这个应该是隔离了本身的浏览器配置,如果能把它们统一就方便了,不过这样就不是测试框架了。。。
那么我们为了避免重复登录还是要想办法处理cookie

import os
import pickle
import time

from selenium import webdriver
from selenium.webdriver.support.wait import WebDriverWait

brower = webdriver.Chrome()
wait = WebDriverWait(brower, 10)

url = "https://weibo.com/"
brower.get(url)
bcookies  = brower.get_cookies()

cookies_nologin = {}
for item in bcookies:
    cookies_nologin[item['name']] = item['value']
print(cookies_nologin)
print("\n\n")


time.sleep(30)#页面做登录操作
bcookies  = brower.get_cookies()

cookies = {}
for item in bcookies:
    cookies[item['name']] = item['value']
    outputPath = open('cookie.pickle','wb')
    pickle.dump(cookies,outputPath)
#print(browser.get_cookies())
print(cookies)
print("\n\n")

以微博为例,通过selenium 做一遍登录,然后持久化cookie下次使用,这里没有用抓包的方式获得cookie是因为抓包完以后再写代码还是太麻烦。
登陆前cookie
{‘route’: ‘5ba20f5837ab1cba9090cdc497c625c6’}
登录后cookie
{‘wvr’: ‘6’, ‘un’: ‘xxxx’, ‘SSOLoginState’: ‘1586751284’, ‘SCF’: ‘AijFBdlDKx57SXE-L1GTWK-MJiieEfnUbLX28K4LLi3VMQd5eSkDTwolkwSnf1KS37EhAuabn0Y2vso.’, ‘ALF’: ‘1618287284’, ‘login_sid_t’: ‘d5cf9bd9285d72da87e4ca6c84c07’, ‘SUBP’: ‘0033WrSXqPxfM725Ws9jqgMP9D9W5cQmQ8B-_5Zbnma-FQASVX5JpX5K2hUgL.Foq41Kz0e0241hz2dJLoIEXLxKML1-qLBoeLxK.L1KBL1h-LxKML1hBL1KqLxK-L1-eL1-qLxKnLBo2L1hqt’, ‘Apache’: ‘6556525435675.231.1586751267024’, ‘_s_tentry’: ‘passport.weibo.com’, ‘wb_view_log’: ‘1536*8641.25’, ‘SUHB’: ‘0102UMy3Lenhio’, ‘SUB’: ‘_2A25DeRhGeBH4lAS8y_Fwz6IHXVQ5I-srDV8PUNbmtANLUL7kW9uvTgTvA97ld_HZx7OR5N64rlWilFA’, ‘WBStorage’: ‘42212210b087ca50|undefined’, ‘YF-V5-G0’: ‘f0aacce81fff76e1515ae68ac76a20c3’, ‘Ugrow-G0’: ‘cf25a00b541269674d0feadce35f’, ‘ULV’: ‘1586751267030:1:1:1:6556525435675.231.1586751267024:’, ‘cross_origin_proto’: ‘SSL’, ‘SINAGLOBAL’: ‘655652543567586751267024’}
从打印的cookie内容看,微博的cookie还是很干净的,未登录就是那么一点,登录后增加了不少内容,当然其中就有认证相关信息了。

import os
import pickle
import time

cookie_pickle= pickle.load(open('cookie.pickle','rb'))

brower = webdriver.Chrome()
wait = WebDriverWait(brower, 10)

url = "https://weibo.com/"
brower.get(url)
for cookie in cookie_pickle:
    brower.add_cookie({
        "domain":".weibo.com",
        "name":cookie,
        "value":cookie_pickle[cookie],
        "path": '/'
        #"expires": None
    })
brower.get(url)

下次登录前进行cookie操作就可以免登录了。

问题

对微博的测试成功了,但是在对一些其它网站进行cookie操作的时候发现有带lastcheckfeed的,有加密用户名的,这样就无法登录了。另外各个网站的cookie有效期时间设置不一,如果碰到比较短的,那就要重新跑一遍cookie的获取过程了。这些情况,用selenium做个模拟登录,其实更方便了。
技术的发展很快,一定要具备独立的思考,研究能力才行,不然网上搜的代码,也许过了几个月就跑不起来了。

你可能感兴趣的:(selenium利用cookie减少重复登录)