参考

Python Selenium.WebDriver 对 Cookies 的处理及应用『模拟登录』_driver.add_cookie-CSDN 博客

该教程还介绍了 request+cookie

学习

安装

1
pip install selenium

重要的开始

1
2
3
4
5
6
7
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.common.by import By

service = Service(executable_path=r'C:\chromedriver-win64\chromedriver.exe')
driver = webdriver.Chrome(service=service)
driver.implicitly_wait(20)

chromedriver.exe 下载问题

  1. chrome 浏览器—设置—关于 Chrome, 查看 Chrome 版本
  2. http://chromedriver.storage.googleapis.com/index.html — 下载旧版本的 chromedriver.exe
  3. https://googlechromelabs.github.io/chrome-for-testing — 下载较新版本的 chromedriver.exe

打开浏览器—打开一个无痕页面—进入 www.baidu.com---F12---存储---Cookie

  • driver.get_cookies()
  • driver.get_cookies(name)
1
2
3
4
driver.get('https://www.baidu.com')
cookies = driver.get_cookies()
for cookie in cookies:
print(cookie)

输出内容如下:

1
2
3
4
5
6
7
8
9
{'domain': '.baidu.com', 'expiry': 1734940645, 'httpOnly': False, 'name': 'ZFY', 'path': '/', 'sameSite': 'None', 'secure': True, 'value': 'BvZP5RU1H69s489:BJT5OsAvTtNexoPYRfW4mqHOosSM:C'}
{'domain': '.baidu.com', 'expiry': 1703491045, 'httpOnly': False, 'name': 'BA_HECTOR', 'path': '/', 'sameSite': 'Lax', 'secure': False, 'value': '8sag8081250185c40lah248i1iofp351q'}
{'domain': 'www.baidu.com', 'expiry': 1704268645, 'httpOnly': False, 'name': 'BD_UPN', 'path': '/', 'sameSite': 'Lax', 'secure': False, 'value': '12314753'}
{'domain': '.baidu.com', 'expiry': 1734940644, 'httpOnly': False, 'name': 'BAIDUID', 'path': '/', 'sameSite': 'Lax', 'secure': False, 'value': '76282A5DDCFBCC66417CC548580E2490:FG=1'}
{'domain': '.baidu.com', 'expiry': 1734940645, 'httpOnly': False, 'name': 'BAIDUID_BFESS', 'path': '/', 'sameSite': 'None', 'secure': True, 'value': '76282A5DDCFBCC66417CC548580E2490:FG=1'}
{'domain': '.baidu.com', 'expiry': 1734940644, 'httpOnly': False, 'name': 'H_PS_PSSID', 'path': '/', 'sameSite': 'Lax', 'secure': False, 'value': '39840_39934_39937_39943_39939_39974_39999_39662_40041'}
{'domain': '.baidu.com', 'expiry': 1737964644, 'httpOnly': False, 'name': 'PSTM', 'path': '/', 'sameSite': 'Lax', 'secure': False, 'value': '1703404593'}
{'domain': '.baidu.com', 'expiry': 1737964644, 'httpOnly': False, 'name': 'BIDUPSID', 'path': '/', 'sameSite': 'Lax', 'secure': False, 'value': '76282A5DDCFBCC66417CC548580E2490'}

获取百度首页名为BD_UPN的 Cookie 内容,并将其输出

1
driver.get_cookie("BD_UPN")

输出内容如下:

1
{'domain': 'www.baidu.com', 'expiry': 1704270407, 'httpOnly': False, 'name': 'BD_UPN', 'path': '/', 'sameSite': 'Lax', 'secure': False, 'value': '12314753'}

所以,每个 Cookie 就是一个字典

  • driver.add_cookie(cookie_dict)

Cookie 是一个键值对数据,传入的 Cookie 对象中必须包含namevalue两个属性。除此之外还有四个可选属性,分别为pathdomainsecureexpiry

示例

1
drive.add_cookie({"name": "MyCookie", "value": "this is my cookie!"})

****

  • driver.delete_all_cookies()
  • driver.delete_cookie(name)
  • 方法 1:手动账号登陆网页,手动记录 Cookie
  • 方法 2:写一个自动登陆+手动验证(可选)的函数,自动获取 cookie
1
2
3
4
5
6
7
8
9
# 删除所有的Cookies
driver.delete_all_cookies()

# 逐个添加Cookie,可以使用循环
driver.add_cookie(cookie_dict)
driver.add_cookie(cookie_dict)

# 刷新网页
driver.refresh()

实例

登录百度

基本思想

  1. 如果是第一次,需要先调用 gen_cookie_file 手动登录,并且会生成 cookie 文件
  2. 以后登录就可以使用 cookie 文件登录了
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
import json

from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.common.by import By




def gen_cookie_file(driver, url, cookie_save_path):
driver.get(url)
input("手动登录后,按回车键")
data = driver.get_cookies()
with open(cookie_save_path, "w", encoding="utf-8") as fw:
json.dump(data, fw)
print(f"{cookie_save_path} 文件已经生成")
return driver


def login_with_cookie(driver, url, cookie_save_path):
driver.get(url)
# 加载 cookie
with open(cookie_save_path, "r", encoding="utf-8") as fr:
cookies = json.load(fr)

# 使用 cookie 登录
driver.delete_all_cookies()
for c in cookies:
driver.add_cookie(c)
driver.refresh()
return driver


def get_info(drive):
# 点击设置
pass


if __name__ == "__main__":

service = Service(executable_path=r'chromedriver.exe')
driver = webdriver.Chrome(service=service)
driver.implicitly_wait(20)

login_first = True
cookie_save_path = r"cookie_ddx.txt"
url = "https://www.baidu.com"

# 登录
if login_first:
driver = gen_cookie_file(driver, url, cookie_save_path)

else:
driver = login_with_cookie(driver, url, cookie_save_path)

# 处理数据
get_info(driver)

# 退出
input("enter any key to exit")
driver.quit()