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

Python/Selenium爬取点击后URL不变的动态加载ul列表方法

点击触发动态加载列表的爬取实现方案

核心问题原因

点击触发加载后URL无变化、解析工具仅能获取空<ul>标签,本质是两类错误操作导致:

  • 若直接用requests类静态请求库爬取,根本没有执行页面的JS点击逻辑,自然拿不到JS动态插入的<li>节点
  • 若用自动化工具模拟点击后立刻提取页面源码,此时前端异步拉取数据的请求还未完成,DOM树还没渲染出列表内容,同样会拿到空标签

方案1:直连后端数据接口(优先推荐,效率最高)

这类点击加载的列表,数据全部来自前端触发的异步接口,不需要模拟浏览器操作即可拿到全量数据:

  • 打开浏览器开发者工具,切换到「网络」面板,开启「Fetch/XHR」请求过滤
  • 手动点击页面的搜索触发列表加载,在网络请求列表里找到返回对应列表数据的接口,响应内容为结构化JSON,直接包含所有列表项的全量字段,无需解析HTML
  • 用requests库复现该接口请求即可,注意携带浏览器请求头中的User-Agent、Referer字段即可绕过基础校验,几秒内就能拉完全部400条列表数据,稳定性远高于模拟浏览器方案

方案2:修正Selenium等待逻辑(无接口逆向成本)

如果不想分析接口,只要修正Selenium的等待逻辑,就能拿到渲染完成的完整DOM:

  • 摒弃点击后立刻取源码、或用固定时长time.sleep()等待的写法,改用Selenium内置的显式等待机制
  • 等待条件设置为「列表容器下出现<li>子节点」,确认DOM渲染完成后再提取页面源码交给解析工具处理
  • 核心实现代码参考:
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By
from bs4 import BeautifulSoup

# 浏览器初始化、打开目标页面的逻辑省略
# 定位搜索按钮并触发点击
search_button = driver.find_element(By.CSS_SELECTOR, "button.dealer-search-btn")
search_button.click()

# 设置最长15秒等待,直到列表项加载到DOM中
wait = WebDriverWait(driver, 15)
wait.until(EC.presence_of_all_elements_located((By.CSS_SELECTOR, "div.dealer-result-wrap ul li")))

# 渲染完成后再解析页面
soup = BeautifulSoup(driver.page_source, "html.parser")
all_dealer_items = soup.select("div.dealer-result-wrap ul li")
# 遍历all_dealer_items提取所需字段即可

注意:如果列表存在滚动加载、分页加载逻辑,每触发一次加载操作都要执行一次显式等待,确认新的列表项渲染完成后再提取内容,避免漏数。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 05:27:13