一、背景说明
医视界医学考试系统(https://exam.mvwchina.com/pc/student/login.html)后台使用token来验证会话身份。使用爬虫抓取题库时,要么在浏览器手动登录、然后抓包获取token,要么使用python模拟登录、自动获取token。
使用Fiddler抓取到的一个登录的会话(https://exam.mvwchina.com/user3/login ),而不清楚cookies是怎么生成的(可能是用JS本地生成再提交到服务器)。直接用request.post用户名和密码,不提交cookies也可以登录,但经常出现“发现您的账号在其它地方登录,请点击下方确认,重新登录”的提示、且无法模拟“点击确认”。
因此考虑使用Selenium直接模拟登录。
二、环境搭建
2.1 下载驱动
其中Chrome驱动要注意Driver版本与浏览器版本对应要求。医视界医学考试系统支持chrome,因此使用chromedriver。Chrome驱动下载地址:http://chromedriver.chromium.org/downloads
下载驱动文件,放到后续python文件同级目录下或加入到环境变量中即可。
2.2 安装selenium
pip install selenium
三、程序实现
3.1 系统状况
手动登录系统,使用Fiddler抓取一个token值,在chrome控制台/Application/Storage中搜索发现:这个token其实就是Cookies中的access-key
网页的图片验证码也是最简单的情况,直接把验证码内容放在元素文字内容中。提取后去除空格即可。
3.2 代码实现
# 使用selenium登录并获取tokenimport jsonimport timefrom selenium import webdriverfrom selenium.webdriver.chrome.options import Optionsimport time# 参考https://www.cnblogs.com/lsdb/p/10515759.html# https://www.cnblogs.com/ruichow/p/11340476.htmldef GetToken(): # 登录用户名密码,改成目标系统用户名密码 username = '' password = '' #浏览器模式设置 chrome_options=Options() chrome_options.add_argument('--headless') """最终的效果:不会弹出浏览器窗口""" driver = webdriver.Chrome(chrome_options=chrome_options) # driver = webdriver.Chrome() # 登录页面url,改成目标系统登录页面 url = "https://exam.mvwchina.com/pc/student/login.html" #操作浏览器,打开url,用户名密码登陆 driver.get(url) driver.find_element_by_name("login").send_keys(username) driver.find_element_by_name("pwd").send_keys(password) # 获取验证码图片对应的文字,删除空格 yzm = driver.find_element_by_class_name('code-yzm').text.replace(" ", "") print(yzm) driver.find_element_by_class_name("input-yzm").send_keys(yzm)driver.find_element_by_class_name('btn-enter').click() # 强制等待5秒,待session和token都成功返回并存到浏览器中 time.sleep(5)#获取单项Cookie,单项Cookie是字典 cookie = driver.get_cookie('access-key')['value'] # 去F12 Application中查找发现,原来token就是cookie中的access-key print(cookie) driver.close() # 退出程序时关闭浏览器 return cookie
私信小编01 领取完整项目代码