1、立项背景和目标
五矿集团电子采购平台会持续发布大量招标、采购项目公告,采购信息分散在多页列表中,人工逐条复制项目名称、采购单位、预计采购时间等信息录入 Excel 表格工作量大、容易出错,且分页翻阅统计效率低下。本项目立项目标:基于 Playwright 自动化浏览器抓取五矿集团电子采购网多页采购公示数据,自动解析字段并写入 Excel 文件,实现采购数据批量结构化导出,方便后续数据整理、统计与归档,同时掌握动态网页分页爬取、XPath 层级定位、openpyxl 表格持久化存储的完整爬虫开发流程。
2、软件功能、核心功能模块介绍
三大核心功能模块
(1)Excel 表格初始化模块:使用 openpyxl 库新建工作簿,创建名为 “五矿集团” 工作表,预先写入表头【项目名称、采购单位、预计采购时间】,定义全局列表用于临时存储抓取到的结构化数据,为后续数据落地做准备。
(2)浏览器自动化页面交互模块:调用 Playwright 启动本地 Edge 浏览器,配置可视化运行窗口、操作减速防反爬;自动访问五矿集团采购官网首页,定位导航栏采购栏目完成点击跳转,循环 5 次执行分页加载逻辑,每页设置长时间强制等待,保证后端动态渲染的采购列表完整加载。
(3)数据解析与表格写入模块:通过层级 XPath 定位每一条采购项目 DOM 容器,循环提取项目标题、采购单位、两段拼接而成的预计采购时间;增加单页最多抓取 50 条数据限制,逐条将字段追加写入 Excel 工作表,最终完整保存为本地表格文件。
3、业务流程、功能路径描述
(1)程序初始化:创建 Excel 文件、新建工作表并设置表头;配置本地 Edge 浏览器启动路径与反爬兼容参数;
(2)自动化访问目标网站:打开五矿集团电子采购平台首页,等待页面完全加载后,通过 XPath 定位导航栏 “采购” 菜单并模拟鼠标点击进入采购公告列表页;
(3)分页循环抓取:执行 5 轮分页爬取,每一页等待 10 秒确保列表数据 JS 渲染完成;定位所有采购条目父级容器;
(4)逐条解析字段:遍历每条条目 DOM 节点,分别提取项目名称、采购单位,拼接两个时间节点作为预计采购时间,限制单页最大抓取 50 条避免数据冗余;
(5)数据入库存储:每解析一条数据立即 append 追加写入 Excel 对应行;5 页全部抓取完成后保存 Excel 文件,关闭浏览器,程序执行结束。
1、整体架构和设计思路,不同模块使用的技术栈
整体架构
采用Python 单文件线性执行架构,自上而下分为四层:文件持久化层→浏览器驱动层→页面交互层→数据提取存储层,逻辑简单直观,轻量化无额外中间件,适合小型定向垂直网站数据采集。
各模块技术栈
开发语言:Python 3.12;
浏览器自动化:Playwright 同步 API,驱动 Chromium 内核 Edge 浏览器,解决采购列表动态 JS 渲染、接口异步加载无法用静态请求抓取的问题;配置 slow_mo 操作延时、长时间页面等待模拟真人访问;
数据持久化:openpyxl 库,用于新建 Excel 工作簿、创建工作表、表头写入、行数据追加、本地文件保存,生成可直接打开编辑的.xlsx 文件;
元素定位:绝对路径 + 相对层级 XPath 表达式,精准嵌套定位列表父容器内的子字段标签;
辅助逻辑:for 循环实现 5 页分页批量爬取、if 条件限制单页最大抓取条数,做基础数据量管控。
2、本人负责模块与量化成果
本项目为个人独立全流程开发,全权完成代码编写、页面元素调试、分页逻辑、Excel 写入、边界条件限制全部工作:
完成 Edge 浏览器适配启动配置,解决本地浏览器路径调用、自动化操作过快被网站风控拦截问题;
编写首页跳转、导航菜单点击进入采购列表页的自动化交互逻辑;
设计 5 页循环分页抓取方案,每页 10 秒超时等待保障数据加载完整性;
编写多层嵌套 XPath 定位规则,拆解三个目标字段,对两段时间文本做拼接处理,增加单页最多 50 条数据截断限制;
对接 openpyxl 实现自动建表、表头填充、逐条数据入库;
量化成果:最多可稳定抓取 5 页采购公告数据,单页上限 50 条,总计最高可采集 250 条结构化采购信息,自动生成规范 Excel 台账,无需手动复制粘贴,数据录入零人工误差,信息整理耗时从半小时缩短至 1 分钟以内。
3、开发遇到的难点、坑点及解决方案
难点 1:采购列表为前端异步动态渲染,静态 requests 无法获取列表内容
问题:直接请求网页源代码只能拿到框架代码,采购条目由接口异步返回后 JS 渲染到页面,无法解析。
解决:使用 Playwright 真实浏览器引擎加载完整页面,等待页面完全渲染后再执行元素定位,确保 DOM 中存在完整采购条目。
难点 2:页面层级极深,XPath 路径复杂,容易因页面微小改动定位失效
问题:网站 DIV 嵌套层级过多,绝对 XPath 容错率低,子标签序号容易变动导致定位不到数据。
解决:采用父容器批量定位 + 内部相对 XPath 二次提取的写法,先拿到所有条目大盒子,再在每个盒子内部相对路径取标题、单位、时间,提升定位稳定性。
难点 3:预计采购时间拆分在两个不同 DIV 标签内,字段分散
问题:开始时间和结束时间分别在两