You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用Python的Selenium绕过Hemnet网站的Cookie弹窗

无法用Selenium绕过Hemnet网站的Cookie弹窗(Python新手求助)

我尝试抓取Hemnet房产网站的数据,但无法绕过Cookie弹窗。用的是Python 3和Selenium,搜了各种网上的解决方案都没用,作为Python新手希望得到简单易懂的指导。

我写的代码如下:

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
from selenium.common.exceptions import NoSuchElementException
from selenium.common.exceptions import TimeoutException
import time

HEMNET_URL = "https://www.hemnet.se/"
chrome_options = webdriver.ChromeOptions()
chrome_options.add_experimental_option("detach", True)
driver = webdriver.Chrome(options=chrome_options)
driver.get(HEMNET_URL)

time.sleep(5)


def cookie_click_1():
    try:
        cookie_button = driver.find_element(By.CSS_SELECTOR, value="Acceptera alla")
        cookie_button.click()
    except NoSuchElementException:
        print("no cookie popup")


def cookie_click_2():
    try:
        cookie_button = WebDriverWait(driver, 5).until(EC.element_to_be_clickable((By.CLASS_NAME, 'sc-dcJsrY kIAuBW')))
        cookie_button.click()
    except TimeoutException:
        print("no cookie popup")


def cookie_click_3():
    try:
        cookie_button = driver.find_element(By.XPATH, value="//button[normalize-space()='Acceptera alla']")
        cookie_button.click()
    except NoSuchElementException:
        print("no cookie popup")


def cookie_click_4():
    try:
        cookie_button = driver.find_element(By.LINK_TEXT, value="Acceptera alla")
        cookie_button.click()
    except NoSuchElementException:
        print("no cookie popup")


cookie_click_1()
cookie_click_2()
cookie_click_3()
cookie_click_4()

我要点击的按钮是"Acceptera alla",这个按钮没有明确可用的name、id,类名看起来是动态生成的。运行所有函数后都提示“no cookie popup”,点不了按钮进登录页面,想问哪里操作错了,或者网站有特殊机制?


问题分析与解决方法

你的代码里的几个错误:

  • cookie_click_1的CSS_SELECTOR用法错误:By.CSS_SELECTOR需要合法的CSS选择器规则,不能直接写按钮文本,这样根本找不到元素。
  • cookie_click_2的CLASS_NAME用法错误:By.CLASS_NAME不能同时传递多个类名(比如sc-dcJsrY kIAuBW),而且动态生成的类名不稳定,下次访问可能就失效了。
  • cookie_click_4的LINK_TEXT用法错误:By.LINK_TEXT是用来定位<a>标签的链接文本,但目标是<button>按钮,所以这个方法不适用。
  • cookie_click_3的XPATH可能存在等待问题:固定的time.sleep(5)不一定能保证元素加载完成,而且如果弹窗在iframe里,直接定位也会失败。

针对Hemnet的有效解决方法:

方法1:用XPATH精准定位按钮文本(推荐,文本固定稳定)

替换你原来的四个函数,用显式等待确保元素加载完成后再点击:

def cookie_click_fix():
    try:
        # 最长等待10秒,直到按钮可点击
        cookie_button = WebDriverWait(driver, 10).until(
            EC.element_to_be_clickable((By.XPATH, "//button[contains(text(), 'Acceptera alla')]"))
        )
        cookie_button.click()
        print("Cookie弹窗已关闭")
    except TimeoutException:
        print("未找到Cookie弹窗或等待超时")

# 只调用这个修复后的函数即可
cookie_click_fix()

方法2:直接设置浏览器偏好,跳过弹窗(更高效)

让Chrome自动接受所有Cookie,弹窗直接不会出现:

chrome_options = webdriver.ChromeOptions()
chrome_options.add_experimental_option("detach", True)
# 添加自动接受Cookie的配置
chrome_options.add_argument("--disable-notifications")
chrome_options.add_experimental_option("prefs", {
    "profile.default_content_setting_values.cookies": 1,
    "profile.block_third_party_cookies": False
})
driver = webdriver.Chrome(options=chrome_options)
driver.get(HEMNET_URL)

额外检查:弹窗是否在iframe中

部分网站会把Cookie弹窗放在iframe里,如果上面的方法都没用,先切换到iframe再定位:

def cookie_click_with_iframe():
    try:
        # 等待iframe加载并切换进去
        iframe = WebDriverWait(driver, 10).until(
            EC.presence_of_element_located((By.TAG_NAME, "iframe"))
        )
        driver.switch_to.frame(iframe)
        # 定位并点击按钮
        cookie_button = WebDriverWait(driver, 10).until(
            EC.element_to_be_clickable((By.XPATH, "//button[contains(text(), 'Acceptera alla')]"))
        )
        cookie_button.click()
        # 切回主页面
        driver.switch_to.default_content()
        print("Cookie弹窗已关闭")
    except TimeoutException:
        print("未找到iframe或Cookie弹窗")

cookie_click_with_iframe()

内容的提问来源于stack exchange,提问作者Stefan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.23 05:35:10