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

使用Python爬取MacroTrends股息率图表数据失败,求可行实现方案

爬取MacroTrends股息率数据的解决方案

问题根因

你之前使用pandas.read_html能成功抓取账面价值数据,是因为对应页面的数值直接写死在静态HTML的<table>标签中;但股息率页面的表格数据存储在页面内嵌的JS变量里,由前端脚本动态渲染生成,静态HTML中没有现成的表格结构,所以read_html无法识别到对应内容。

是否可以用BeautifulSoup实现?

完全可以,该站点的股息率数据没有做异步接口加载,直接嵌在页面的<script>标签中,用BeautifulSoup配合正则提取即可,不需要调用Selenium之类的重型爬取工具。

具体实现代码

import requests
from bs4 import BeautifulSoup
import re
import json
import pandas as pd

# 模拟浏览器请求头,避免被反爬拦截
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"
}
url = "https://www.macrotrends.net/stocks/charts/BMO/Bank-of-Montreal/dividend-yield-history"

# 发起请求获取页面内容
res = requests.get(url, headers=headers)
res.encoding = res.apparent_encoding

# 用BeautifulSoup解析页面
soup = BeautifulSoup(res.text, "html.parser")

# 遍历所有script标签,找到包含数据的JS变量
pattern = re.compile(r'var originalData = (.*?);', re.S)
data_str = None
for script in soup.find_all("script"):
    if script.string:
        match = pattern.search(script.string)
        if match:
            data_str = match.group(1)
            break

# 解析JSON数据转为DataFrame
if data_str:
    raw_data = json.loads(data_str)
    # 处理数据字段,提取日期和股息率
    df = pd.DataFrame(raw_data, columns=["date", "dividend_yield"])
    # 清洗数值,去掉百分号转为浮点型
    df["dividend_yield"] = df["dividend_yield"].str.replace("%", "").astype(float)
    print(df)
else:
    print("未找到对应数据")

代码说明

  • 首先通过请求头模拟浏览器访问,避免站点的反爬机制拦截请求
  • 用正则匹配到JS中存储原始数据的originalData变量,提取JSON格式的原始数据
  • 后续可根据自己的需求对数据做进一步的清洗、存储操作

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 00:06:03