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

如何仅用Scrapy提取Ajax渲染的Santander价格?无JS渲染工具经验

问题原因

你用Scrapy拿不到.precioSantander的价格,是因为这个元素是JavaScript动态渲染出来的。Scrapy默认只会抓取服务器返回的初始HTML源码,而这部分价格数据是页面加载后通过JS动态插入的,初始源码里根本没有这个元素的内容,自然提取不到。

解决方案

针对你的情况,给两种易上手的解决办法,不需要太多JS渲染工具的经验:

方法1:直接爬取数据接口(推荐,效率更高)

很多电商网站的商品数据都是通过API接口返回的,你可以直接抓这个接口,不用渲染整个页面:

  1. 打开浏览器(Chrome/Firefox),按F12打开开发者工具;
  2. 切换到「Network」标签,过滤条件选「XHR」或「Fetch」;
  3. 刷新页面,找返回商品列表的请求(通常URL里会有product、list这类关键词);
  4. 查看该请求的「Response」,如果里面包含Santander价格字段,直接用Scrapy请求这个API接口,解析JSON数据即可。

比如假设找到的接口是https://stienda.uy/api/product/list?category=tv,你的Spider可以改成:

import scrapy
from scrapy.crawler import CrawlerProcess
from datetime import datetime

date = datetime.now().strftime("%d_%m_%Y")

class stiendaSpider(scrapy.Spider):
    name = 'stienda'
    start_urls = ['https://stienda.uy/api/product/list?category=tv']  # 替换成实际接口URL

    def parse(self, response):
        data = response.json()
        for product in data['products']:  # 根据接口返回的结构调整
            yield {
                'name': product['name'],
                'price': product['santander_price']  # 替换成接口里对应的价格字段
            }

if __name__ == "__main__":
    process = CrawlerProcess(settings={
        "FEEDS": {
            f'santander_prices_{date}.json': {'format': 'json', 'overwrite': True},
        },
    })
    process.crawl(stiendaSpider)
    process.start()

方法2:用Scrapy集成Playwright(零经验也能快速上手)

如果找不到接口,就用Scrapy官方支持的Playwright中间件,自动帮你渲染JS页面:

步骤1:安装依赖

pip install scrapy-playwright

步骤2:修改你的Spider代码(直接用下面的完整代码替换原来的)

import scrapy
from scrapy.crawler import CrawlerProcess
from datetime import datetime

date = datetime.now().strftime("%d_%m_%Y")

class stiendaSpider(scrapy.Spider):
    name = 'stienda'
    start_urls = ['https://stienda.uy/tv']

    def start_requests(self):
        # 给每个请求加上playwright渲染的标记
        for url in self.start_urls:
            yield scrapy.Request(url, meta={"playwright": True})

    def parse(self, response):
        for products in response.xpath('//div[@data-disp="1"]'):
            name = products.css('.tit::text').get()
            price = products.css('.precioSantander::text').get()
            if name:
                yield {
                    'name': name.strip(),
                    'price': price.strip() if price else '未找到Santander价格'
                }

if __name__ == "__main__":
    process = CrawlerProcess(settings={
        # 配置Playwright下载处理器
        "DOWNLOAD_HANDLERS": {
            "http": "scrapy_playwright.handler.ScrapyPlaywrightDownloadHandler",
            "https": "scrapy_playwright.handler.ScrapyPlaywrightDownloadHandler",
        },
        # 启用Playwright中间件
        "DOWNLOADER_MIDDLEWARES": {
            "scrapy.downloadermiddlewares.useragent.UserAgentMiddleware": None,
            "scrapy_playwright.middleware.PlaywrightMiddleware": 543,
        },
        # Playwright浏览器配置
        "PLAYWRIGHT_LAUNCH_OPTIONS": {
            "headless": True,  # 不想看浏览器窗口就设为True,调试时设为False
            "timeout": 30000,
        },
        # 结果保存为JSON文件
        "FEEDS": {
            f'santander_prices_{date}.json': {'format': 'json', 'overwrite': True},
        },
    })
    process.crawl(stiendaSpider)
    process.start()

注意事项

  • 第一次运行时,Playwright会自动下载Chromium浏览器,不用手动安装;
  • 如果页面加载慢,可以在start_requests的meta里加等待条件:meta={"playwright": True, "playwright_kwargs": {"wait_until": "networkidle"}};
  • 调试时把headless设为False,可以看到浏览器的加载过程,方便排查问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 12:45:37