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

