Python Selenium Cookie 绕过验证码实现登录示例代码
作者:Blue·Sky 发布时间:2021-11-12 08:25:24
之前介绍过通过cookie 绕过验证码实现登录的方法。这里并不多余,会增加分析和另外一种方法实现登录。
1、思路介绍
1.1、直接看代码,内有详细注释说明
# FileName : Wm_Cookie_Login.py
# Author : Adil
# DateTime : 2018/3/20 19:47
# SoftWare : PyCharm
from selenium import webdriver
import time
url = 'https://system.address'
def login():
'''先定义一个正常登录的方法,获取登录前和登录后的cookie'''
driver = webdriver.Chrome()
driver.get(url)
driver.maximize_window()
cookieBefore = driver.get_cookies()
# 打印登录前的cookie
print(cookieBefore)
time.sleep(2)
driver.find_element_by_id("new-username").clear()
driver.find_element_by_id("new-username").send_keys("username")
driver.implicitly_wait(5)
driver.find_element_by_id("new-password").clear()
driver.find_element_by_id("new-password").send_keys("password")
driver.find_element_by_id('home-right-login').click()
driver.implicitly_wait(5)
# 加一个休眠,这样得到的cookie 才是登录后的cookie,否则可能打印的还是登录前的cookie
time.sleep(5)
print("登录后!")
cookiesAfter = driver.get_cookies()
print("cookiesAfter:")
print(cookiesAfter)
# cookie 存放到了list,其中是dict
# 对比发现登录后的cookie比登录前多了4个dict。
# 如下代码分别是 1、4 、7、 8
len1 = len(cookiesAfter)
print("len:%d" %len1)
cookie1 = cookiesAfter[0]
cookie2 = cookiesAfter[3]
cookie3 = cookiesAfter[-2]
cookie4 = cookiesAfter[-1]
print("cookie1:%s" %cookie1)
print("cookie2:%s" %cookie2)
print("cookie3:%s" %cookie3)
print("cookie4:%s" %cookie4)
driver.quit()
# 将获取的这四个cookie作为参数,传递给,使用cookie登录的函数,如下
cookieLogin(cookie1,cookie2,cookie3,cookie4)
def cookieLogin(cookie1,cookie2,cookie3,cookie4):
print("+++++++++++++++++++++++++")
print("cookieLogin")
print("cookie2:%s" % cookie2)
print("cookie4:%s" % cookie4)
driver = webdriver.Chrome()
driver.maximize_window()
# 清除一下cookie
driver.delete_all_cookies()
time.sleep(3)
driver.get(url)
# 打开浏览器后添加访问地址后,添加cookie
driver.add_cookie(cookie1)
driver.add_cookie(cookie2)
driver.add_cookie(cookie3)
driver.add_cookie(cookie4)
print("cookies")
# 打印一下cookie,与上面正常登录的cookie对比一下
print(driver.get_cookies())
time.sleep(5)
# 刷新页面,可以看到已经是登录状态了,至此完成的使用cookie 的登录。
driver.refresh()
time.sleep(5)
driver.quit()
if __name__ == "__main__":
login()
1.2、代码介绍
如图,可以查看到登录前与登录后的cookie,将其拷贝出来,进行对比
如图,对比可以,登录后多余四个cookie
查看多余cookie的位置,是list 的1、4、7、8g额元素,所以将其取出,作为参数给cookie登录函数。
注意:该实例介绍的是无验证码登录操作,但思路是一样的。而这个demo ,仅仅是为了介绍一下使用cookie 登录的思路,具体项目应用中,这样是很不方便的。
2、绕过验证码登录实战
接下来,介绍含有验证码的登录,当然cookie处理的思路与上介绍的基本一样
这里增加了几点内容:
a、先首次使用验证码正确登录并保存登录前、后的cookie,对比分析cookie,筛选有用的cookie
b、将cookie 写到yaml 文件中,方便后续使用cookie登录时直接使用,而不需像上面介绍的那样,每次都需要先正常登录一样。
c、使用cookie登录时,从yaml文件中读取对应cookie即可。注意:Yaml 文件操作详见: Python Yaml 学习 ,有详细介绍yaml的读写操作。
注意:这里介绍的是先手动输入验证码正确登录后获取cookie。实际应用中可以使用其他方式获取cookie
如:1、之前介绍的博客园登录实例:Python - Cookie绕过验证码登录 使用fiddler,查看cookie
2、使用浏览器查看cookie 如,借助chrome 插件如下图,导出cookie进行分析。
思路如上,代码如下:
2.1、正常登录获取有效cookie
# FileName : getLoginCookie.py
# Author : Adil
# DateTime : 2018/3/20 21:43
# SoftWare : PyCharm
import yaml,time,os
from selenium import webdriver
url = 'https://system.address'
driver = webdriver.Chrome()
driver.get(url)
driver.maximize_window()
time.sleep(2)
driver.find_element_by_id("username").clear()
driver.find_element_by_id("username").send_keys("username")
driver.implicitly_wait(5)
driver.find_element_by_id("password").clear()
driver.find_element_by_id("password").send_keys("password")
print("请输入验证码:")
# 手动输入验证码
security_code = input()
time.sleep(1)
driver.find_element_by_id("security_code").send_keys(security_code)
time.sleep(1)
driver.find_element_by_id('sign_btn').click()
driver.implicitly_wait(5)
# 加一个休眠,这样得到的cookie 才是登录后的cookie,否则可能打印的还是登录前的cookie
time.sleep(5)
cookiesAfter = driver.get_cookies()
len1 = len(cookiesAfter)
# 已经知道需要第几个cookie,这里需要第3个cookie,所以选择cookie下标为2
cookie1 = cookiesAfter[2]
# 获取当前文件所在路径
fileNamePath = os.path.split(os.path.realpath(__file__))[0]
# 拼接config.yaml文件绝对路径
yamlPath = os.path.join(fileNamePath,'config.yaml')
# 以覆盖写入打开文件
fw = open(yamlPath,'w',encoding='utf-8')
# 构建数据
data = {"cookie1":cookie1}
# 装载写入yaml文件。
yaml.dump(data,fw)
driver.quit()
2.2、读取cookie配置文件,使用cookie登录系统
# FileName : stlUseCookieLogin.py
# Author : Adil
# DateTime : 2018/3/20 21:48
# SoftWare : PyCharm
from selenium import webdriver
import time,yaml,os
url = 'https://system.address'
driver = webdriver.Chrome()
driver.maximize_window()
driver.delete_all_cookies()
time.sleep(3)
driver.get(url)
fileNamePath = os.path.split(os.path.realpath(__file__))[0]
yamlPath = os.path.join(fileNamePath,'config.yaml')
# 读取yaml 文件
f = open(yamlPath,'r',encoding='utf-8')
cont = f.read()
conf = yaml.load(cont)
# 读取cookie值
cookie1 = conf.get("cookie1")
# 添加cookie
driver.add_cookie(cookie1)
print("cookies")
print(driver.get_cookies())
time.sleep(5)
# 这里重新获取地址,因为有些系统,未登录状态,链接会跳转,这里就是,登录状态后,才能正确打开指定网址,所以这里要再次指定网址。
driver.get(url)
# 刷新查看登录状态
driver.refresh()
time.sleep(5)
driver.quit()
以上应该算是已经详细的介绍了使用cookie 登录的思路了。希望对大家的学习有所帮助,也希望大家多多支持脚本之家。
来源:https://www.cnblogs.com/BlueSkyyj/p/8615879.html


