diff --git a/view/crawler/index.html b/view/crawler/index.html
index 1bc001d..0ba890d 100644
--- a/view/crawler/index.html
+++ b/view/crawler/index.html
@@ -546,14 +546,41 @@
document.getElementById('result-table').style.display = 'block';
}
- // 自动抓取全部职位代码并获取详情
- function fetchAllPositions() {
+ // 追加成功行
+ function appendResultRow(item) {
+ const tbody = document.getElementById('data-table-body');
+ const tr = document.createElement('tr');
+ tr.innerHTML = `
+
${item.sbmc || ''} |
+ ${item.dsmc || ''} |
+ ${item.zpdwmc || ''} |
+ ${item.zwmc || ''} |
+ ${item.zwdm || ''} |
+ ${item.zprs || 0} |
+ ${item.bkrs || 0} |
+ ${item.competition_ratio || '0.00'} |
+ `;
+ tbody.appendChild(tr);
+ document.getElementById('result-table').style.display = 'block';
+ }
+
+ // 追加失败行
+ function appendErrorRow(code, msg) {
+ const tbody = document.getElementById('data-table-body');
+ const tr = document.createElement('tr');
+ tr.innerHTML = `职位代码 ${code}: ${msg} | `;
+ tbody.appendChild(tr);
+ document.getElementById('result-table').style.display = 'block';
+ }
+
+ // 自动抓取全部职位代码并逐条获取详情(流式展示,避免超时)
+ async function fetchAllPositions() {
const dsdm = document.getElementById('dsdm').value;
const examid = document.getElementById('examid').value.trim();
const bmid = document.getElementById('bmid').value.trim();
const userid = document.getElementById('userid').value.trim();
const cookieData = buildCookiesPayload('result-message');
- const aa = lastAa || Date.now().toString();
+ const aa = lastAa;
if (!dsdm) {
showMessage('dsdm-message', '请先选择地区', 'error');
@@ -563,36 +590,57 @@
showMessage('dsdm-message', '请先填写examid、bmid和userid', 'error');
return;
}
- if (!lastAa) {
- showMessage('dsdm-message', '请先获取地区选项', 'error');
+ if (!aa) {
+ showMessage('result-message', '请先点击“获取地区选项”生成aa', 'error');
return;
}
if (!cookieData) {
return;
}
- showMessage('result-message', '正在自动抓取全部职位,请稍候...', 'info');
+ // 清空旧数据
+ lastResults = [];
+ const tbody = document.getElementById('data-table-body');
+ tbody.innerHTML = '';
+ document.getElementById('result-table').style.display = 'block';
+ showMessage('result-message', '正在获取职位代码列表...', 'info');
- fetch('/crawler/fetchAllPositions', {
+ // 获取全部职位代码
+ const listResp = await fetch('/crawler/getZwdmList', {
method: 'POST',
- headers: {
- 'Content-Type': 'application/x-www-form-urlencoded',
- },
+ headers: { 'Content-Type': 'application/x-www-form-urlencoded' },
body: `dsdm=${encodeURIComponent(dsdm)}&examid=${encodeURIComponent(examid)}&bmid=${encodeURIComponent(bmid)}&userid=${encodeURIComponent(userid)}&aa=${encodeURIComponent(aa)}&cookies=${encodeURIComponent(JSON.stringify(cookieData))}`
- })
- .then(response => response.json())
- .then(data => {
- if (data.code === 1) {
- lastResults = data.data;
- displayResults(data.data);
- showMessage('result-message', `成功获取 ${data.data.length} 条职位信息`, 'success');
+ }).then(r => r.json()).catch(e => ({ code: 0, msg: e.message }));
+
+ if (listResp.code !== 1 || !Array.isArray(listResp.data) || listResp.data.length === 0) {
+ showMessage('result-message', listResp.msg || '未获取到职位代码', 'error');
+ return;
+ }
+
+ const codes = listResp.data.map(it => it.zwdm);
+ showMessage('result-message', `共 ${codes.length} 个职位,开始逐条获取...`, 'info');
+
+ // 逐条获取职位详情
+ for (let i = 0; i < codes.length; i++) {
+ const code = codes[i];
+ const infoResp = await fetch('/crawler/getPositionInfo', {
+ method: 'POST',
+ headers: { 'Content-Type': 'application/x-www-form-urlencoded' },
+ body: `zwdm=${encodeURIComponent(code)}&examid=${encodeURIComponent(examid)}&cookies=${encodeURIComponent(JSON.stringify(cookieData))}`
+ }).then(r => r.json()).catch(e => ({ code: 0, msg: e.message }));
+
+ if (infoResp.code === 1 && infoResp.data) {
+ const item = infoResp.data;
+ lastResults.push(item);
+ appendResultRow(item);
} else {
- showMessage('result-message', data.msg || '获取失败', 'error');
+ appendErrorRow(code, infoResp.msg || '获取失败');
}
- })
- .catch(error => {
- showMessage('result-message', '请求失败: ' + error.message, 'error');
- });
+
+ showMessage('result-message', `进度:${i + 1}/${codes.length}`, 'info');
+ }
+
+ showMessage('result-message', `完成,共 ${lastResults.length} 条成功,失败 ${codes.length - lastResults.length} 条`, 'success');
}
// 导出CSV