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}")
关键修复点
Cookie按钮处理:
- 改用
driver.execute_script执行点击,绕过元素被遮挡或位置计算错误的问题 - 使用更稳定的CSS选择器(
data-testid="accept-all-button")替代绝对XPath,避免页面结构变化导致定位失效
- 改用
动态分页处理:
- 使用
rel="next"的通用选择器定位下一页按钮,而非固定data-page="2",适配所有分页场景 - 点击前滚动到按钮位置,确保元素在可视区域内
- 用
EC.staleness_of等待旧页面元素失效,确认新页面加载完成,避免提取旧数据
- 使用
数据提取优化:
- 从当前页的
ul元素内直接提取日期,避免全局查找导致的重复数据 - 增加链接完整性校验,确保生成的URL有效
- 从当前页的
内容的提问来源于stack exchange,提问作者tre-ananas
相关产品推荐
相关产品推荐