猜你喜欢
- Socket是网络编程的一个抽象概念。通常我们用一个Socket表示“打开了一个网络链接”,而打开一个Socket需要知道目标计算机的IP地
- 用Splash做页面抓取时,如果爬取的量非常大,任务非常多,用一个Splash服务来处理的话,未免压力太大了,此时可以考虑搭建一个负载均衡器
- 这篇文章利用的是matplotlib.pyplot.plot的工具来绘制折线图,这里先给出一个段代码和结果图:# -*- coding: U
- 开发环境说明:Python 35Pytorch 0.2CPU/GPU均可1、LSTM简介人类在进行学习时,往往不总是零开始,学习物理你会有数
- 前面写过一篇关于python多线程的实现的文章, 但是效果不是最佳的,写法也不是很好。通过网上学习,也了解到了semaphore这个东西。百
- 这是个人对selenium.webdriver写的一些常用操作的二次封装,也就相当于重写了,不再使用自带的框架,用自己写的框架完成。这样的话
- 右击开始图标,打开“命令提示符(管理员)”。1、输入代码,停止服务。 net stop M
- 今天抽空学习了一下之前了解过的pillow库,以前看到的记得这个库可以给图片上加文字加数字,还可以将图片转化成字符画,不过一直没有找时间去学
- 简介Python下有许多款不同的 Web 框架。Django是重量级选手中最有代表性的一位。许多成功的网站和APP都基于Django。Dja
- 记得当时我们要跟网友天下合作,需要这样的一个鼠标划过放大的列表效果,就写了一个效果截图:演示代码:<!DOCTYPE html PUB
- 前不久,ColourLovers.com公布了一项调查结果。他们发现,美国前100大网站的Logo,主要使用12种颜色。其中,采用蓝色的网站
- 导语每日游戏更新系列——今天带大家来看看扫雷小游戏!它是许多人接触到的第一款游戏,大概也是广大办公族和无网学生无聊时消遣的最佳游戏。在那些还
- 最近接触一个项目,要在多个虚拟机中运行任务,参考别人之前项目的代码,采用了多进程来处理,于是上网查了查python中的多进程一、先说说Que
- 本文实例讲述了golang实现unicode转换为字符串string的方法。分享给大家供大家参考,具体如下:package mainimpo
- runtime 调度器是个非常有用的东西,关于 runtime 包几个方法:Gosched:让当前线程让出 cpu 以让其它线程运行,它不会
- 刚好前些天有人提到eval()与exec()这两个函数,所以就翻了下Python的文档。这里就来简单说一下这两个函数以及与它们相关的几个函数
- 1引言实现磁带备份数据的功能有两方面的困难:首先,SQL Server(以下简称SQL)所提供的数据库的整体备份及恢复功能不能直接满足本系统
- 解决方案:1、在MY.INI文件中的 [mysqld] 中增加一行tmpdir="D:/MySQL/data/"修改后,
- 在程序中,有多种方法进行强制类型转换。本博文将介绍一个非常常用的方法:to()方法。我们通常使用它来进行GPU和CPU的类型转换,但其实也可
- 前言因为之前一直忽略的就是所有语言中关于位操作,觉得用处并不多,可能用到也非常简单的用法,但是其实一直忽略的是它们的用处还是非常大的,下面先