Python3结合Selenium实现Cookie免密登录的方法
本文介绍如何利用Python3与Selenium库实现Cookie免密登录。通过清除现有Cookie、手动或程序化获取目标网站的Cookie信息,再将获取的Cookie添加至浏览器会话中,从而跳过密码登录步骤。文章提供了具体的代码示例,包括登录获取Cookie和后续免密登录两个场景,适用于爬虫和自动化测试场景。
Cookie免密登录原理与思路
经过两天的研究,终于实现了利用Cookie进行免密登录的功能,其本质实际上是维持Session会话。对此感到十分欣喜,因为在Python爬虫交流群中向各位前辈请教时,得到的回复让人有些失望,最终只能依靠自己摸索解决。
求人不如求己,为此我总结了一些经验,希望避免入门的新手再次踩坑。实际上,网络上许多博客的讲解往往不够详细,甚至存在缺失。
首先应独立思考问题,遇到不懂的地方可以去群里请教,但最重要的是理解事物的本质,只有理解了才能灵活运用。最后,在百度上搜索所有相关博客,逐篇阅读并总结规律,舍弃质量较差的内容,这样通常能获得启发。例如,Selenium的本质是操作浏览器,那么操作Cookie也是操作浏览器的一部分。当使用Selenium打开浏览器时,初始状态是空的,一旦访问某个网站,就会生成相关的Cookie信息。我们可以利用Selenium打开网站后,先清除所有Cookie以避免干扰,然后等待一段时间(如20秒)以便完成登录操作,此时会产生新的Cookie。我们将这些Cookie获取下来,即可实现后续的免密登录。
登录获取Cookie的代码实现
下面直接展示相关代码实现。
# 登录
def login_jd():
# 登录前清除所有cookie
browser.get('https://www.baidu.com/')
browser.delete_all_cookies()
# 打印登录前的cookie
cookieBefore = browser.get_cookies()
print(cookieBefore)
print("------------------------------------------------------------------------")
time.sleep(2)
list_cookies = [
{'domain': '.baidu.com', 'httpOnly': False, 'name': 'H_PS_PSSID', 'path': '/', 'secure': False, 'value': '1420_21120_29074_29237_2518_2909_29134_2832_28585_26350_2913'},
{'domain': '.baidu.com', 'expiry': 159184274.325927, 'httpOnly': False, 'name': 'BAIDUID', 'path': '/', 'secure': False, 'value': 'FF789623EA1785FF0D55ED0401D057B2:FG=1'},
{'domain': 'www.baidu.com', 'expiry': 1563289, 'httpOnly': False, 'name': 'BD_UPN', 'path': '/', 'secure': False, 'value': '123143'},
{'domain': '.baidu.com', 'expiry': 1560354688.892916, 'httpOnly': False, 'name': 'BDORZ', 'path': '/', 'secure': False, 'value': 'B490B5BF6F3CD40255D22BCDA1598'},
{'domain': '.baidu.com', 'expiry': 1819468287.471656, 'httpOnly': True, 'name': 'BDUSS', 'path': '/', 'secure': False, 'value': 'tGem1JzblNpOa1VVek0yLThmbWR6RxENWZtcVNwUThpT2hCLTVsUFBQUFBJCQAAAAAAAAAAAEAAAA4MdBAd3d3d2dnZ2dnZWVlZWUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAALkI~1y5CP9cVm'},
{'domain': '.baidu.com', 'expiry': 2569420288, 'httpOnly': False, 'name': 'BIDUPSID', 'path': '/', 'secure': False, 'value': '587A2695FCD6D043A5FE5139E4F'},
{'domain': '.baidu.com', 'expiry': 3707755.819949, 'httpOnly': False, 'name': 'PSTM', 'path': '/', 'secure': False, 'value': '156027786'},
{'domain': 'www.baidu.com', 'httpOnly': False, 'name': 'BD_HOME', 'path': '/', 'secure': False, 'value': '1'}
]
# 获取之后的cookie
cookies = browser.get_cookies()
print(browser.get_cookies())
# 将获取的的所有cookies添加到浏览器
for cookie in list_cookies:
browser.add_cookie(cookie)
print(cookie)
time.sleep(2)
# 刷新页面即可更新cookie
browser.refresh()
time.sleep(505)
browser.quit()


