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

Scrapy XPath返回0而非实际价格问题求助

解决Scrapy爬取coins.ph时价格显示0的问题

这个问题我碰到过好多次啦!核心原因很简单——你用Scrapy拿到的是服务器返回的静态初始HTML,而Chrome里看到的真实价格是页面加载后通过JavaScript动态渲染出来的。服务器返回的原始HTML里,这个bitcoin-buy-price span的初始值就是0,JS执行后才会替换成实际价格。

下面给你两个最实用的解决方案:

方案一:直接抓取数据接口(推荐,效率更高)

动态渲染的页面,背后一般都有API接口提供数据,直接请求接口比解析页面简单太多:

  • 打开Chrome开发者工具的「Network」标签,刷新页面后筛选「XHR/Fetch」类型的请求,找包含price、bitcoin这类关键词的接口(比如可能是/api/v1/markets/prices这类地址)
  • 找到接口后,直接在Scrapy里请求这个API地址,解析返回的JSON数据即可拿到真实价格。示例代码大概是这样:
def start_requests(self):
    # 替换成你找到的真实API地址
    yield scrapy.Request(url='https://coins.ph/api/xxx/prices', callback=self.parse_price)

def parse_price(self, response):
    price_data = response.json()
    bitcoin_buy_price = price_data['bitcoin']['buy_price']
    print(f"真实比特币买入价:{bitcoin_buy_price}")

方案二:用浏览器渲染工具执行JS

如果找不到合适的接口,或者接口有反爬限制,可以用Scrapy结合Playwright/Selenium来模拟浏览器加载页面、执行JS:
这里以Playwright为例(比Selenium更轻量):

  1. 先安装依赖:pip install scrapy-playwright
  2. 在Scrapy项目的settings.py里添加配置:
DOWNLOAD_HANDLERS = {
    "http": "scrapy_playwright.handler.ScrapyPlaywrightDownloadHandler",
    "https": "scrapy_playwright.handler.ScrapyPlaywrightDownloadHandler",
}
PLAYWRIGHT_LAUNCH_OPTIONS = {"headless": True}  # 无头模式,不显示浏览器窗口
  1. 修改爬虫代码,让请求使用Playwright渲染:
def start_requests(self):
    yield scrapy.Request(
        url='https://coins.ph',
        meta={"playwright": True, "playwright_kwargs": {"wait_until": "networkidle"}},
        callback=self.parse
    )

def parse(self, response):
    # 现在就能拿到JS渲染后的真实价格了
    buy_price = response.xpath('//*[@id="bitcoin-buy-price"]/text()').get()
    print(f"比特币买入价:{buy_price}")

额外提示:如果用Playwright还是拿不到,可能需要等待元素加载完成,可以在playwright_kwargs里添加等待条件,比如等待元素文本不等于0。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 09:26:05