如何用Selenium点击Sky News网站的「全部接受Cookie」按钮?
问题描述
我想要为新闻网站news.sky.com编写一个抓取新闻标题的网络爬虫,但该网站经常弹出「全部接受Cookie」的提示框。我参考同类问题的指南使用XPath定位按钮,但触发了以下异常:
raise TimeoutException(message, screen, stacktrace)
看起来Selenium无法通过XPath找到该元素,请问能不能实现点击「全部接受」按钮?求帮忙解决,谢谢。
我的代码如下:
from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC from selenium import webdriver from selenium.webdriver.edge.service import Service from selenium.webdriver.common.by import By e_driver_path = r"F:/Download/Portable Test/msedgedriver.exe" # establish the web driver s = Service(e_driver_path) driver = webdriver.Edge(service=s) driver.get("https://news.sky.com/uk") # search = driver.find_element_by_id(ContentPlaceHolder1_NotifyBtn) WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.XPATH, "//*[@id='notice']/div[3]/button[1]"))).click() print("yes")
解决方案
Cookie提示框找不到通常是两个原因:元素在iframe里或者XPath定位器失效,针对sky news的情况,给你几个可行的修复方案:
方案1:检查并切换到iframe(如果存在)
部分网站会把Cookie弹窗放在独立的iframe中,Selenium默认无法直接定位到iframe内的元素,必须先切换上下文:
from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC from selenium import webdriver from selenium.webdriver.edge.service import Service from selenium.webdriver.common.by import By e_driver_path = r"F:/Download/Portable Test/msedgedriver.exe" s = Service(e_driver_path) driver = webdriver.Edge(service=s) driver.get("https://news.sky.com/uk") try: # 等待iframe加载并切换 iframe = WebDriverWait(driver, 10).until( EC.presence_of_element_located((By.CSS_SELECTOR, "iframe[title*='cookie']")) ) driver.switch_to.frame(iframe) # 点击全部接受按钮 accept_btn = WebDriverWait(driver, 10).until( EC.element_to_be_clickable((By.CSS_SELECTOR, "button[data-testid='cookie-accept-all']")) ) accept_btn.click() # 切回主文档 driver.switch_to.default_content() print("Cookie弹窗已处理") except: # 没有iframe或者按钮不存在时跳过 print("未检测到Cookie弹窗")
方案2:用更稳定的CSS选择器替代XPath
sky news的Cookie按钮有明确的测试ID或文本标识,CSS选择器比XPath更不容易失效:
# 替换原代码中的等待点击部分 try: # 针对中文界面 accept_btn = WebDriverWait(driver, 10).until( EC.element_to_be_clickable((By.XPATH, "//button[contains(text(),'全部接受')]")) ) accept_btn.click() except: # 备用:针对英文界面的按钮 accept_btn = WebDriverWait(driver, 10).until( EC.element_to_be_clickable((By.CSS_SELECTOR, "button[data-testid='cookie-accept-all']")) ) accept_btn.click()
方案3:直接通过浏览器配置跳过Cookie弹窗
如果用Edge浏览器,可以在启动时加参数自动接受所有Cookie,彻底避免弹窗:
from selenium.webdriver.edge.options import Options edge_options = Options() # 添加自动接受Cookie的配置 edge_options.add_argument("--disable-popup-blocking") edge_options.add_experimental_option("prefs", { "profile.default_content_setting_values.cookies": 1, "profile.cookie_controls_mode": 0 # 0代表允许所有Cookie }) # 初始化driver时传入配置 s = Service(e_driver_path) driver = webdriver.Edge(service=s, options=edge_options) driver.get("https://news.sky.com/uk")
内容的提问来源于stack exchange,提问作者turtle rough
相关产品推荐
相关产品推荐

