# 日跑问题记录 2026-09-11

## 总览

- 记录时间: 2026-09-11 15:xx (人工排查 + 修复会话)
- 状态分布: 成功 1912 / 脚本异常 52 / 超时 12 / 站点不可达 6 / 失败 1 = 1983
- 今日入库 (inserted_at): 17499 条
- 本次会话已修复: **T1 14 个持续失败脚本 + T2 全库 90 个脚本的未定义名缺陷**（详见下节）

## 一、本次修复：持续失败核心（14 个脚本，均已实跑验证）

判定依据: 抽取近 14 天 run_logs，按「失败天数」排序；**天天失败 6 个 / ≥10 天 12 个**。
全部用 faulthandler 打栈 + 按 config 真实 args 串行重跑取证，逐条根因见下（error_detail 被调度器截断头部，不可直接读）。

| # | 脚本 | 失败天数 | 根因（实测） | 修法 | 验证前 → 后 |
|---|---|---|---|---|---|
| 1 | crawl_cznq.py | 12 | NameError full_url(L116)+md_rows(L118) 批量模板串名 | 改用 url / content_parts | rc=1 → rc=0 / 8.1s |
| 2 | crawl_gddrc_jnjc.py | 14 | Playwright 50s×2 重试 + 每条 sleep 1.5-4s | 30s×1 + 预去重 | 超时 → 65.0s |
| 3 | crawl_guazhou.py | 14 | --pages 1 被忽略 → 每天全量 | 接入 _MAX_PAGES_ARG | 30.3s → 5.5s |
| 4 | crawl_jinjiang.py | 14 | --pages 1 被 L139 静默覆盖 → 21 页 | min(total_pages,arg) + 预去重 | 超时 → 2.5s |
| 5 | crawl_liyang_xxgk.py | 12 | 嵌套<a> + decompose() 使 attrs=None 崩溃 | 改为先收集后删除 | rc=1 → rc=0 / 243.1s |
| 6 | crawl_jinjiang_sthj.py | 13 | 同上 | 同上 | 超时 → 1.6s |
| 7 | crawl_rushan_gggs.py | 11 | sys.exit(main()) 返回条数=76 被记失败 | sys.exit(0) | rc=76 → rc=0 / 5.2s |
| 8 | crawl_shuicheng.py | 12 | MAX_PAGES=40 写死且每条详情前 sleep | 支持 --pages + 预去重 + sleep 后移 | 150s超时 → 3.0s |
| 9 | crawl_tianzhu.py | 10 | sqlite3.connect 无 timeout → 并发写锁 | timeout=60 + busy_timeout | rc=0 / 24.8s |
| 10 | crawl_lcx.py | 11 | 1 页 301 条详情每天全量重抓 | URL 预去重跳详情 | 超时 → 30.2s |
| 11 | crawl_npq.py | 10 | gov_search 表无 publish_date 列 → FTS 全失败 | 去掉该列 | rc=0 但FTS失败 → rc=0 |
| 12 | crawl_chuzhou_scp.py | 10 | 每条新开连接+无timeout → 锁 | 单连接 + URL 预去重 | 18.2s → 0.5s |
| 13 | crawl_rongzhou.py | 10 | busy_timeout=5000 过短 | 提到 60000 | rc=0 / 3.2s |
| 25 | crawl_ahlx.py | — | ★--pages注入使代码顶格到模块级：不传参静默空跑0条、传参 NameError | 缩进归位 + AUTO块移到import后 + 预去重 + rowcount | 静默空跑 → rc=0 / 117.6s |

## 二、T2：全库未定义名缺陷（静默数据质量缺陷）

- 自写作作用域感知检测器扫 **2469 个脚本**：原 **89 文件 / 151 处**未定义名
- 分类处置：**A 类补 import 58 文件**（`urllib` 93 处:47 文件 `from urllib.parse import urljoin` 只绑定 urljoin 却调 `urllib.parse.*` → NameError 被 try/except 吞掉 → **表格静默丢失**；`json` 10、`os` 1）
- **B 类改错变量名 29 文件 / 38 处**（批量模板孤儿名: `md_rows/md/cols/rows → content_parts/parts/out/paragraphs`；`page_url/full_url/full/href → url 或 BASE_URL`；f-string 裸下标 `a[name]`→`a['name']`；`soup`/`rows`/`attempt`/`title` 缺定义）
- 附 `crawl_zqeia.py`(config enabled) + 3 个工具脚本补 import
- **结果：未定义名 89 → 7 文件**，且剩余 7 个均为**未被 config 引用的遗留/损坏脚本**（其中 `search_app.py` 的 `kws` 是推导式变量=误报）

## 三、今日偶发失败（仅记录，不修）

判定: 14 天窗口内只失败 1–2 天 = 偶发（并发写锁 / 网络抖动），手动跑即好。

