3.4 KiB
3.4 KiB
广东省公共资源交易平台数据抓取需求
1. 项目目标
开发一个 Python 爬虫程序,用于抓取广东省公共资源交易平台的特定招标公告数据。
2. 抓取范围
- 目标网站:
https://ygp.gdzwfw.gov.cn/#/44/jygg - 筛选条件: 只抓取公告标题中明确包含 “中标结果” 关键字的条目。
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/jsonX-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 中存在,但在列表响应中未直接发现,需确认是否必须或生成逻辑。