如何用Python的Selenium绕过Hemnet网站的Cookie弹窗
我尝试抓取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
相关产品推荐
相关产品推荐

