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

求助:使用Selenium爬取mst.dk/publikationer时分页失效

解决mst.dk分页爬取问题

分页机制分析

从提供的HTML结构和你的测试结果来看,该页面采用前端AJAX渲染分页:

  • URL中添加page=x参数无效,说明后端不识别该参数,分页数据是通过前端异步请求加载,而非URL路由控制
  • 分页按钮的class带随机哈希后缀(如Pagination_Pagination_next__N6tkt),属于动态生成类名,直接用完整class定位容易失效
  • element click intercepted错误是因为按钮不在可视区域,或被页面固定元素(如底部导航)遮挡

解决方案

1. 修复下一页按钮定位逻辑

放弃依赖动态class,改用语义化属性定位(aria-label),稳定性更高:

from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By

# 定位可用的下一页按钮(排除禁用状态)
next_button = WebDriverWait(driver, 10).until(
    EC.element_to_be_clickable((By.CSS_SELECTOR, 'a[aria-label="Next page"][aria-disabled="false"]'))
)

2. 解决点击拦截问题

通过滚动到可视区域+JS点击绕过前端事件拦截:

# 滚动到按钮位置(确保在可视区域)
driver.execute_script("arguments[0].scrollIntoView({behavior: 'smooth', block: 'center'});", next_button)
time.sleep(1)  # 等待滚动完成

# 优先原生点击,失败则用JS强制点击
try:
    next_button.click()
except:
    driver.execute_script("arguments[0].click();", next_button)

3. 重构分页爬取逻辑

放弃URL参数循环,改为循环点击下一页按钮,直到按钮禁用:

def parse_epa_filtered_keywords():
    driver = webdriver.Chrome(options=options)
    search_query = '+'.join(keywords.split())
    search_url = f"{link_filtered}?search={search_query}"
    
    driver.get(search_url)
    # 等待初始页面加载完成
    WebDriverWait(driver, 10).until(
        EC.presence_of_element_located((By.CSS_SELECTOR, 'a[class^="Link_Link__lzynb SearchResultItem_SearchResult"]'))
    )

    while True:
        # 处理当前页的PDF下载逻辑
        publications = WebDriverWait(driver, 10).until(
            EC.presence_of_all_elements_located((By.CSS_SELECTOR, 'a[class^="Link_Link__lzynb SearchResultItem_SearchResult"]'))
        )
        # --- 这里插入你的PDF下载代码 ---

        # 尝试获取下一页按钮
        try:
            next_button = WebDriverWait(driver, 10).until(
                EC.element_to_be_clickable((By.CSS_SELECTOR, 'a[aria-label="Next page"][aria-disabled="false"]'))
            )
            # 滚动+点击
            driver.execute_script("arguments[0].scrollIntoView({behavior: 'smooth', block: 'center'});", next_button)
            time.sleep(1)
            try:
                next_button.click()
            except:
                driver.execute_script("arguments[0].click();", next_button)
            # 等待页面刷新完成(通过上一页元素失效判断)
            WebDriverWait(driver, 10).until(EC.staleness_of(publications[0]))
        except:
            # 无下一页,退出循环
            print("已爬取全部页面")
            break

    driver.quit()

额外优化建议

  • 替换time.sleep为显式等待:等待元素加载完成而非固定延迟,提升爬取稳定性
  • 直接用requests下载PDF:获取PDF链接后,跳过Selenium直接用HTTP请求下载,效率更高
  • 检查反爬策略:添加合理的User-Agent,避免频繁请求触发拦截

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.18 19:07:24