免密登录的二次调用示例
示例二展示了具体的操作流程。
首先,使用用户名和密码登录以获取Cookie信息。
import json
import time
from selenium.webdriver.chrome.options import Options
from selenium import webdriver
from selenium.webdriver.support.wait import WebDriverWait
from selenium.common.exceptions import NoSuchElementException
class Crawler():
def gather():
chrome_options = Options()
chrome_options.add_argument("window-size=1024,768")
driver = webdriver.Chrome(chrome_options=chrome_options, executable_path='C:\devtool\Anaconda\Scripts\chromedriver')
wait = WebDriverWait(driver, 1)
##登录百度知道
logurl = 'https://zhidao.baidu.com/'
#登录前清楚所有cookie
driver.delete_all_cookies()
driver.get(logurl)
##登录前打印cookie
print(driver.get_cookies())
##点击登录按钮
driver.find_element_by_xpath('//*[@id="userbar-login"]').click()
# driver.find_element_by_id("userbar-login").click()
time.sleep(2)
##首次尝试的 默认进入扫码登录的界面
try:
footerULoginBtn = driver.find_element_by_xpath('//*[@id="TANGRAM__PSP_10__footerULoginBtn"]')
footerULoginBtn.click() #切换到用户名和密码登录
footerULoginBtn_not_exist = False
except:
footerULoginBtn_not_exist = True
## 用户名跟密码的设置并点击提交
user = driver.find_element_by_name('userName')
user.clear()
pwd = driver.find_element_by_name('password')
pwd.clear()
submit = driver.find_element_by_id('TANGRAM__PSP_10__submit')
time.sleep(2)
user.send_keys('用户名')
pwd.send_keys('密码')
time.sleep(1)
submit.click()
time.sleep(1)
## 发送手机验证码 验证
##点击发送按钮
###是否需要输入手机验证码
try:
driver.find_element_by_xpath('//*[@id="TANGRAM__28__button_send_mobile"]').click()
time.sleep(10)
##使用shell交互式,接受验证码
message = input("Tell me the captcha: ")
##输入验证码
captcha = driver.find_element_by_xpath('//*[@id="TANGRAM__28__input_label_vcode"]')
time.sleep(1)
captcha.send_keys(message)
time.sleep(1)
##点击提交
driver.find_element_by_xpath('//*[@id="TANGRAM__28__button_submit"]').click()
time.sleep(3)
except:
time.sleep(1)
### 获取cookie
cookie = driver.get_cookies()
print(cookie)
jsonCookies = json.dumps(cookie)
with open('vcyber.json', 'w') as f:
f.write(jsonCookies)
time.sleep(30)
Crawler.gather()
获取到Cookie后,在后续访问中无需再次输入密码即可登录。
import json
import time
from selenium.webdriver.chrome.options import Options
from selenium import webdriver
from selenium.webdriver.support.wait import WebDriverWait
from selenium.common.exceptions import NoSuchElementException
class Crawler():
def gather():
chrome_options = Options()
chrome_options.add_argument("window-size=1024,768")
driver = webdriver.Chrome(chrome_options=chrome_options, executable_path='C:\devtool\Anaconda\Scripts\chromedriver')
wait = WebDriverWait(driver, 1)
##登录百度知道
logurl = 'https://zhidao.baidu.com/'
#登录前清楚所有cookie
driver.delete_all_cookies()
driver.get(logurl)
f1 = open('vcyber.json')
cookie = f1.read()
cookie = json.loads(cookie)
for c in cookie:
driver.add_cookie(c)
# # 刷新页面
driver.refresh()
Crawler.gather()
至此,关于Python3结合Selenium实现Cookie免密登录的示例代码介绍完毕。更多关于Selenium Cookie免密登录的内容,请搜索本站以前的文章或继续浏览下面的相关文章,希望大家以后多多支持本站!
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









