1、WebDriver相关的Cookies操作
- get_cookies(): 获取当前会话中当前域名所有cookies
- get_cookie(name): 获取当前会话中当前域名指定name对应的cookie值
- delete_cookie(name): 删除指定cookie
- delete_all_cookies(): 删除所有cookie
- add_cookie(self, cookie_dict): 添加cookie
1.1、添加Cookie时需要逐条添加,cookie_dict示例:
- driver.add_cookie({'name' : 'foo', 'value' : 'bar'})
- driver.add_cookie({'name' : 'foo', 'value' : 'bar', 'path' : '/'})
- driver.add_cookie({'name' : 'foo', 'value' : 'bar', 'path' : '/', 'secure':True})"
2、如何添加cookie实现绕过登录
以百度为例
- 我们先登录百度为例,通过F12查看应用程序(Application),BDUSS就是cookie。
从图中可以找出:name= "BDUSS",value = "3R-T21PamZseEJmLVlmQ1ZNS2ZRQ3VPeUJE"
构造cookie字典
cookie = {'name' : 'BDUSS', 'value' : '3R-T21PamZseEJmLVlmQ1ZNS2ZRQ3VPeUJEVUtXUE**'}
然后调用:driver.add_cookie(cookie_dict=cookie)
from selenium import webdriver import time driver = webdriver.Chrome() driver.maximize_window() time.sleep(1) cookie = {"name":"BDUSS", "value":"3R-T21PamZseEJmLVlmQ1ZNS2ZRQ3VPeUJEVUtXUEoxUkx2ODVTZ1REZmczOVZmSVFBQUFBJCQAAAAAAAAAAAEAAAA1p7iuyeTI1WluZwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOBSrl~gUq5fb"} driver.add_cookie(cookie_dict=cookie) driver.get("https://www.baidu.com/") time.sleep(10) driver.quit()
Traceback (most recent call last): File "I:/python/softwaredate/py_basics/1****/14 selenium cookie绕过登录.py", line 10, in <module> driver.add_cookie(cookie_dict=cookie) File "D:\software\python38\lib\site-packages\selenium\webdriver\remote\webdriver.py", line 894, in add_cookie self.execute(Command.ADD_COOKIE, {'cookie': cookie_dict}) File "D:\software\python38\lib\site-packages\selenium\webdriver\remote\webdriver.py", line 321, in execute self.error_handler.check_response(response) File "D:\software\python38\lib\site-packages\selenium\webdriver\remote\errorhandler.py", line 242, in check_response raise exception_class(message, screen, stacktrace) selenium.common.exceptions.InvalidCookieDomainException: Message: invalid cookie domain (Session info: chrome=85.0.4183.102)**
如发现如上报错怎么解决呢:只需要在添加cookie上方增加一个打开网页的地址即可
from selenium import webdriver import time driver = webdriver.Chrome() driver.maximize_window() time.sleep(1) cookie = {"name":"BDUSS", "value":"3R-T21PamZseEJmLVlmQ1ZNS2ZRQ3VPeUJEVUtXUEoxUkx2ODVTZ1REZmczOVZmSVFBQUFBJCQAAAAAAAAAAAEAAAA1p7iuyeTI1WluZwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOBSrl~gUq5fb"} driver.get("https://www.baidu.com/") #添加这一行即可 driver.add_cookie(cookie_dict=cookie) driver.get("https://www.baidu.com/") time.sleep(10) driver.quit()
上面的方式就可以实现绕过登录,不过这要注意以下两点:
- 生成 cookie 的账号不能有退出操作,否则 cookie 会失效。
- 注意 cookie 的有效期(
Expires/Max-Age
列),可能需要定时更新 cookie
3、接口登录获取cookie,构造成cookie_dict添加到add_cookie
import requests from selenium import webdriver from time import sleep def get_cookie(username, password): login_url = 'http://****/newecshop/admin/privilege.php' data = dict(username=username,password=password, act='signin') res = requests.post(login_url, data=data, allow_redirects=False) esscp_id = res.cookies.get('ECSCP_ID') cookie = dict(name='ECSCP_ID',value=esscp_id) return cookie admin_url = 'http://****/newecshop/admin/index.php' driver = webdriver.Chrome() driver.get(admin_url) cookie = get_cookie(****, ****) driver.add_cookie(cookie) driver.get('http://***/newecshop/admin/order.php?act=list') sleep(3) driver.quit()
4、 启动 Chrome 浏览器绕过登录
我们每次打开浏览器做相应操作时,对应的缓存和 cookie 会保存到浏览器默认的路径下,我们先查看个人资料路径,以 chrome 为例,我们在地址栏输入chrome://version/
图中的个人资料路径就是我们需要的,我们去掉后面的 \Default,然后在路径前加上「–user-data-dir=」就拼接出我们要的路径了。
profile_directory = r'--user-data-dir=C:\Users\xxx\AppData\Local\Google\Chrome\User Data'
接下来,我们启动浏览器的时候采用带选项时的启动,这种方式启动浏览器需要注意,运行代码前需要关闭所有的正在运行 chrome 程序,不然会报错。全部代码如下。
from selenium import webdriver import time import os,platform if platform.system() =="Windows": os.system("taskkill -im chrome* -f") # 把chrome开头的进程都杀掉 else: os.system("killall -9 chrome*") # 获取用户目录 my_dir = os.path.expanduser("~") profile_directory = r'--user-data-dir={}\AppData\Local\Google\Chrome\User Data'.format(my_dir) print(profile_directory) option = webdriver.ChromeOptions() option.add_argument(profile_directory) driver = webdriver.Chrome(chrome_options=option) driver.get("https://www.baidu.com/") time.sleep(2)
selenium 自动化启动浏览器后我们会发现我之前保存的书签完整在浏览器上方,baidu 账号也是登录的状态。
5、绕过图形验证码的网站
文中第一个图是简书登录时的图形验证码,我们登录简书后(cookie 有一定的时效,貌似有 10 天半个月左右),把上面代码中的链接换成简书的,再用上面的方法觉可以实现绕过登录页的图形验证码。
原文链接:
链接:https://www.jianshu.com/p/d442a3cbef3a