使用Selenium add_cookie跳过登录遇报错及CSV读取问题求助
初始问题
尝试通过Selenium WebDriver的add_cookie方法,利用本地cookies.csv文件(包含Name、Value、Domain三列)跳过目标网站登录,运行代码后既无法绕过登录,还抛出以下异常:
selenium.common.exceptions.InvalidArgumentException: Message: invalid argument: missing 'cookie'
使用的代码如下:
from selenium import webdriver import time from selenium.webdriver.chrome.options import Options from selenium.webdriver.chrome.service import Service from webdriver_manager.chrome import ChromeDriverManager import pandas as pd options = Options() options.binary_location = "C:\\Program Files\\Google\\Chrome\\Application\\chrome.exe" link = "https://**********" browser = webdriver.Chrome(options=options, service=Service(ChromeDriverManager().install())) browser.implicitly_wait(5) browser.get(link) def get_cookies_values(file): dict_reader = pd.read_csv(file, encoding='unicode_escape') list_of_dicts = list(dict_reader) return list_of_dicts cookies = get_cookies_values('cookies.csv') for i in cookies: browser.add_cookie(i) time.sleep(5) browser.quit()
更新后的问题
将编码从unicode_escape改为utf-8(或utf-8-sig)后,出现编码解码错误:
UnicodeDecodeError: 'utf-8' codec can't decode byte 0x85 in position 2391: invalid start byte
解决方案
一、解决CSV文件编码读取错误
- 确认文件实际编码:用Notepad++打开
cookies.csv,通过「编码」菜单查看当前文件的编码(比如GBK、Windows-1252、GB2312等)。 - 匹配编码读取:在
pd.read_csv中指定正确的编码,例如:- 如果是GBK编码:
pd.read_csv(file, encoding='gbk') - 如果是Windows-1252编码:
pd.read_csv(file, encoding='cp1252')
- 如果是GBK编码:
- 若暂时无法确定编码,可临时用
errors='replace'忽略错误(不推荐长期使用,可能导致Cookie值损坏):pd.read_csv(file, encoding='utf-8', errors='replace')
二、正确向Selenium Driver提供Cookie
导致missing 'cookie'异常和登录失败的核心原因是Cookie字典的键名不匹配Selenium要求,以及缺少必要的Cookie属性,修正步骤如下:
- 统一Cookie键名格式:Selenium的
add_cookie要求键名为小写(name、value、domain),而你的CSV列名是大写(Name、Value、Domain),需要转换。 - 补充必要的Cookie属性:部分网站的Cookie需要
path属性(默认设为'/'即可),否则无法生效。 - 添加Cookie后刷新页面:添加完成后刷新页面,才能让Cookie生效。
修正后的完整代码示例:
from selenium import webdriver import time from selenium.webdriver.chrome.options import Options from selenium.webdriver.chrome.service import Service from webdriver_manager.chrome import ChromeDriverManager import pandas as pd options = Options() options.binary_location = "C:\\Program Files\\Google\\Chrome\\Application\\chrome.exe" link = "https://**********" browser = webdriver.Chrome(options=options, service=Service(ChromeDriverManager().install())) browser.implicitly_wait(5) browser.get(link) def get_cookies_values(file): # 替换为你确认的CSV实际编码 df = pd.read_csv(file, encoding='gbk') # 重命名列名以匹配Selenium要求的小写键名 df = df.rename(columns={'Name': 'name', 'Value': 'value', 'Domain': 'domain'}) # 转换为字典列表 return df.to_dict('records') cookies = get_cookies_values('cookies.csv') for cookie in cookies: # 补充path属性,确保Cookie生效 if 'path' not in cookie: cookie['path'] = '/' browser.add_cookie(cookie) # 刷新页面使Cookie生效 browser.refresh() time.sleep(5) browser.quit()
内容的提问来源于stack exchange,提问作者Jay
相关产品推荐
相关产品推荐

