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

Python爬虫抓取网页时span标签data-value显示为--如何解决

问题根源

普通requests请求拿到的是页面初始返回的静态HTML源码,目标span的data-value在初始源码里默认就是占位符--,真实数值是页面加载完成后,由JavaScript异步拉取数据再填充到DOM节点上的,静态请求拿不到渲染后的真实值。

可行解决方案

方案一:直接调用后端数据接口(优先选择,性能最好)

站点的情绪数据通过公开的前端接口返回,不需要登录或特殊鉴权,直接请求接口拿到结构化JSON数据,比解析HTML更稳定,不会受页面class名变动影响。
操作步骤:

  • 打开对应页面,按F12调出浏览器开发者工具,切换到「网络」面板,筛选「Fetch/XHR」类型请求
  • 刷新页面,在请求列表里找到返回客户情绪数据的接口,返回内容里包含各个交易品种的多空占比、头寸数值
  • 直接用requests请求这个接口,遍历返回的数据,按marketId字段匹配需要的GBPUSD、FR40等标的,就能拿到对应数值

参考代码:

import requests

headers = {
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/125.0.0.0 Safari/537.36",
    "Referer": "https://www.dailyfx.com/sentiment"
}
# 接口地址从浏览器开发者工具抓包结果中复制
api_url = "抓包获取的接口地址"
resp = requests.get(api_url, headers=headers)
resp.raise_for_status()
sentiment_data = resp.json()

# 提取目标品种的多头数据
target_symbols = {"GBPUSD", "FR40"}
for item in sentiment_data:
    symbol = item.get("marketId")
    if symbol in target_symbols:
        print(f"{symbol} 净多头占比:{item.get('longPercentage')}")

方案二:使用JS渲染工具加载完整页面后解析

如果不想抓接口,可以用能执行JavaScript的自动化工具,等页面完成数据渲染后再提取DOM内容,常用工具为Playwright或Selenium,以Playwright为例:

  1. 先安装依赖:
pip install playwright beautifulsoup4
playwright install
  1. 参考实现代码:
from playwright.sync_api import sync_playwright
from bs4 import BeautifulSoup as bs

target_symbols = {"GBPUSD", "FR40"}
result = {}

with sync_playwright() as p:
    # 启动无头浏览器
    browser = p.chromium.launch(headless=True)
    page = browser.new_page(
        user_agent="Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/125.0.0.0 Safari/537.36"
    )
    page.goto("https://www.dailyfx.com/sentiment", timeout=15000)
    # 等待数据加载完成:目标span的data-value不再是占位符--
    page.wait_for_selector(
        'span.dfx-rateDetail__percentageInfoText[data-value!="--"]',
        timeout=10000
    )
    page_content = page.content()
    browser.close()

soup = bs(page_content, "html.parser")
long_spans = soup.find_all(
    "span",
    class_="dfx-rateDetail__percentageInfoText font-weight-bold",
    attrs={"data-type": "long-value-info"}
)
for span in long_spans:
    symbol = span.get("data-market-id")
    if symbol in target_symbols:
        result[symbol] = span.get("data-value")

print(result)
注意事项
  • 所有请求都要携带正常的浏览器User-Agent,否则大概率被站点反爬策略拦截
  • 接口方案的爬取效率远高于无头浏览器方案,资源占用也更低,优先选用
  • 爬取时控制请求频率,不要对站点正常服务造成影响

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.30 13:15:35