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

