使用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
相关产品推荐
相关产品推荐

