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

无法在BeautifulSoup中获取页面历史行情数据的技术求助

问题原因

这个页面的「历史行情」数据是通过JavaScript动态加载的,requests库只能获取页面的初始HTML源码,无法执行JS渲染后续加载的内容,所以你用BeautifulSoup解析不到目标数据。

方案1:用Selenium模拟浏览器加载(直观易实现)

Selenium可以模拟浏览器打开页面,等待JS渲染完成后再获取页面内容,这样就能拿到包含历史行情的HTML。

代码示例:

import pandas as pd
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

url = "https://www.marketscreener.com/quote/index/MSCI-WORLD-SIZE-TILT-NETR-121861272/quotes/"

# 初始化Chrome浏览器(需提前下载对应版本的chromedriver)
driver = webdriver.Chrome()
driver.get(url)

# 等待历史行情表格加载完成
try:
    WebDriverWait(driver, 10).until(
        EC.presence_of_element_located((By.CSS_SELECTOR, "table.historicalQuotes"))
    )
finally:
    page_content = driver.page_source
    driver.quit()

# 解析提取数据
page_soup = BeautifulSoup(page_content, "html.parser")
table = page_soup.find("table", class_="historicalQuotes")

data = []
# 跳过表头行,遍历数据行
for row in table.find_all("tr")[1:]:
    cols = row.find_all("td")
    if len(cols) >= 2:
        date = cols[0].text.strip()
        close_price = cols[1].text.strip()
        data.append({"日期": date, "收盘价": close_price})

# 转为DataFrame
df = pd.DataFrame(data)
print(df)

方案2:直接调用API接口(更高效)

通过浏览器开发者工具(F12-网络标签页)抓包,能发现页面加载时会调用API接口获取历史行情数据,直接请求接口比模拟浏览器更高效。

代码示例(需根据实际抓包结果更新API地址和参数):

import requests
import pandas as pd

# 抓包获取的API地址及参数
api_url = "https://www.marketscreener.com/api/historical-quotes"
params = {
    "instrumentId": "121861272",
    "period": "daily",
    "startDate": "2023-01-01",
    "endDate": "2024-01-01"
}

headers = {
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/99.0.1234.567 Safari/537.36",
    "Referer": "https://www.marketscreener.com/quote/index/MSCI-WORLD-SIZE-TILT-NETR-121861272/quotes/"
}

response = requests.get(api_url, params=params, headers=headers)
data = response.json()

# 转换为DataFrame
df = pd.DataFrame(data, columns=["date", "close"])
df.columns = ["日期", "收盘价"]
print(df)

注意事项

  • 使用Selenium时,需保证chromedriver版本与Chrome浏览器版本匹配。
  • API接口的地址、参数可能随网站更新变化,需自行抓包确认最新信息。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.08 22:33:34