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

使用Python爬取ul.se公交时刻表遇动态数据无法获取问题咨询

问题原因

你遇到的是动态渲染站点的典型爬取问题:https://ul.se 是基于Angular框架开发的单页应用(SPA),公交时刻这类核心数据不会直接写在初始HTML源码里,是页面加载完成后,浏览器在后台调用后端接口拿到JSON格式的时刻数据,再动态插入到DOM里的。你在开发者工具里看到的元素是渲染完成后的最终DOM,和初始请求返回的源码完全不是一回事,所以直接用BeautifulSoup解析初始页面肯定找不到对应内容。

解决方案

方案1:直接抓后端接口(推荐,效率最高)

你可以用浏览器开发者工具的「网络」面板抓实际的数据请求:

  • 打开开发者工具切换到「网络」标签,筛选「Fetch/XHR」类型的请求
  • 重新输入地点查询公交时刻,找到请求路径里带journey或者search相关的接口
  • 直接请求这个接口就能拿到结构化的JSON格式时刻数据,不需要解析HTML,比爬页面简单很多
  • 注意请求的时候要带全请求头里的User-Agent、Referer等参数,避免被站点拦截

方案2:模拟浏览器渲染(适合新手,不需要分析接口)

如果不想分析接口,可以用能模拟浏览器运行的工具,直接拿到渲染完成后的完整DOM再解析:

  • 可以用Selenium、Playwright这类自动化工具,工具会模拟真实浏览器打开页面,等待动态内容加载完成后,再获取完整的页面源码
  • 等内容加载完成后,你之前复制的CSS选择器就可以正常使用了
  • 示例核心代码(以Selenium为例):
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

driver = webdriver.Chrome()
driver.get("你的查询链接")
# 等待目标元素加载完成
wait = WebDriverWait(driver, 10)
time_element = wait.until(EC.presence_of_element_located((By.CSS_SELECTOR, '#travelResults > ul-search-journey-result-card:nth-child(3) > div > div.result-head > div.result-row.time > span.dpt-arr-time.ng-binding')))
print(time_element.text)
driver.quit()

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.14 06:51:05