获取无API文档网站的POST参数及Node.js选择器问题求助
解决无API文档网站的数据爬取问题
一、获取POST请求的精确参数
利用Selenium的Chrome DevTools Protocol(CDP)监听网络请求,直接捕获目标POST请求的参数:
- 初始化浏览器驱动时启用DevTools,建立CDP连接
- 开启Network监控,监听
Network.requestWillBeSent事件 - 过滤目标POST请求,提取请求体中的参数
代码示例:
const { Builder, Browser } = require('selenium-webdriver'); const { devtools } = require('selenium-webdriver/chrome'); async function capturePostParams() { const driver = await new Builder() .forBrowser(Browser.CHROME) .setChromeOptions(devtools()) .build(); const cdp = await driver.createCDPConnection('page'); await cdp.send('Network.enable'); cdp.on('Network.requestWillBeSent', (params) => { // 替换成目标接口的URL特征 if (params.request.method === 'POST' && params.request.url.includes('target-api-path')) { console.log('原始POST参数:', params.request.postData); // 解析JSON格式参数 if (params.request.postData) { try { const parsedParams = JSON.parse(params.request.postData); console.log('结构化POST参数:', parsedParams); } catch (e) { // 处理表单编码的参数 const formParams = new URLSearchParams(params.request.postData); console.log('表单参数:', Object.fromEntries(formParams)); } } } }); // 执行登录与页面导航 await driver.get('login-page-url'); // ... 你的登录逻辑代码 await driver.get('target-page-url'); // ... 触发POST请求的操作 // 等待请求完成后关闭浏览器 await new Promise(resolve => setTimeout(resolve, 5000)); await driver.quit(); } capturePostParams();
二、迁移浏览器控制台爬取代码到Node.js
通过Selenium的executeScript方法,在浏览器上下文执行原控制台代码,再将结果带回Node.js处理:
- 将原控制台的爬取逻辑封装为函数,确保返回结构化数据数组
- 用
driver.executeScript()执行该函数,获取爬取结果 - 在Node.js中转换数据为CSV并保存
代码示例:
const { Builder, Browser } = require('selenium-webdriver'); const fs = require('fs'); async function scrapeAndSaveCSV() { const driver = await new Builder().forBrowser(Browser.CHROME).build(); // 执行登录与导航到目标页面 await driver.get('login-page-url'); // ... 你的登录逻辑代码 await driver.get('target-page-url'); // 等待页面完全加载 await driver.wait(async () => { return await driver.executeScript('return document.readyState === "complete"'); }, 10000); // 执行原控制台的爬取代码(直接粘贴并调整为返回数据) const scrapedData = await driver.executeScript(() => { const rows = document.querySelectorAll('.target-table tr'); const result = []; // 提取表头(如果需要) const headers = Array.from(document.querySelectorAll('.target-table th')).map(th => th.textContent.trim()); result.push(headers); // 提取行数据 rows.forEach(row => { const cols = Array.from(row.querySelectorAll('td')).map(td => td.textContent.trim()); cols.length && result.push(cols); }); return result; }); // 转换为CSV格式(处理逗号转义) const csvContent = scrapedData .map(row => row.map(cell => `"${cell.replace(/"/g, '""')}"`).join(',')) .join('\n'); // 保存到本地文件 fs.writeFileSync('scraped-data.csv', csvContent); await driver.quit(); } scrapeAndSaveCSV();
内容的提问来源于stack exchange,提问作者D H
相关产品推荐
相关产品推荐

