# 广东省公共资源交易平台数据抓取需求 ## 1. 项目目标 开发一个 Python 爬虫程序,用于抓取[广东省公共资源交易平台](https://ygp.gdzwfw.gov.cn/#/44/jygg)的特定招标公告数据。 ## 2. 抓取范围 - **目标网站**: `https://ygp.gdzwfw.gov.cn/#/44/jygg` - **筛选条件**: 只抓取公告标题中明确包含 “**中标结果**” 关键字的条目。 ## 3. 数据提取要求 对于每一条符合条件的“中标结果”公告,需要提取以下三项信息: 1. **项目标题**: 公告的完整标题。 2. **发布时间**: 公告的发布日期。 3. **详细链接**: 指向公告详情页的完整、可直接访问的 URL。 ## 4. 功能要求 ### 4.1. 日期范围过滤 - 程序需要支持通过命令行参数传入`开始日期`和`结束日期`。 - 如果用户提供了日期范围,则只抓取发布时间在该范围内的公告。 - 如果用户**未提供**任何日期参数,程序应默认抓取**今天**发布的公告。 ### 4.2. 分页处理 - 爬虫必须能够自动处理分页。 - 从第一页开始抓取,自动加载并解析后续所有页面的数据,直到最后一页,确保不遗漏任何数据。 ### 4.3. 详情页链接处理 - 意识到详情页链接可能是通过 JavaScript 点击事件动态生成的。 - 在抓取过程中,需要分析页面交互逻辑(可能涉及加密或后端 API 调用),以正确解析出真实的详情页链接。 ## 5. 开发语言 - **编程语言**: Python ## 6. 接口参考与数据示例 根据 `examples/` 目录下的抓包数据,以下是接口分析结果: ### 6.1. 列表页接口 - **接口 URL**: `https://ygp.gdzwfw.gov.cn/ggzy-portal/search/v2/items` - **请求方式**: `POST` - **关键请求头**: - `Content-Type`: `application/json` - `X-Dgi-Req-Nonce`, `X-Dgi-Req-Signature`, `X-Dgi-Req-Timestamp`: 涉及请求签名,需要逆向分析 JS 或使用自动化工具处理。 - `_horizon_sid`, `_horizon_uid`: Cookie 参数。 - **请求体 (Payload) 示例**: ```json { "type": "trading-type", "openConvert": false, "keyword": "", "siteCode": "44", "secondType": "A", "tradingProcess": "", "thirdType": "[]", "projectType": "", "publishStartTime": "", "publishEndTime": "", "pageNo": 2, "pageSize": 10 } ``` - **响应结构 (关键字段)**: - `data.pageData`: 公告列表数组。 - `noticeTitle`: 公告标题。 - `publishDate`: 发布时间 (格式: `yyyyMMddHHmmss`)。 - `noticeThirdTypeDesc`: 公告类型描述 (筛选 "中标结果")。 - 构造详情页所需的字段: `noticeId`, `projectCode`, `tradingProcess` (作为 `bizCode`), `siteCode`, `pubServicePlat`, `noticeSecondTypeDesc`, `projectType`. ### 6.2. 详情页链接构造 详情页 URL 并非直接在列表接口返回,而是通过前端拼接。根据 `examples/detail-url.json` 和列表数据的对比,URL 模式如下: `https://ygp.gdzwfw.gov.cn/#/44/new/jygg/v3/A?noticeId={noticeId}&projectCode={projectCode}&bizCode={tradingProcess}&siteCode={siteCode}&publishDate={publishDate}&source={pubServicePlat}&titleDetails={noticeSecondTypeDesc}&classify={projectType}` *注: URL 中的参数值可能需要进行 URL 编码。`nodeId` 参数在示例 URL 中存在,但在列表响应中未直接发现,需确认是否必须或生成逻辑。*