ygp-gdzwfw-gov-cn/requirements.md

3.4 KiB
Raw Blame History

广东省公共资源交易平台数据抓取需求

1. 项目目标

开发一个 Python 爬虫程序,用于抓取广东省公共资源交易平台的特定招标公告数据。

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) 示例:
    {
        "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 中存在,但在列表响应中未直接发现,需确认是否必须或生成逻辑。