fix(中电建): 跨天首次运行回溯 3 天, 补抓前一天后半天发布的公告

bug 复现: state 文件按日期存放, 跨天首次运行 sinceDate=今天,
漏掉前一天 8:00 CST 之后才发布的公告 (用户实例: 2409490555 中电建水电十四局橡胶电缆, 7/21 22:45 发布).

修复: 新增 BACKFILL_DAYS=3 配置, state 为空时 sinceDate = today - 3 天,
新增'跨天补抓'日志分支.

验证: 删 state 后重跑拉到 80 条 / 28 条招采公告, 全部下载成功.
本地 + 生产 scp 同步部署, 4 个关键词全流程测试通过.
This commit is contained in:
Sisyphus 2026-07-22 11:41:49 +08:00
parent 072696321e
commit fc4a4e81d4

View File

@ -36,6 +36,8 @@ const TYPES = ['招采公告'];
// 可选:留空则从上次抓取日期继续;有值则从指定日期开始 // 可选:留空则从上次抓取日期继续;有值则从指定日期开始
const START_DATE = ''; const START_DATE = '';
const END_DATE = new Date().toISOString().split('T')[0]; // 今天 const END_DATE = new Date().toISOString().split('T')[0]; // 今天
// 跨天首次运行(state 为空)时回溯 N 天, 避免错过前一天后半天发布的公告
const BACKFILL_DAYS = 3;
const OUTPUT_DIR = path.join(process.env.HOME, 'desktop/招标公告', END_DATE); const OUTPUT_DIR = path.join(process.env.HOME, 'desktop/招标公告', END_DATE);
const PDF_DIR = path.join(OUTPUT_DIR, 'pdf'); // PDF 附件 const PDF_DIR = path.join(OUTPUT_DIR, 'pdf'); // PDF 附件
const HTML_DIR = path.join(OUTPUT_DIR, 'html'); // HTML 转换(待安装转换技能) const HTML_DIR = path.join(OUTPUT_DIR, 'html'); // HTML 转换(待安装转换技能)
@ -346,12 +348,17 @@ async function main() {
log(`========== 开始抓取: ${KEYWORD} ==========`); log(`========== 开始抓取: ${KEYWORD} ==========`);
// 确定起始日期(差量:上次运行日期 或 配置的 START_DATE) // 确定起始日期(差量:上次运行日期 或 配置的 START_DATE;跨天首次运行回溯 N 天)
const sinceDate = START_DATE || (state.lastRun ? state.lastRun.split('T')[0] : null) || END_DATE; const sinceDate = START_DATE || (state.lastRun ? state.lastRun.split('T')[0] : null) || (() => {
const d = new Date(Date.now() - BACKFILL_DAYS * 86400 * 1000);
return d.toISOString().split('T')[0];
})();
if (START_DATE) { if (START_DATE) {
log(`指定日期范围: ${START_DATE} ~ ${END_DATE}`); log(`指定日期范围: ${START_DATE} ~ ${END_DATE}`);
} else if (state.lastRun) { } else if (state.lastRun) {
log(`差量模式: 自 ${state.lastRun.substring(0, 10)} 以来新增`); log(`差量模式: 自 ${state.lastRun.substring(0, 10)} 以来新增`);
} else if (sinceDate !== END_DATE) {
log(`跨天补抓: ${sinceDate} ~ ${END_DATE}`);
} else { } else {
log(`首次运行: ${sinceDate} ~ ${END_DATE}`); log(`首次运行: ${sinceDate} ~ ${END_DATE}`);
} }