使用Pandas解析alreits.com/screener页面表格失败问题求解
问题原因
该页面表格数据为客户端JavaScript动态渲染,requests发起的静态请求仅能获取到初始空白页面框架,不包含实际表格数据,因此pandas、BeautifulSoup4均无法解析到目标内容。
可行解决方案
这里提供两种可直接落地的实现方式:
方案1:模拟浏览器渲染获取(兼容性最高)
使用Playwright模拟浏览器访问页面,等待表格渲染完成后再提取数据,适配所有动态渲染场景。
依赖安装
pip install playwright pandas playwright install chromium
实现代码
import pandas as pd from playwright.sync_api import sync_playwright with sync_playwright() as p: # 启动无头浏览器 browser = p.chromium.launch(headless=True) page = browser.new_page() page.goto("https://alreits.com/screener", wait_until="networkidle") # 等待目标表格渲染完成 page.wait_for_selector("#__next > div.MuiContainer-root.MuiContainer-maxWidthLg > div.MuiBox-root.jss9.Card__CardContainer-feksr6-0.fpbzHQ.ScreenerTable__CardContainer-sc-1c5wxgl-0.GRrTj > div > table") # 直接获取表格内容转DataFrame table_html = page.locator("#__next > div.MuiContainer-root.MuiContainer-maxWidthLg > div.MuiBox-root.jss9.Card__CardContainer-feksr6-0.fpbzHQ.ScreenerTable__CardContainer-sc-1c5wxgl-0.GRrTj > div > table").inner_html() df = pd.read_html(f"<table>{table_html}</table>")[0] # 提取需要的字段:股票代码、板块、评分、市值,可按需调整列名 target_df = df[["名称", "板块", "评分", "市值"]] print(target_df) browser.close()
方案2:直接调用数据接口(性能更高)
通过浏览器开发者工具抓包可获取到表格数据的后端接口,直接请求JSON数据解析即可,无需启动浏览器。
实现代码
import requests import pandas as pd url = "https://api.alreits.com/v1/screener" headers = { "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36" } response = requests.get(url, headers=headers) data = response.json() # 解析JSON数据转DataFrame df = pd.DataFrame(data["items"]) # 提取目标字段,可按需调整 target_df = df[["ticker", "sector", "rating", "market_cap"]] # 可重命名为中文列名 target_df.columns = ["股票代码", "板块", "评分", "市值"] print(target_df)
内容的提问来源于stack exchange,提问作者Joan Arau
相关产品推荐
相关产品推荐

