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为例:
- 先安装依赖:
pip install playwright beautifulsoup4 playwright install
- 参考实现代码:
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
相关产品推荐
相关产品推荐

