如何使用Python Selenium绕过网站Cookie通知弹窗
原有方案失效原因
- 代码逻辑顺序错误:先调用
driver.get()加载完整页面后才添加Cookie,此时页面已完成初始化,Cookie同意弹窗已经触发渲染,后续添加Cookie再刷新也容易因为Cookie字段校验不通过被站点拦截。 - 导出的Cookie格式不兼容:从主浏览器导出的CSV格式Cookie常丢失必填字段,或把布尔值、数字类型字段存为字符串,Selenium不会自动做类型转换,这类格式错误的Cookie会被站点判定为无效。
可行解决方案
方案1:直接定位弹窗同意按钮点击(稳定性最高)
不需要额外处理Cookie逻辑,等待弹窗的同意按钮加载完成后直接点击即可,适配绝大多数站点的Cookie弹窗场景,示例代码:
from time import sleep from selenium import webdriver from selenium.webdriver.common.by import By from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC driver = webdriver.Firefox() driver.get("https://www.antenne.de/programm/aktionen/pausenhof-konzerte/die-antenne-bayern-pausenhof-konzerte-2022/") try: # 最长等待10秒,直到「同意所有Cookie」按钮可点击 accept_btn = WebDriverWait(driver, 10).until( EC.element_to_be_clickable((By.CSS_SELECTOR, 'button[title="Akzeptieren"], button.consent-accept-all')) ) accept_btn.click() # 等待弹窗消失后再执行后续自动化操作 sleep(1) except Exception: # 未检测到弹窗时直接跳过,不中断流程 pass # 后续自动化逻辑写在此处
如果上述选择器无法匹配到按钮,可打开浏览器开发者工具检查同意按钮的实际id、class属性,替换对应选择器即可。
方案2:修正Cookie导入逻辑(适合需要固定会话状态的场景)
如果需要复用预存的登录/同意状态,调整Cookie写入顺序、补全必填字段即可,示例代码:
from time import sleep from selenium import webdriver from csv import DictReader driver = webdriver.Firefox() # 先访问同域下的任意地址,初始化对应域名的Cookie存储,不要直接加载目标页面 driver.get("https://www.antenne.de/404") def get_cookies_values(file): with open(file, encoding="utf-8-sig") as f: dict_reader = DictReader(f) list_of_dicts = list(dict_reader) return list_of_dicts cookies = get_cookies_values("cookies.csv") for i in cookies: cookie = {} for k, v in i.items(): # 转换字段类型为Selenium要求的格式 if k in ["secure", "httpOnly"]: cookie[k] = v.lower() == "true" elif k in ["expiry", "expires"] and v.isdigit(): cookie["expiry"] = int(v) # 过滤浏览器导出的Selenium不识别的冗余字段 elif k not in ["sameParty", "storeId", "id"]: cookie[k] = v # 补全域名配置,确保Cookie写入正确的域下 if "domain" not in cookie: cookie["domain"] = ".antenne.de" try: driver.add_cookie(cookie) except Exception: # 跳过格式错误的无效Cookie pass # Cookie全部写入完成后,再跳转至目标页面 driver.get("https://www.antenne.de/programm/aktionen/pausenhof-konzerte/die-antenne-bayern-pausenhof-konzerte-2022/")
方案3:修改浏览器启动配置(加载速度最快)
通过Firefox的首选项配置开启自动处理Cookie弹窗能力,从页面加载阶段就阻止弹窗弹出,示例代码:
from selenium import webdriver from selenium.webdriver.firefox.options import Options opts = Options() # 开启Firefox原生Cookie横幅自动点击能力(支持Firefox 110及以上版本) opts.set_preference("cookiebanners.service.mode", 1) opts.set_preference("cookiebanners.bannerClicking.enabled", True) opts.set_preference("network.cookie.cookieBehavior", 0) driver = webdriver.Firefox(options=opts) driver.get("https://www.antenne.de/programm/aktionen/pausenhof-konzerte/die-antenne-bayern-pausenhof-konzerte-2022/") # 页面加载完成后不会弹出Cookie通知
内容的提问来源于stack exchange,提问作者Maro
相关产品推荐
相关产品推荐

