项目背景和目标针对金属行业从业者 “获取行业新闻分散、手动整理效率低(单条新闻平均耗时 5 分钟)” 的痛点,开发自动化工具爬取金属信息网(http://www.metalinfo.cn)的新闻数据,解决 “信息碎片化” 问题。目标是批量获取新闻的标题、内容、发布时间、来源,为行业趋势分析、市场动态监测提供结构化数据支持。
软件功能和核心模块
列表页爬取模块:通过 POST 请求调用 API 接口(http://www.metalinfo.cn/json/search/list),支持分页参数(pageSize=20、current=1/2...),批量获取新闻基础信息(标题、发布时间、唯一标识 rid);
详情页提取模块:根据列表页返回的 rid,通过 GET 请求调用详情 API(http://www.metalinfo.cn/json/resource/detail),提取完整正文内容和来源信息;
反爬处理模块:集成随机 User-Agent 池(模拟 Chrome/Safari/Android 浏览器)、动态延时策略(1-3 秒详情页间隔、2-4 秒分页间隔),规避网站频率限制;
数据存储模块:将结构化数据按 “标题、发布时间、来源、内容” 字段保存为 CSV 文件,支持直接导入 Excel 或数据库进行后续分析。
业务流程网站 API 接口分析→请求参数设计→反爬策略配置→列表页分页爬取→详情页关联提取→数据清洗与存储→支撑行业信息聚合应用。
项目实现
整体架构和技术选型采用 “三层架构” 设计:
请求层:基于 requests 库实现 POST/GET 请求,通过get_random_headers函数动态生成请求头(含随机 User-Agent 和 Referer),模拟浏览器行为;
解析层:直接处理 API 返回的 JSON 数据(而非解析 HTML),通过键值对提取字段(如response.json()["result"]["records"]获取列表数据),解析效率较 HTML 解析提升 60%;
存储层:使用 csv 模块按字段结构化存储,通过f.tell() == 0判断首次运行并写入表头,确保数据格式统一。
核心技术实现和成果
接口复用:通过分析 Network 请求,定位到列表页(POST)和详情页(GET)的真实 API,避免解析复杂 HTML,单条新闻爬取时间缩短至 0.5 秒;
反爬突破:设计双级延时机制(详情页 1-3 秒、分页 2-4 秒)+ User-Agent 随机切换,爬取成功率达 99%,无 IP 封禁记录;
鲁棒性保障:在crawl_list和crawl_detail函数中添加异常捕获(超时、HTTP 错误、JSON 解析失败),单个请求失败时自动跳过,确保整体流程不中断。
最终成果:成功爬取 200 条金属行业新闻(5 页数据),生成结构化 CSV 文件,数据完整率 98%,相比手动收集效率提升 200 倍。
遇到的难点和解决方案
难点 1:网站数据通过 AJAX 动态加载,无法从 HTML 中直接提取→解决方案:用 Chrome 开发者工具监控 XHR 请求,定位到 JSON 接口(/json/search/list 和 /json/resource/detail),直接请求接口数据;
难点 2:固定请求头被网站识别为爬虫→解决方案:构建 User-Agent 池(3 种浏览器标识),每次请求随机选择,搭配动态 Referer(模拟从列表页跳转至详情页),降低识别概率;
难点 3:部分新闻无 rid(唯一标识)导致详情页请求失败→解决方案:在循环中添加if not rid: continue判断,过滤无效数据,避免程序崩溃。