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

使用Scrapy爬取广告网站时无法提取price标签文本的问题求助

问题根因

你写的CSS、XPath选择器语法没有错误,拿不到价格的核心原因是:该网站的价格属于动态渲染内容,Scrapy默认请求拿到的静态HTML源码中,你定位的span.ma-AdPrice-value标签内部没有文本值,价格是页面在浏览器加载完成后,由JavaScript脚本动态写入到标签内的,所以直接从静态响应里提取文本自然为空。

另外你原代码中未提前定义items变量就直接赋值,运行时会抛出NameError,建议直接用字典返回或者提前实例化你定义的Item类。

解决方法

方法1:提取meta标签(最简单,仅需价格的话优先用)

页面头部的Open Graph meta标签已经公开标注了商品价格,直接提取该属性即可,一行代码就能搞定:

price = response.xpath("//meta[@property='og:price:amount']/@content").get()

如果需要货币单位,也可以提取og:price:currency属性的内容。

方法2:提取页面预加载JSON(适合需要全量广告数据的场景)

页面静态源码中已经把所有广告相关的完整数据提前存入了全局JS变量window.__INITIAL_PROPS__,直接解析这个JSON就能拿到所有你需要的字段,不需要渲染JS:

import json
import scrapy

class AdSpider(scrapy.Spider):
    name = 'ads'
    start_urls = [
        'https://www.milanuncios.com/volkswagen-de-segunda-mano/volkswagen-golf-2-0-tdi-184cv-dsg-gtd-bmt-409202986.htm'
    ]

    def parse(self, response):
        # 提取包含全量数据的JS片段
        raw_js = response.xpath("//script[contains(text(), 'window.__INITIAL_PROPS__')]/text()").get()
        # 清洗得到纯JSON字符串
        json_str = raw_js.replace('window.__INITIAL_PROPS__ = ', '').strip().rstrip(';')
        ad_data = json.loads(json_str)
        
        yield {
            'title': ad_data['ad']['title'],
            'price': ad_data['ad']['price']['value'],
            # 可以根据需要从ad_data里提取其他任意字段
        }

方法3:对接JS渲染工具(适合大量动态内容提取场景)

如果你需要提取的多个字段都是动态渲染的,可以给Scrapy配置scrapy-playwright插件开启页面JS渲染,渲染完成后你原本写的CSS选择器就可以正常拿到价格文本,不需要修改原有选择器逻辑。
配置完成后只需要给请求添加对应的meta参数即可触发渲染:

yield scrapy.Request(url, meta={"playwright": True}, callback=self.parse)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 13:36:10