// scripts/scrape-alicloud-qwen-tts.js — playwright 拿到阿里云页面渲染后 DOM 文本 const { chromium } = require('playwright'); const fs = require('fs'); const os = require('os'); const path = require('path'); (async () => { const url = process.argv[2] || 'https://help.aliyun.com/zh/model-studio/qwen-tts-voice-list'; const out = process.argv[3] || path.join(os.tmpdir(), 'qwen-tts-dom.txt'); const browser = await chromium.launch({ headless: true }); const page = await browser.newPage({ userAgent: 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36' }); await page.goto(url, { waitUntil: 'domcontentloaded', timeout: 30000 }); // 等动态内容渲染(阿里云页面通常会做几秒的分批加载) for (let i = 0; i < 10; i++) { await page.waitForTimeout(2000); const tables = await page.locator('table').count(); console.log(` attempt ${i + 1}: tables=${tables}`); if (tables > 0) break; } // 渲染后 DOM 文本(去 script/style) const text = await page.evaluate(() => { document.querySelectorAll('script,style,noscript').forEach(e => e.remove()); return document.body.innerText; }); fs.writeFileSync(out, text, 'utf8'); console.log(`dom text: ${text.length} bytes → ${out}`); console.log(`first 500 chars:`); console.log(text.slice(0, 500)); await browser.close(); })().catch(e => { console.error(e); process.exit(1); });