| # | 脚本 | 配置名 | 状态 | 错误摘要(截断) |
|---|---|---|---|---|
| 2 | crawl_changwu.py | 长武县-重大建设项目 | 站点不可达 | Latest DB date: 2026-09-08 Existing URLs: 306   Page 1: 20 items   Pag |
| 3 | crawl_gxq_yl_tzgg.py | 榆林高新技术产业开发区-通知公告 | 站点不可达 | [08:09:27] 榆林高新技术产业开发区-通知公告   [ERROR] fetch list page 0: HTTPSConnecti |
| 4 | crawl_juye.py | 巨野县人民政府-法定主动公开内容 | 站点不可达 | Page 1/5...   [ERR] detail 2096864382515605504: HTTPConnectionPool(hos |
| 5 | crawl_soochowchem.py | 宁夏东吴农化-新闻公示 | 站点不可达 | [宁夏东吴农化-新闻公示] Starting crawl... Found 46 items on list page   [1/46] 宁 |
| 6 | crawl_wenshang_gggs.py | 汶上县-公告公示 | 站点不可达 | [*] 已有 133 条, 断点续传 [!] goto exc: TimeoutError [X] 列表未渲染 |
| 7 | crawl_xjkc.py | 库车市-生态环境 | 站点不可达 | Traceback (most recent call last):   File "/root/gov_crawler/crawl_xjk |
| 8 | crawl_bp.py | 北票市政府信息公开 | 脚本异常 | /usr/local/lib/python3.12/dist-packages/urllib3/connectionpool.py:1110 |
| 9 | crawl_btnsss_10161.py | 第十三师新星市-公示公告 | 脚本异常 | Page 1: 15 items   Page 2: 15 items   Page 3: 15 items   Total: 14 ite |
| 10 | crawl_bypc_gggs.py | 白银市平川区-公告公示 | 脚本异常 | Page 1: 20 items (total 624)   Total: 20 items  Traceback (most recent |
| 11 | crawl_cangzhou_sthj.py | 沧州市-生态环境 | 脚本异常 | Page 1: 20 items   Total: 20 items  Traceback (most recent call last): |
| 12 | crawl_changshu_gsgg.py | 常熟市-公示公告 | 脚本异常 | Site: 常熟市-公示   Page 1: 15 items   Page 2: 2 items   Page 3: 2 items    |
| 13 | crawl_chinadhe.py | 东华能源-公司要闻 | 脚本异常 | === 东华能源-公司要闻 === Cutoff: 2023-09-12 Items in 3yr range: 57  Traceback |
| 15 | crawl_cqnc.py | 重庆市南川区人民政府-公示公告 | 脚本异常 | Crawler: 重庆市南川区人民政府-公示公告 Mode: FULL Cutoff: 2023-09-12  Pages: 4   ind |
| 17 | crawl_datang_gkml.py | 佛山市三水大塘镇-其他-其他 | 脚本异常 | [佛山市三水大塘镇-其他] max pages: 1 Traceback (most recent call last):   File " |
| 18 | crawl_daying.py | 大英县人民政府-生态环境 | 脚本异常 | --- 第1页 --- 找到20条   [2026-09-10] 大英县人力资源和社会保障局关于2026年增量政策性岗位调剂人员的公告    |
| 19 | crawl_fengyang_hpgs_161055560.py | 凤阳县-环评公示 | 脚本异常 | Page 1: 20 items   Total: 20 items  Traceback (most recent call last): |
| 20 | crawl_fjsg_hjxp.py | 福建三钢-环评公示 | 脚本异常 | 爬取: 福建三钢-环评公示   第1页: 9 条   第2页: 9 条   第3页: 9 条   第4页: 9 条   第5页: 9 条   |
| 21 | crawl_guanghan.py | 广汉市-通知公告 | 脚本异常 | --- 第1页 --- 找到15条 [2026-09-10] 广汉市综合行政执法局 违法建设信息公告 [2026-09-10] 小汉镇：传达 |
| 22 | crawl_guiping_tzgg.py | 桂平市人民政府-通知公告 | 脚本异常 | 爬取: 桂平市人民政府-通知公告   第1页: 30 条   第2页: 30 条   共 60 条列表项   [1/60] 广西贵港市桂平市 |
| 23 | crawl_guiyang.py | 贵阳市-项目环评审批 | 脚本异常 | Traceback (most recent call last):   File "/root/gov_crawler/crawl_gui |
| 24 | crawl_gz_hpspgg.py | 广州市-环评审批公告 | 脚本异常 | Traceback (most recent call last):   File "/root/gov_crawler/crawl_gz_ |
| 25 | crawl_gztesting.py | 江苏国正检测-新闻动态 | 脚本异常 | ================================================== 🏠 江苏国正检测-新闻动态 ===== |
| 26 | crawl_hlanda.py | 安达市环境保护（环评审批） | 脚本异常 | Total: 131 articles, 9 pages Crawling 5 pages  Traceback (most recent  |
| 27 | crawl_hlgls.py | 霍林郭勒市-通知公告 | 脚本异常 | [AutoPg] max_pages=1 [霍林郭勒] mode=1, cut_date=2023-09-12 [霍林郭勒] P1: 15条 |
| 28 | crawl_jxyf.py | 宜兴市-环评信息 | 脚本异常 | [info] 日期过滤: >= 2023-09-12 [error] API第1页请求失败: Expecting value: line 1 |
| 29 | crawl_kulun.py | 库伦旗-生态环境 | 脚本异常 | Page 1/1...   Got 10 items  Traceback (most recent call last):   File  |
| 30 | crawl_lanxi_tzgg.py | 兰溪市-通知公告 | 脚本异常 | --- 第1页 --- 找到15条   [2026-09-10] [市人力资源和社会保障局]兰溪市重点群体社保补贴发放名单公示（202609 |
| 31 | crawl_linxixian.py | 林西县-公告公示 | 脚本异常 | [INFO] Page 1: 15 items [INFO] Total pages: 34 [INFO] Limited to 1 pag |
| 32 | crawl_lixin_hp.py | 利辛县生态环境分局-环评审批-环评审批 | 脚本异常 | [利辛县生态环境分局-环评审批] max pages: 1 Traceback (most recent call last):   Fil |
| 34 | crawl_longtan_zcfg.py | 龙潭区人民政府-政策法规 | 脚本异常 | Traceback (most recent call last):   File "/root/gov_crawler/crawl_lon |
| 35 | crawl_lufeng.py | 陆丰市人民政府-建设项目环境影响评价 | 脚本异常 | [清理] 已清理旧数据 [分页] 第1页: https://www.lufengshi.gov.cn/swlufeng/zdly/hjbhx |
| 36 | crawl_lufeng_tzgg.py | 陆丰市人民政府-通知公告 | 脚本异常 | Traceback (most recent call last):   File "/root/gov_crawler/crawl_luf |
| 37 | crawl_lyg.py | 连云港市人民政府-公示通告 | 脚本异常 | [列表页] http://www.lyg.gov.cn/zglygzfmhwz/gsgg/gsgg.html   找到 39 条  Trac |
| 39 | crawl_qidong.py | 启东市人民政府-部门公告公示 | 脚本异常 | [AutoPg] max_pages=1 [qidong] Total: 3300 records (110 groups of 30) [ |
| 40 | crawl_qqhrlsq.py | 齐齐哈尔市龙沙区-环境保护 | 脚本异常 | [AutoPg] max_pages=1 [qqhrlsq] Fetching API page 1... [qqhrlsq] Total: |
| 41 | crawl_quanjiao_tzgg.py | 全椒县人民政府-通知公告 | 脚本异常 | === 全椒县人民政府-通知公告 爬虫 (仅首页) === 首页: 20 条 (API翻页被封，仅首页)  Traceback (most  |
| 42 | crawl_qyq_tzgg.py | 青原区公示公告 | 脚本异常 | [AutoPg] max_pages=1 === 青原区公示公告 ===  Traceback (most recent call last |
| 44 | crawl_sinan_hjbh.py | 思南-环境保护 | 脚本异常 | ================================================== 🚀 思南-环境保护 ========= |
| 45 | crawl_sinodmc_xxgk.py | 石大胜华新材料集团-信息公开 | 脚本异常 | Scraping 石大胜华新材料集团-信息公开, max pages: 29 Traceback (most recent call las |
| 46 | crawl_suixi_sthj.py | 遂溪县-生态环境局-政务公开 | 脚本异常 | [AutoPg] max_pages=3 === 遂溪县-生态环境局遂溪分局-政务公开 ===   Fetching page 1: htt |
| 47 | crawl_sxzhcc.py | 陕西中汇煤化-公司要闻 | 脚本异常 | [陕西中汇煤化-公司要闻] max pages: 1 Traceback (most recent call last):   File " |
| 48 | crawl_taian.py | 台安县-生态环境信息 | 脚本异常 | [分页] 第1页: http://www.lntaian.gov.cn/taxzf/zdlyxxgk/zdmshshgysyjs/sthjx |
| 49 | crawl_tianchang_xzsp.py | 天长市-生态环境行政审批 | 脚本异常 | 列表页: https://www.tianchang.gov.cn/public/column/161056932?type=4&catId |
| 51 | crawl_tongzhou.py | 南通市通州区人民政府-公告公示 | 脚本异常 | [LIST] 重要公示 (zygs)... 19 items [LIST] 两会公告 (lhgg)... 30 items [LIST] 招 |
| 52 | crawl_wudang.py | 乌当区-通知公告 | 脚本异常 | Traceback (most recent call last):   File "/root/gov_crawler/crawl_wud |
| 53 | crawl_wuhu_hb.py | 芜湖市生态环境局-公示征集 | 脚本异常 | [Page 1] https://sthjj.wuhu.gov.cn/hbzx/gszq/index.html   Found 20 ite |
| 54 | crawl_xiushui_ctgg.py | 修水县-城投集团通知公告 | 脚本异常 | 年份: [2026, 2025, 2024, 2023] (截止 2023-06-16)   2026: 436 items from xm |
| 55 | crawl_xunwu_tzgg.py | 寻乌县-公示公告 | 脚本异常 | Page 1/5: 12 items   Page 2/5: 12 items   Page 3/5: 12 items   Page 4/ |
| 56 | crawl_yangzhou_kfq.py | 扬州经开区-通知公告 | 脚本异常 | [AutoPg] max_pages=1  ================================================ |
| 57 | crawl_yyx.py | 炎陵县-建设项目环境影响评价 | 脚本异常 | 总页数: 35   第1页...  Traceback (most recent call last):   File "/root/gov |
| 58 | crawl_zhanyi_xzzf.py | 沾益区-行政执法信息公示 | 脚本异常 | [INFO] 沾益区-行政执法信息公示 - 爬虫, pages=2    [Page 1] https://www.zhanyi.gov.c |
| 59 | crawl_zjg_tzgg.py | 张家港市-通知公告 | 脚本异常 | [PAGE 1] https://www.zjg.gov.cn/zjg/tzgg/common_list.shtml   [LIST] 本页 |
| 62 | crawl_hnccci.py | 淮南煤化工产业园-通知公告 | 超时 | [TIMEOUT] |
| 63 | crawl_jiangyin_xzzl_tzgg.py | 江阴市-乡镇通知公告 | 超时 | [TIMEOUT] |
| 66 | crawl_jishan_tzgg.py | 稷山县-通知公告 | 超时 | [TIMEOUT] |
| 68 | crawl_longyao_gsgg.py | 隆尧县-公告公示 | 超时 | [TIMEOUT] |
| 69 | crawl_ningjin.py | 宁晋县-乡镇动态 | 超时 | [TIMEOUT] |
| 70 | crawl_sdharmony_hpgs.py | 山东海美侬-环评公示 | 超时 | [TIMEOUT] |

## 四、失败脚本列表（纯列表，供次日 diff 对比）

共 **71** 个（与当日 `run_logs` 中 `status != '成功'` 的 distinct 脚本一致）。

| # | 脚本 |
|---|---|
| 1 | crawl_bp.py |
| 2 | crawl_btnsss_10161.py |
| 3 | crawl_bypc_gggs.py |
| 4 | crawl_cangzhou_sthj.py |
| 5 | crawl_changshu_gsgg.py |
| 6 | crawl_changwu.py |
| 7 | crawl_chinadhe.py |
| 8 | crawl_chuzhou_scp.py |
| 9 | crawl_cqnc.py |
| 10 | crawl_cznq.py |
| 11 | crawl_datang_gkml.py |
| 12 | crawl_daying.py |
| 13 | crawl_fengyang_hpgs_161055560.py |
| 14 | crawl_fjsg_hjxp.py |
| 15 | crawl_gddrc_jnjc.py |
| 16 | crawl_guanghan.py |
| 17 | crawl_guazhou.py |
| 18 | crawl_guiping_tzgg.py |
| 19 | crawl_guiyang.py |
| 20 | crawl_gxq_yl_tzgg.py |
| 21 | crawl_gz_hpspgg.py |
| 22 | crawl_gztesting.py |
| 23 | crawl_hlanda.py |
| 24 | crawl_hlgls.py |
| 25 | crawl_hnccci.py |
| 26 | crawl_jiangyin_xzzl_tzgg.py |
| 27 | crawl_jinjiang.py |
| 28 | crawl_jinjiang_sthj.py |
| 29 | crawl_jishan_tzgg.py |
| 30 | crawl_juye.py |
| 31 | crawl_jxyf.py |
| 32 | crawl_kulun.py |
| 33 | crawl_lanxi_tzgg.py |
| 34 | crawl_lcx.py |
| 35 | crawl_linxixian.py |
| 36 | crawl_lixin_hp.py |
| 37 | crawl_liyang_xxgk.py |
| 38 | crawl_longtan_zcfg.py |
| 39 | crawl_longyao_gsgg.py |
| 40 | crawl_lufeng.py |
| 41 | crawl_lufeng_tzgg.py |
| 42 | crawl_lyg.py |
| 43 | crawl_ningjin.py |
| 44 | crawl_npq.py |
| 45 | crawl_qidong.py |
| 46 | crawl_qqhrlsq.py |
| 47 | crawl_quanjiao_tzgg.py |
| 48 | crawl_qyq_tzgg.py |
| 49 | crawl_rongzhou.py |
| 50 | crawl_rushan_gggs.py |
| 51 | crawl_sdharmony_hpgs.py |
| 52 | crawl_shuicheng.py |
| 53 | crawl_sinan_hjbh.py |
| 54 | crawl_sinodmc_xxgk.py |
| 55 | crawl_soochowchem.py |
| 56 | crawl_suixi_sthj.py |
| 57 | crawl_sxzhcc.py |
| 58 | crawl_taian.py |
| 59 | crawl_tianchang_xzsp.py |
| 60 | crawl_tianzhu.py |
| 61 | crawl_tongzhou.py |
| 62 | crawl_wenshang_gggs.py |
| 63 | crawl_wudang.py |
| 64 | crawl_wuhu_hb.py |
| 65 | crawl_xiushui_ctgg.py |
| 66 | crawl_xjkc.py |
| 67 | crawl_xunwu_tzgg.py |
| 68 | crawl_yangzhou_kfq.py |
| 69 | crawl_yyx.py |
| 70 | crawl_zhanyi_xzzf.py |
| 71 | crawl_zjg_tzgg.py |

---

## 五、⚠️ 修正分析：`≥10/14天` 阈值漏判了一整个「反复失败带」

本文件第三节用「失败天数 ≥10 天才算持续失败」判定偶发 —— **当天复盘时发现该阈值过严**。
按近 14 天失败天数分档重算（同一份 run_logs）：

| 档 | 失败天数 | 脚本数 | 说明 |
|---|---|---|---|
| A | ≥10 天 | 13 | 原判「持续失败核心」（T1 已修 14 个） |
| B | 6–9 天 | 31 | ❌ 原判「偶发」= 错判，实为反复失败 |
| C | 3–5 天 | 43 | ❌ 原判「偶发」= 错判 |
| D | 1–2 天 | 161 | 真偶发（不修） |

**结论修正**：不是「12 个持续 + 154 个偶发」，而是 **13 个持续 + 74 个反复失败带（B+C）+ 大量真偶发**。
B/C 档的失败日期是**密集连续**的（非抖动），必须逐条查。

### 5.1 T2 静态缺陷确实是日跑失败的直接原因（10 个）

89 个「未定义名」文件里有 **10 个在窗口内失败过**，其中 4 个落在 B 档（≥6 天）：

| 脚本 | 失败天数 | 失败区间 | T2 缺陷 |
|---|---|---|---|
| crawl_lhyc.py | 7/14 | 2026-08-29 ~ 2026-09-10 | 未定义名（表格出现才触发 → 间歇性） |
| crawl_wuhu_hb.py | 7/14 | 2026-09-05 ~ 2026-09-11 | 未定义名（表格出现才触发 → 间歇性） |
| crawl_longtan_zcfg.py | 6/14 | 2026-08-30 ~ 2026-09-11 | 未定义名（表格出现才触发 → 间歇性） |
| crawl_luzhou.py | 6/14 | 2026-08-31 ~ 2026-09-05 | 未定义名（表格出现才触发 → 间歇性） |
| crawl_ganxian_hbgss.py | 5/14 | 2026-09-03 ~ 2026-09-07 | 未定义名（表格出现才触发 → 间歇性） |
| crawl_taian.py | 4/14 | 2026-09-08 ~ 2026-09-11 | 未定义名（表格出现才触发 → 间歇性） |
| crawl_xunwu_tzgg.py | 3/14 | 2026-09-09 ~ 2026-09-11 | 未定义名（表格出现才触发 → 间歇性） |
| crawl_fanchang.py | 1/14 | 2026-09-10 ~ 2026-09-10 | 未定义名（表格出现才触发 → 间歇性） |
| crawl_lijin.py | 1/14 | 2026-08-30 ~ 2026-08-30 | 未定义名（表格出现才触发 → 间歇性） |
| crawl_yjq.py | 1/14 | 2026-09-04 ~ 2026-09-04 | 未定义名（表格出现才触发 → 间歇性） |

→ **先扫静态缺陷、再判「偶发 vs 持续」**；否则会把代码 bug 误判成网络抖动而放过。

### 5.2 仍未处理的 B/C 档脚本（活问题，67 个）

这些既不在 T1 也不在 T2 覆盖范围内，需下一轮逐个取证：

| 脚本 | 失败/运行天数 | 失败区间 |
|---|---|---|
| crawl_guiyang.py | 9/14 | 2026-09-03 ~ 2026-09-11 |
| crawl_gz_hpspgg.py | 9/14 | 2026-09-03 ~ 2026-09-11 |
| crawl_juye.py | 9/14 | 2026-09-01 ~ 2026-09-11 |
| crawl_linxixian.py | 9/14 | 2026-09-03 ~ 2026-09-11 |
| crawl_suixi_sthj.py | 9/14 | 2026-09-03 ~ 2026-09-11 |
| crawl_wudang.py | 9/14 | 2026-09-03 ~ 2026-09-11 |
| crawl_changshu_gsgg.py | 8/14 | 2026-09-02 ~ 2026-09-11 |
| crawl_fjql.py | 8/14 | 2026-08-29 ~ 2026-09-05 |
| crawl_hebi_hjyxpj.py | 8/14 | 2026-08-31 ~ 2026-09-09 |
| crawl_hnccci.py | 8/14 | 2026-08-29 ~ 2026-09-11 |
| crawl_jinxi_gg.py | 8/14 | 2026-08-29 ~ 2026-09-10 |
| crawl_qhd_gggs.py | 8/14 | 2026-08-30 ~ 2026-09-10 |
| crawl_qidong.py | 8/14 | 2026-08-30 ~ 2026-09-11 |
| crawl_qqhrlsq.py | 8/14 | 2026-08-30 ~ 2026-09-11 |
| crawl_cs_gz.py | 7/14 | 2026-08-29 ~ 2026-09-10 |
| crawl_gxq_yl_tzgg.py | 7/14 | 2026-08-29 ~ 2026-09-11 |
| crawl_gztesting.py | 7/14 | 2026-08-29 ~ 2026-09-11 |
| crawl_luanxian_854.py | 7/14 | 2026-08-30 ~ 2026-09-09 |
| crawl_sthjsh.py | 7/14 | 2026-08-30 ~ 2026-09-10 |
| crawl_fjsg_hjxp.py | 6/14 | 2026-09-02 ~ 2026-09-11 |
| crawl_fuzhou.py | 6/14 | 2026-09-01 ~ 2026-09-10 |
| crawl_hlgls.py | 6/14 | 2026-09-01 ~ 2026-09-11 |
| crawl_linzi_qtxk.py | 6/14 | 2026-08-29 ~ 2026-09-10 |
| crawl_qingcheng.py | 6/14 | 2026-08-30 ~ 2026-09-10 |
| crawl_quanjiao_tzgg.py | 6/14 | 2026-08-31 ~ 2026-09-11 |
| crawl_sinodmc_xxgk.py | 6/14 | 2026-09-06 ~ 2026-09-11 |
| crawl_wenshang_gggs.py | 6/14 | 2026-08-30 ~ 2026-09-11 |
| crawl_datang_gkml.py | 5/14 | 2026-08-31 ~ 2026-09-11 |
| crawl_daying.py | 5/14 | 2026-09-02 ~ 2026-09-11 |
| crawl_guiping_tzgg.py | 5/14 | 2026-08-30 ~ 2026-09-11 |
| crawl_jseia.py | 5/14 | 2026-08-29 ~ 2026-09-02 |
| crawl_quanzhou_gggs.py | 5/14 | 2026-08-29 ~ 2026-09-09 |
| crawl_sdharmony_hpgs.py | 5/14 | 2026-09-03 ~ 2026-09-11 |
| crawl_tongzhou.py | 5/14 | 2026-09-02 ~ 2026-09-11 |
| crawl_baixiang_sthjfj.py | 4/14 | 2026-08-29 ~ 2026-09-01 |
| crawl_gdmm.py | 4/14 | 2026-08-29 ~ 2026-09-01 |
| crawl_guanghan.py | 4/14 | 2026-09-03 ~ 2026-09-11 |
| crawl_hbdj.py | 4/14 | 2026-08-29 ~ 2026-09-10 |
| crawl_jxlc_tzgg.py | 4/14 | 2026-08-30 ~ 2026-09-06 |
| crawl_jxth.py | 4/14 | 2026-08-29 ~ 2026-09-06 |
| crawl_lixin_hp.py | 4/14 | 2026-08-31 ~ 2026-09-11 |
| crawl_lufeng.py | 4/14 | 2026-09-01 ~ 2026-09-11 |
| crawl_qtxgov_shbz.py | 4/14 | 2026-09-02 ~ 2026-09-10 |
| crawl_sthj_sh.py | 4/14 | 2026-08-31 ~ 2026-09-10 |
| crawl_sxzhcc.py | 4/14 | 2026-08-31 ~ 2026-09-11 |
| crawl_yangzhou_kfq.py | 4/14 | 2026-08-29 ~ 2026-09-11 |
| crawl_anji.py | 3/14 | 2026-08-29 ~ 2026-09-10 |
| crawl_bp.py | 3/14 | 2026-08-31 ~ 2026-09-11 |
| crawl_changwu.py | 3/14 | 2026-09-05 ~ 2026-09-11 |
| crawl_gzxr.py | 3/14 | 2026-08-30 ~ 2026-09-09 |
| crawl_huidong_zrzyj.py | 3/14 | 2026-09-04 ~ 2026-09-10 |
| crawl_huojia.py | 3/14 | 2026-09-01 ~ 2026-09-05 |
| crawl_jiangyin_gxq_tzgg.py | 3/14 | 2026-09-08 ~ 2026-09-10 |
| crawl_lanling_gsgg.py | 3/14 | 2026-09-07 ~ 2026-09-10 |
| crawl_lczf_tzgg.py | 3/14 | 2026-08-30 ~ 2026-09-06 |
| crawl_lnjp.py | 3/14 | 2026-09-01 ~ 2026-09-06 |
| crawl_luanxian.py | 3/14 | 2026-08-30 ~ 2026-09-07 |
| crawl_mas.py | 3/14 | 2026-09-02 ~ 2026-09-09 |
| crawl_rev_tzgg.py | 3/14 | 2026-09-02 ~ 2026-09-06 |
| crawl_shangyu.py | 3/14 | 2026-09-02 ~ 2026-09-10 |
| crawl_sinan_hjbh.py | 3/14 | 2026-08-29 ~ 2026-09-11 |
| crawl_soochowchem.py | 3/14 | 2026-09-09 ~ 2026-09-11 |
| crawl_sxepb_spgs.py | 3/14 | 2026-08-29 ~ 2026-09-02 |
| crawl_xjkc.py | 3/14 | 2026-08-31 ~ 2026-09-11 |
| crawl_yantai_tzgg.py | 3/14 | 2026-09-01 ~ 2026-09-07 |
| crawl_yujiang.py | 3/14 | 2026-09-02 ~ 2026-09-10 |
| crawl_zjjpaas.py | 3/14 | 2026-08-31 ~ 2026-09-07 |

（其中 T1/T2 已覆盖的 B/C 档脚本 7 个：crawl_lhyc.py、crawl_wuhu_hb.py、crawl_longtan_zcfg.py、crawl_luzhou.py、crawl_ganxian_hbgss.py、crawl_taian.py、crawl_xunwu_tzgg.py）

---

## 六、端到端冒烟验证：T2 改动样本（12/12 PASS）

**时间**：2026-09-11 15:30–15:44 · **方式**：按 `daily_crawl_config.json` 真实 args 串行实跑（`timeout 240`）

| 脚本 | rc | 耗时 | 产出尾部 |
|---|---|---|---|
| crawl_dangshan.py | 0 | 142.6s | 完成！新增 99 条，更新 0 条，错误 1 条 |
| crawl_guzhen.py | 0 | 58.0s | 完成！新增 100 条，错误 0 条 |
| crawl_nanchang.py | 0 | 0.6s | Found 6 items / Total items: 6 |
| crawl_yongxiu_bmxz.py | 0 | 0.4s | 无更多内容 / 未找到任何内容 |
| crawl_gulin_hjbh.py | 0 | 7.5s | 完成! 新增 10, 跳过 0, 总共 10 |
| crawl_anyi_v2.py | 0 | 3.4s | DB new:6 skip:14 / FTS synced / DONE: 20 |
| crawl_taian.py ★ | 0 | 14.7s | 台安县-生态环境信息: 新增=2, 跳过=97, 错误=0 |
| crawl_ningguo_sthj.py | 0 | 24.3s | Total in gov_raw: 75 / FTS sync verified: 75 |
| crawl_yongdeng.py | 0 | 0.5s | New: 0 Skip: 54 Empty: 0 |
| crawl_xunwu_tzgg.py ★ | 0 | 24.9s | 寻乌县-公示公告 Done! Saved: 0, Skipped: 39, Errors: 0 |
| crawl_trws.py | 0 | 5.8s | SKIP (exists) / DONE Total: 0, Errors: 0 |
| crawl_lhyc.py | 0 | 0.8s | 漯河市郾城区-项目环评 New: 2 Skip: 8 Pages: 1 |

**汇总：PASS 12 / 12**

★ 两个关键回归样本：
- `crawl_taian.py` 自 8/1 起失败 16 次（根因 = T2 未定义名，落在 B 档被误判「偶发」）→ 本次 **rc=0 / 14.7s**，直接证明 T2 修复治的就是日跑失败。
- `crawl_xunwu_tzgg.py` 属 5.2 节 B/C 档观察名单 → **rc=0 / 24.9s**（Saved 0 是正常的，39 条全为已入库跳过）。

---

## 七、B/C 档（反复失败带）取证与根治 — 2026-09-11 下半场

### 7.1 诊断前提：`error_detail` 只存**头部 300 字符**

近 14 天 746 行失败记录长度**全部恰好 300** → 异常类型行结构性不在库里。改用三路交叉：
**榨 traceback 最深帧**（`File "x", line N, in f` + 源码对照）· **mtime 成簇圈半径**（`find -newermt`）· **按 config 真实 args 串行实跑**。

### 7.2 串行实跑结果（67 个，按 config 真实 args + `timeout 150`）

**rc=0 = 58 / 67**。3 个 rc=1 是**真 bug**，已全部修复并复跑验证 rc=0：

| 脚本 | 根因 | 修复 | 验证 |
|---|---|---|---|
| `crawl_gxq_yl_tzgg.py` | `UnboundLocalError: new_count`（只在 `if details:` 里赋值 → 详情全失败日崩） | 循环前初始化 `new_count = 0` | **rc=0** |
| `crawl_linxixian.py` | `TypeError: string indices must be integers`（`attachments.append(tbl_html)` 把 HTML 字符串混进 dict 列表） | 表格 HTML 改入正文 `parts` + `continue` | **rc=0 / 7 条新增** |
| `crawl_soochowchem.py` | 每条记录 fork 一个 `sqlite3` CLI（`timeout=10` 未捕获）→ `TimeoutExpired` 崩 | `-cmd ".timeout 60000"` + `timeout=90` + try 住 | **rc=0 / 46 条新增** |

另 6 个 rc=124 = **真慢**（非崩溃）：`hnccci` `jseia` `jxlc_tzgg` `lufeng` `sthjsh` `wudang`。

### 7.3 第二波 18 个（09-02 批次 ∩ 有失败记录 + 本轮改动过）

**17 个 rc=0**（`zjcx`/`gemxizang`/`linli` 三个我改过的全部通过），唯一 rc=124 是 `wudang`（修好后从"崩溃"变"跑得慢"）。

### 7.4 本轮全部修复（19 个定点 + 2 项批量）

| 类 | 脚本 | 症状 |
|---|---|---|
| SQL 残片（09-02 批量编辑事故） | `guiyang` `gz_hpspgg` `wudang` `suixi_sthj` `gemxizang` `zjcx` | 建表时 `near "title": syntax error`，**0.3s 即崩**，连挂 9 天 |
| 悬空 `gov_fts` 引用 | `linli` | FTS 表不存在 |
| 表格 HTML 误入 attachments | `gaotang` `gzhgyjy` `lingbi` `linxixian` `linyixian` `tongren` `yangzhou` | 6 个静默丢表格（每天"成功"）、1 个崩 |
| UnboundLocalError | `gxq_yl_tzgg` | 空结果日崩 |
| CLI 子进程未捕获 | `soochowchem` | 锁竞争即崩 |
| **抓完不入库** | `jxlc_tzgg` | `if args.db and push_to_searchdb:` 恒假（config 传 `--db` 的条目 = 0/2086）→ **每天跑 380–450s、入库 0 条** |
| 无 URL 预去重 | `jxlc_tzgg` `hnccci` `sthjsh` | 每天重抓全量详情 → 超时 |

**批量（锁韧性）**：
- 1391 个 `crawl_*.py` 的 `sqlite3.connect` 补 `timeout=60`（**1096 处**）
- 60 个用 `sqlite3` CLI 子进程的脚本补 `-cmd ".timeout 60000"`（**121 处**；CLI 默认 `.timeout 0` = 遇锁立刻失败，全库 69/70 个 CLI 脚本都缺）

### 7.5 关键证据：锁竞争是真的

- 串行复跑：多数脚本 rc=0（`fjql` 142.7s、`anji` 42.9s 全过）→ 排除纯代码 bug
- **1–2 个并发写者即可复现**：`gxq_yl_tzgg` 打出 `database is locked`；第二波 `haiyan` 直接 rc=1（同因）
- 持锁元凶：单事务巨量插入（`crawl_xjqh_tzgg.py` 单次插 **12315 行 / 15.3s**）→ 默认 5s `busy_timeout` 扛不住
- 日跑窗口：cron `0 0 * * *`，`DEFAULT_PARALLEL=3`，`SCRIPT_TIMEOUT=600`，今日 30217s → **手动复跑必须放空窗期**

### 7.6 被证伪的假设（勿再顺着修）

| 假设 | 实测 |
|---|---|
| WAL 1.32GB 导致锁竞争 | ❌ `PRAGMA wal_checkpoint(PASSIVE)` = `(busy=0, log=0)` → WAL **逻辑为空**，只是没回收文件空间 |
| 「站点不可达」= 脚本用错 https | ❌ 脚本本来就写 `http://` / `verify=False`；且域名要从脚本 `re.findall` 提（`wudang` 实为 `www.gzwd.gov.cn`、`baixiang` 实为 `www.baixiangxian.gov.cn`） |

### 7.7 验证与交付

- **编译校验：2047 个文件 / 失败 0**
- 抽 3 个实跑（含原本 locked 失败的 `haiyan`）**全部 rc=0**
- 三处同步：**991 个文件 md5 / 0 差异**（服务器 ↔ `~/Crawler/gov_crawler` ↔ 坚果云镜像）
- 备份：`/root/gov_crawler/backups/bc_fix_20260911/`（19 个 `.bak`）+ `bulk_cli_timeout_20260911.tar.gz`

### 7.8 残余项（下一轮）

1. **今晚 00:00 日跑是本轮批量加固的最终验证** —— 看次日 `run_logs` 失败数是否从 71 明显下降
2. `wudang`（改好后仍慢，150s+）、`lufeng`、`jseia`、`hnccci` —— 已预去重的仍慢，需逐条看耗时分布
3. `hnccci` 有 12 条 URL 与库中记录不匹配（`source_url` UNIQUE 冲突但 `page_url` 不同）→ 每天重抓且无法回填
4. `crawl_huangchuan.py` 与 `jxlc_tzgg` 覆盖同一 `site_name`（临川区人民政府-社会公益事业）→ 疑似重复爬虫，待确认
5. 死站点 config 处理：`baixiang`(DNS 失效) / `wudang`(域名变更) / `sdharmony.cn`(双协议超时) / WAF 403 的 `anji` `shangyu` `cs_gz`
6. `changshu_gsgg` 在 config 里**有 2 条重复条目**且 `args=[]` → 脚本默认 50 页
7. 存量：`attachments` 列含 HTML 标签的 **64 行 / 5 站**（铜仁22·高唐14·贵州化工院12·扬州10·灵璧6）待清洗
