如何抓取网站中JavaScript渲染的表格至DataFrame?
问题原因
这个网站的表格是JavaScript动态渲染的,requests只能获取页面的初始HTML源码,此时表格还未生成,所以BeautifulSoup找不到目标表格元素。从你提供的Soup输出也能看到,页面只有空容器和JS脚本,没有实际表格内容。
可行方案
有两种高效的实现方式:
方案1:直接调用网站API(推荐,速度更快)
观察网站的网络请求可以发现,表格数据是通过API接口返回的JSON格式数据,无需渲染页面。直接请求该接口即可拿到数据并转为DataFrame:
import requests import pandas as pd headers = {'user-agent': 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.28 Safari/537.36'} response = requests.get('https://iborrowdesk.com/api/ticker', headers=headers, timeout=10) response.raise_for_status() # 将JSON数据转为DataFrame df = pd.DataFrame(response.json()) print(df.head())
方案2:使用浏览器自动化工具(Selenium)
如果API接口有变化,或者需要模拟完整页面渲染流程,可以用Selenium驱动真实浏览器加载页面,等待表格渲染完成后再提取数据:
步骤1:安装依赖
先安装Selenium和对应浏览器驱动(比如ChromeDriver):
pip install selenium
ChromeDriver需要和你的Chrome版本匹配,下载后放在系统PATH中或指定路径。
步骤2:代码示例
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 import pandas as pd # 初始化Chrome浏览器(无头模式,不显示窗口) options = webdriver.ChromeOptions() options.add_argument('--headless=new') options.add_argument('user-agent=Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.28 Safari/537.36') driver = webdriver.Chrome(options=options) try: driver.get('https://iborrowdesk.com') # 等待表格加载完成,最多等待10秒 table = WebDriverWait(driver, 10).until( EC.presence_of_element_located((By.CLASS_NAME, 'table-condensed')) ) # 将表格转为DataFrame df = pd.read_html(table.get_attribute('outerHTML'))[0] print(df.head()) finally: driver.quit() # 关闭浏览器
注意事项
- 使用API时,保持请求头一致性,避免被网站拦截;
- 使用Selenium时,确保浏览器驱动与浏览器版本匹配,无头模式可减少资源占用;
- 请勿频繁请求网站,遵守网站的使用条款。
内容的提问来源于stack exchange,提问作者Tom Kurushingal
相关产品推荐
相关产品推荐

