requests请求未返回目标数据时,如何抓取动态渲染网页的表格内容?
问题原因
你请求的页面内容属于JS动态渲染数据,浏览器访问时会自动执行页面内嵌的JS脚本,异步拉取逮捕记录数据后再插入到#csp-data节点内;而requests库仅能获取服务器返回的原始静态HTML,不会执行JS逻辑,因此只能拿到空的#csp-data节点。
解决方案
有两种通用方案可解决该问题:
方案1:使用无头浏览器模拟页面渲染
直接模拟浏览器的运行逻辑,等待页面JS执行、数据渲染完成后再提取内容,适合不想分析接口的场景,以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 from bs4 import BeautifulSoup # 初始化无头Chrome options = webdriver.ChromeOptions() options.add_argument("--headless=new") driver = webdriver.Chrome(options=options) url = "https://databases.usatoday.com/nfl-arrests/" driver.get(url) # 等待表格渲染完成,最长等待10秒 WebDriverWait(driver, 10).until( EC.presence_of_element_located((By.CSS_SELECTOR, "#csp-data table tbody")) ) # 提取渲染完成后的页面源码进行解析 soup = BeautifulSoup(driver.page_source, "html.parser") test = soup.select('#csp-data > div > div:nth-child(3) > div > div.table-responsive > table > tbody') print(test) driver.quit()
使用前需要先安装依赖:pip install selenium beautifulsoup4,同时设备上需要安装对应版本的Chrome浏览器。
方案2:直接请求数据接口(更高效)
动态渲染的页面数据通常来自后端JSON接口,你可以通过浏览器控制台直接抓取出数据接口,跳过页面渲染步骤直接拿结构化数据:
- 打开浏览器F12开发者工具,切换到「网络」面板,筛选「Fetch/XHR」类型的请求
- 刷新页面后找到返回逮捕记录数据的接口,直接用
requests请求该接口即可拿到JSON格式的全量数据,无需解析HTML表格,效率远高于方案1。
内容的提问来源于stack exchange,提问作者derektgardner
相关产品推荐
相关产品推荐

