赞
踩
有小伙伴可能会觉得明明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()
本文仅限于做技术交流学习,请勿用作任何非法商用!
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。