有小伙伴可能会觉得明明F12在开发者选项里面就能获取到cookie信息为啥还要专门写一个程序去获取,这不多此一举嘛其实并不是哟,首先呢一般你直接登录之后得cookie信息都是不完整得只有一条而且大部分都是加密过得,哪怕我们假设它是完整得你直接复制之后selenium也接受不了,因为直接复制得格式不是selenium要求的你再去转换格式不得很麻烦呀
不多废话哈切入正题,这次测试得目标网站为QQ空间 https://mail.qq.com/
先定义前面代码
from selenium import webdriver
from selenium.webdriver import ChromeOptions #这个包用来规避被检测的风险
import time #延迟
option = ChromeOptions()
option.add_experimental_option('excludeSwitches',['enable-automation'])
driver_path=r'驱动的路径' #定义好路径
driver=webdriver.Chrome(executable_path=driver_path,options=option) #初始化路径+规避检测
其实吧,QQ空间没啥好注意的地方,唯一需要注意的是这个登录框是在iframe里面,也就是嵌套得网页,如果你直接在原本的QQ空间网页定位元素是发现定位不到的。比如,我定位的账号输入框 :
这个时候我们需要切换到iframe去操作代码如下,如果不知道怎么切换的话可以看这位博主写的文章简单易懂好吧!(26条消息) selenium之 定位以及切换frame(iframe)_灰蓝-CSDN博客_selenium切换iframehttps://blog.csdn.net/huilan_same/article/details/52200586
def denglv():
driver.get('https://mail.qq.com/')
driver.implicitly_wait(10) #避免加载太久报错
time.sleep(1)
driver.switch_to_frame("login_frame") #切换到iframe去操作元素
能看到这里的我觉得就不用讲咋定位元素了,如果有实在不懂的小伙伴可以搜索一下有很多博主写的都很好的,我这里直接贴后面的代码
def denglv():
driver.get('https://mail.qq.com/')
driver.implicitly_wait(10)
time.sleep(1)
driver.switch_to_frame("login_frame")
zhanghao=driver.find_element_by_xpath('//input[@class="inputstyle"]').send_keys('QQ账号') #输入账号
time.sleep(2)
mima=driver.find_element_by_xpath('//input[@type="password"]').send_keys('QQ密码') #密码
# time.sleep(15)
denglvs= driver.find_element_by_xpath('//input[@type="submit"]').click() #点击登录按钮
time.sleep(4)
driver.refresh() #刷新网页
time.sleep(4)
cookie=driver.get_cookies() #获取cookie信息
print(cookie) #打印cookie信息
可以看到返回的cookie信息如下:
好了,怎么获取说到这里接下来就是怎么登录了
我直接贴代码,我都是有写注释的小伙伴自己看下哈
def denglv2():
driver.get('https://mail.qq.com/')
driver.implicitly_wait(10) # 如果网页没有加载完,避免出现加载超时得报错最多让他加载十秒
# driver.delete_all_cookies() #清空之前得cookie信息
cookies = #这里直接复制上面获取到得cookie信息粘贴就行了
for cookie in cookies:
if 'expiry' in cookie: # 有的cookie里面有这个参数,有的没有。有的话,需要做处理。
del cookie['expiry']
driver.add_cookie(cookie) # 传入cookie
driver.refresh() # 刷新页面
driver.get('https://mail.qq.com/') #重新请求页面
这里我说一下,为什么要对expiry做处理,因为有些网站是判断这个值看下是否过期,过期了就没法登录,还有的需要为切换为整形才可以,具体什么原因嘛,暂时我也不是很清楚,有懂的朋友可以说一下
最后也是 登录成功呀
完整源代码如下:
from selenium import webdriver
from selenium.webdriver import ChromeOptions #这个包用来规避被检测的风险
import time #延
option = webdriver.ChromeOptions()
option.add_experimental_option('useAutomationExtension', False)
option.add_experimental_option('excludeSwitches', ['enable-automation'])
driver_path = r'驱动路径' # 定义好路径
driver = webdriver.Chrome(executable_path=driver_path,options=option) # 初始化路径+规避检测
driver.execute_cdp_cmd("Page.addScriptToEvaluateOnNewDocument", {
"source": """
Object.defineProperty(navigator, 'webdriver', {
get: () => undefined
})
"""
})
def denglv():
driver.get('https://mail.qq.com/')
driver.implicitly_wait(10)
time.sleep(1)
driver.switch_to_frame("login_frame")
zhanghao=driver.find_element_by_xpath('//input[@class="inputstyle"]').send_keys('QQ账号') #输入账号
time.sleep(2)
mima=driver.find_element_by_xpath('//input[@type="password"]').send_keys('QQ密码') #密码
# time.sleep(15)
denglvs= driver.find_element_by_xpath('//input[@type="submit"]').click() #点击登录按钮
time.sleep(4)
driver.refresh() #刷新网页
time.sleep(4)
cookie=driver.get_cookies() #获取cookie信息
print(cookie) #打印cookie信息
def denglv2():
driver.get('https://mail.qq.com/')
driver.implicitly_wait(10) # 如果网页没有加载完,避免出现加载超时得报错最多让他加载十秒
# driver.delete_all_cookies() #清空之前得cookie信息
cookies = # 这里直接复制上面获取到得cookie信息粘贴就行了
for cookie in cookies:
if 'expiry' in cookie: # 有的cookie里面有这个参数,有的没有。有的话,需要做处理。
del cookie['expiry']
driver.add_cookie(cookie) # 传入cookie
driver.refresh() # 刷新页面
driver.get('https://mail.qq.com/')
if __name__ == '__main__':
denglv() #调用函数
# denglv2()
本文仅限于做技术交流学习,请勿用作任何非法商用!