求助:使用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
相关产品推荐
相关产品推荐

