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

Selenium爬取瑞典政府文档站:Cookie同意与分页点击失败求助

瑞典政府文档页面爬取问题解决方案

核心问题

  • 点击Cookie同意按钮时,交替出现 element click intercepted: Element is not clickable at point (906, 934) 和 Message: move target out of bounds 错误
  • 页面为动态渲染,requests+BeautifulSoup 修改URL的分页方式无效,Selenium点击下一页按钮未成功

解决代码

以下是修复后的完整爬取代码,解决了Cookie点击和动态分页问题,同时提取文档链接与发布日期:

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
import time
from random import randint

# 目标页面URL
url = "https://www.regeringen.se/dokument-och-publikationer"

# 初始化Chrome驱动(根据实际路径调整)
driver = webdriver.Chrome('chromedriver-win64\chromedriver.exe')
driver.get(url)
driver.maximize_window()  # 最大化窗口减少元素遮挡

all_links = []
all_dates = []

try:
    # 处理Cookie同意:用JS执行点击,绕过元素遮挡/位置问题
    cookie_button = WebDriverWait(driver, 20).until(
        EC.presence_of_element_located((By.CSS_SELECTOR, 'button[data-testid="accept-all-button"]'))
    )
    driver.execute_script("arguments[0].click();", cookie_button)
    print("已同意Cookie")
    time.sleep(2)  # 等待Cookie弹窗消失

    # 循环爬取前3页
    for page in range(3):
        # 等待文档列表加载完成
        WebDriverWait(driver, 20).until(
            EC.presence_of_element_located((By.CSS_SELECTOR, 'ul.list--block.cl'))
        )
        
        # 提取当前页的链接和日期
        ul_tags = driver.find_elements(By.CSS_SELECTOR, 'ul.list--block.cl')
        for ul in ul_tags:
            # 提取链接
            a_tags = ul.find_elements(By.TAG_NAME, 'a')
            for a in a_tags:
                link = a.get_attribute('href')
                if link and not link.startswith("/tx"):
                    # 确保链接完整
                    if not link.startswith('https://www.regeringen.se'):
                        link = f"https://www.regeringen.se{link}"
                    all_links.append(link)
            # 提取日期
            date_divs = ul.find_elements(By.CSS_SELECTOR, 'div.block--timeLinks')
            for div in date_divs:
                date_text = div.text.strip()
                if date_text:
                    all_dates.append(date_text)
        
        print(f"已提取第{page+1}页数据,共{len(all_links)}条链接,{len(all_dates)}条日期")

        # 点击下一页(最后一页无需点击)
        if page < 2:
            try:
                # 等待下一页按钮可点击,用通用选择器而非固定data-page
                next_button = WebDriverWait(driver, 15).until(
                    EC.element_to_be_clickable((By.CSS_SELECTOR, 'a.filter-pagination[rel="next"]'))
                )
                # 滚动到按钮位置再点击
                driver.execute_script("arguments[0].scrollIntoView(true);", next_button)
                time.sleep(1)
                next_button.click()
                print("已跳转到下一页")
                # 等待页面切换完成
                WebDriverWait(driver, 20).until(
                    EC.staleness_of(ul_tags[0])  # 等待旧列表失效,确认页面更新
                )
                # 随机延迟防反爬
                time.sleep(randint(3, 6))
            except Exception as e:
                print(f"点击下一页失败: {e}")
                break

except Exception as e:
    print(f"整体执行出错: {e}")

finally:
    # 关闭驱动
    driver.quit()

# 输出结果示例
print("\n提取结果示例:")
for link, date in zip(all_links[:5], all_dates[:5]):
    print(f"日期: {date} | 链接: {link}")

关键修复点

  1. Cookie按钮处理:

    • 改用driver.execute_script执行点击,绕过元素被遮挡或位置计算错误的问题
    • 使用更稳定的CSS选择器(data-testid="accept-all-button")替代绝对XPath,避免页面结构变化导致定位失效
  2. 动态分页处理:

    • 使用rel="next"的通用选择器定位下一页按钮,而非固定data-page="2",适配所有分页场景
    • 点击前滚动到按钮位置,确保元素在可视区域内
    • 用EC.staleness_of等待旧页面元素失效,确认新页面加载完成,避免提取旧数据
  3. 数据提取优化:

    • 从当前页的ul元素内直接提取日期,避免全局查找导致的重复数据
    • 增加链接完整性校验,确保生成的URL有效

内容的提问来源于stack exchange,提问作者tre-ananas

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.06 19:30:57