使用XMLHttpRequest爬取数据未得预期结果求助
问题排查与修复方案
1. XMLHttpRequest 代码的核心问题
你的第一段代码里重复调用了两次XMLReq.send():
XMLReq.send(JSON.stringify({...})) // 第一次发送带参数的请求 // ... XMLReq.send(); // 第二次无参数重复发送
这会导致请求被重复触发,且第二次请求没有携带必要的请求体,服务器无法正确处理,直接删掉第二次的XMLReq.send()即可。
2. Fetch 代码的关键错误
你的fetch配置里设置了mode: "no-cors",这会让浏览器返回不透明响应(Opaque Response),这种响应无法读取内容、也不能调用response.json()解析数据,这是你截图里报错的直接原因。
修复后的Fetch代码
去掉mode: "no-cors",同时确保请求体和目标ticker一致(你要获取的是ETIT.tg,之前代码里写的是BRVMAG):
const options = { method: 'POST', headers: { "accept": "*/*", "accept-language": "fr-FR,fr;q=0.9,en-US;q=0.8,en;q=0.7", "content-type": "application/json;charset=UTF-8", "sec-ch-ua": "\"Chromium\";v=\"104\", \" Not A;Brand\";v=\"99\", \"Google Chrome\";v=\"104\"", "sec-ch-ua-mobile": "?1", "sec-ch-ua-platform": "\"Android\"", "sec-fetch-dest": "empty", "sec-fetch-mode": "cors", "sec-fetch-site": "same-origin" }, referrer: "https://www.sikafinance.com/marches/historiques?s=ETIT.tg", referrerPolicy: "strict-origin-when-cross-origin", body: JSON.stringify({ ticker: "ETIT.tg", datedeb: "2022-07-20", datefin: "2022-08-17", xperiod: "0" }), credentials: "include" }; fetch('https://www.sikafinance.com/api/general/GetHistos', options) .then(response => { if (!response.ok) throw new Error(`HTTP error! status: ${response.status}`); return response.json(); }) .then(data => { // 这里处理返回的数据,生成HTML表格 generateTable(data); }) .catch(err => console.error(err));
3. 生成HTML表格的示例函数
拿到数据后,可以用下面的函数把返回的历史数据转换成表格:
function generateTable(data) { // 假设数据是数组格式,每个元素包含日期、开盘价、收盘价等字段 const table = document.createElement('table'); table.border = "1"; // 创建表头 const headerRow = document.createElement('tr'); const headers = Object.keys(data[0]); headers.forEach(headerText => { const th = document.createElement('th'); th.textContent = headerText; headerRow.appendChild(th); }); table.appendChild(headerRow); // 创建表格内容 data.forEach(item => { const row = document.createElement('tr'); headers.forEach(header => { const td = document.createElement('td'); td.textContent = item[header]; row.appendChild(td); }); table.appendChild(row); }); // 把表格添加到页面 document.body.appendChild(table); }
额外注意事项
- 确保你的代码是在同域名环境下运行(比如在sikafinance的页面控制台里执行),否则会触发CORS限制;如果是本地页面调用,需要服务器配置CORS允许跨域请求,或者使用代理。
- 部分网站会校验CSRF Token,如果你请求失败,可以检查浏览器开发者工具里的请求头,看是否有
X-CSRF-Token之类的字段,需要添加到请求头中。
内容的提问来源于stack exchange,提问作者Koffi Frederic Sessie
相关产品推荐
相关产品推荐

