# bid-crawler **Repository Path**: itqwq/bid-crawler ## Basic Information - **Project Name**: bid-crawler - **Description**: NEW!生成招投标采集脚本SKILL - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2026-09-04 - **Last Updated**: 2026-10-18 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # bid-crawler 参考案例维护说明 本文档供案例库维护者使用,说明如何给 `examples/` 下的 Python 参考案例添加能力标签,以及如何检查和检索案例。 ## 案例首行固定写法 每个案例文件的第一行固定写为: ```python # case-features: json-list, post-json, html-content ``` 固定格式: 1. `case-features` 必须位于案例文件第一行。 2. 固定前缀为 `# case-features: `,冒号后保留一个空格。 3. 多个能力使用英文逗号和一个空格分隔。 4. 能力名称只能使用下表中的固定字段。 5. 同一能力不能重复。 6. 能力顺序不影响检索结果。 7. 只标注案例真实实现的能力,不标注站点名称、URL、字段名、CSS 选择器或普通 Python 写法。 正确示例: ```python # case-features: json-list, post-json, render-content, extra-attachment ``` 错误示例: ```python # case-features: JSON-LIST, POST-JSON # case-features: json_list, post_json # case-features: json-list,post-json # case-features: json-list, json-list ``` ## 固定能力字段对照表 | 固定字段 | 中文含义 | 何时添加 | |---|---|---| | `html-list` | HTML 列表 | 列表数据直接来自 HTML DOM | | `json-list` | JSON 列表 | 列表数据来自 JSON 响应或 JSON 接口 | | `datastore-list` | 页面内嵌数据列表 | 列表数据来自页面 `datastore` 或同类内嵌数据块 | | `document-write-list` | 脚本生成列表 | 列表项由 `document.write()` 或同类脚本生成 | | `html-content` | HTML 正文 | 正文直接来自详情页 HTML DOM | | `json-content` | JSON 正文 | 正文来自 JSON 字段或独立 JSON 详情接口 | | `list-with-content` | 列表自带正文 | 列表响应已经包含完整正文,详情阶段可以直接返回 | | `render-content` | 浏览器渲染正文 | 静态响应没有可用正文,必须使用 `request.render_page` 获取渲染后的 DOM | | `document-write-content` | 脚本生成正文 | 正文由 `document.write()` 或同类脚本生成,需要还原局部内容 | | `iframe-content` | iframe 二级正文 | 正文来自详情页 iframe 或 iframe 指向的二级页面 | | `embedded-file` | 内嵌内容文件 | 正文通过 `iframe`、`object`、`embed` 或脚本展示 PDF 等文件 | | `get-query` | GET 查询参数 | 请求使用 GET 查询参数,且该方式对案例选择有参考价值;普通无参数 GET 不必添加 | | `post-form` | POST 表单 | 请求使用 POST 表单数据 | | `post-json` | POST JSON | 请求使用 POST JSON 请求体 | | `fill-title` | 详情补标题 | 列表标题缺失或被截断,需要在详情页补齐完整标题 | | `fill-pubtime` | 详情补时间 | 列表发布时间缺失或不完整,需要在详情页补齐 | | `mixed-title-pubtime` | 标题时间混排 | 标题和发布时间位于同一元素、子元素或同一段文本,需要拆分 | | `composed-pubtime` | 组合发布时间 | 年、月、日分散在多个元素或字段,需要组合成完整日期 | | `timestamp-pubtime` | 时间戳发布时间 | 发布时间来自秒级或毫秒级时间戳,需要转换 | | `multi-layout` | 多结构分支 | 多个栏目的 HTML、JSON 字段、URL 或解析结构不同,需要使用顶层 `t` 分支 | | `extra-attachment` | 正文外独立附件 | 正文主体之外存在已确认的附件区或附件列表 | | `javascript-attachment` | JavaScript 附件 | 附件地址位于 JavaScript 调用、按钮参数或脚本字符串中,需要还原链接 | | `attachment-api` | 附件接口 | 附件信息或真实下载地址需要通过独立接口获取 | | `encrypt-request` | 请求加密 | 业务请求参数需要加密、签名或特殊编码后发送 | | `decrypt-response` | 响应解密 | 业务响应需要解密或特殊还原后才能解析 | | `dynamic-token` | 动态凭证请求链 | 请求前需要动态获取 Cookie、Token、校验值或完成特殊请求链 | | `captcha` | 图形验证码 | 列表请求前需要获取、识别并提交图形验证码 | | `ruishu` | 瑞数 | 站点命中瑞数 challenge,使用瑞数固定流程 | | `jsl` | 加速乐 | 站点命中加速乐 challenge,使用加速乐固定流程 | | `acw-sc-v2` | 阿里 ACW | 站点命中阿里 `acw_sc__v2` challenge,使用对应固定流程 | `embedded-file` 表示正文自身是内嵌文件;`extra-attachment` 表示正文之外还有独立附件,两者可以同时添加。 ## 常用标注示例 普通 HTML 列表和 HTML 正文: ```python # case-features: html-list, html-content ``` POST JSON 列表接口和 HTML 详情页: ```python # case-features: json-list, post-json, html-content ``` JSON 列表和 JSON 正文接口: ```python # case-features: json-list, post-json, json-content ``` 列表响应已经包含正文: ```python # case-features: json-list, list-with-content ``` 详情页补齐标题和发布时间: ```python # case-features: html-list, html-content, fill-title, fill-pubtime ``` 多栏目结构不同并带独立附件: ```python # case-features: html-list, html-content, multi-layout, extra-attachment ``` 渲染正文、iframe 二级页面和 JavaScript 附件: ```python # case-features: json-list, post-json, render-content, iframe-content, fill-pubtime, javascript-attachment ``` 请求加密和响应解密: ```python # case-features: json-list, post-json, json-content, encrypt-request, decrypt-response ``` 瑞数 HTML 案例: ```python # case-features: html-list, html-content, ruishu ``` 图形验证码列表接口: ```python # case-features: json-list, post-form, html-content, captcha ``` ## 维护与检查命令 检查全部案例首行标签: ```powershell python scripts/search-reference-cases.py --validate ``` 手动测试组合检索: ```powershell python scripts/search-reference-cases.py json-list post-json html-content ``` 默认返回前十个匹配案例;匹配结果不足十个时全部返回。需要调整结果数量时: ```powershell python scripts/search-reference-cases.py json-list extra-attachment --limit 5 python scripts/search-reference-cases.py json-list extra-attachment --all ``` 查询能力和案例首行能力都会作为无序集合处理,因此下面两个命令结果相同: ```powershell python scripts/search-reference-cases.py post-json html-content python scripts/search-reference-cases.py html-content post-json ``` ## 新增固定能力字段 只有当一种能力会实际影响案例选择或实现路径时,才新增固定字段。 新增时需要同步修改: 1. 本文档的“固定能力字段对照表”。 2. `scripts/search-reference-cases.py` 中的 `ALLOWED_FEATURES`。 3. 实际包含该能力的案例首行。 字段名使用简短、自解释的小写 kebab-case。不要因为某个站点出现新的字段名、接口名、参数名或选择器就新增能力。 ## search-reference-cases.py支持以下功能 当前 bid-crawler/scripts/search-reference-cases.py 支持以下功能: 1. 能力标签检索 ```powershell python scripts/search-reference-cases.py json-list post-json html-content ``` 输入一个或多个能力标签,脚本会在 `examples/` 目录中检索案例。 匹配规则是: - 案例必须包含输入的全部能力; - 案例可以额外包含其他能力; - 输入顺序不影响结果; - 重复输入能力会自动去重。 2. 支持的能力标签校验 脚本会校验输入能力是否属于预定义列表,例如: - html-list - json-list - html-content - json-content - post-form - post-json - render-content - extra-attachment - encrypt-request - decrypt-response - ruishu - jsl - acw-sc-v2 如果输入未知能力,会直接报错。 3. 默认返回前 10 条 ```powershell python scripts/search-reference-cases.py html-list html-content ``` 默认最多返回 10 个匹配案例: - 匹配结果超过 10 条时,仅返回前 10 条; - 匹配结果少于 10 条时,全部返回。 4. 自定义返回数量 ```powershell python scripts/search-reference-cases.py json-list --limit 5 ``` 通过 `--limit N` 指定最多返回的案例数量,`N` 必须大于 0。 5. 返回全部匹配案例 ```powershell python scripts/search-reference-cases.py json-list --all ``` 使用 `--all` 时取消数量限制,返回全部匹配案例。 6. 匹配结果排序 - 优先返回额外能力较少、与查询条件更接近的案例; - 额外能力数量相同时,按案例文件名排序。 7. 输出案例路径 脚本输出案例相对于 `bid-crawler` 目录的路径,例如: ```text examples/某个案例.py ``` 8. 案例标签读取 脚本读取每个案例 Python 文件的第一行,格式必须是: ```python # case-features: json-list, post-json, html-content ``` 没有正确 `case-features` 标签的案例不会参与检索。 9. 无参数和错误处理 以下情况会直接报错: - 未输入任何能力标签; - 输入未知能力; - `--limit` 小于 1。 脚本只进行案例标签检索和路径输出,不会执行或导入参考案例中的采集代码。