政府招投标数据爬虫项目--医疗实例项目文档
- 1. 项目概述
- 1.1 项目目标
- 1.2 技术栈
- 2. 系统架构
- 2.1 模块划分
- 2.2 流程示意图
- 3. 核心模块设计
- 3.1 反爬处理模块(`utils/anti_crawler.py`)
- 3.1.1 功能特性
- 3.1.2 关键代码
- 3.2 爬虫模块(`crawler/spiders/`)
- 3.2.1 基类设计(`base_spider.py`)
- 3.2.2 医疗爬虫示例(`medical_spider.py`)
- 3.3 数据库设计(`database/models.py`)
- 3.3.1 数据表结构
- 3.3.2 枚举类型
- 3.4 数据分析模块(`analyzer/data_processor.py`)
- 3.4.1 分析维度
- 3.4.2 关键算法
- 4. 系统配置与部署
- 4.1 环境搭建
- 4.2 配置文件(`config.py`)
- 5. 使用说明
- 5.1 启动爬虫
- 5.2 日志查看
- 5.3 数据分析报告
- 附录:核心代码片段
- 免责声明
1. 项目概述
1.1 项目目标
爬取医疗领域的政府招投标项目数据,实现反爬机制处理、数据存储、数据分析及可视化,为招投标市场分析提供数据支持。
1.2 技术栈
- 编程语言:
Python 3.8+
- 异步框架:
Asyncio
(网络请求并发处理) - 数据存储:
MySQL + SQLAlchemy ORM
- 反爬技术:
Selenium
(JS渲染)、代理IP池、User-Agent轮换、验证码识别 - 数据分析:
Scikit-learn
(聚类分析)、Pandas(数据处理)、Matplotlib/WordCloud(可视化) - 通知模块:
SMTP
邮件通知
2. 系统架构
2.1 模块划分
项目根目录
├── config.py # 配置文件
├── main.py # 主程序入口
├── crawler # 爬虫模块
│ ├── spiders # 具体爬虫实现
│ │ ├── base_spider.py # 爬虫基类
│ │ ├── construction_spider.py # 建筑项目爬虫
│ │ └── medical_spider.py # 医疗项目爬虫(优化新增)
│ └── SpiderManager.py # 爬虫管理器
├── analyzer # 数据分析模块
│ └── data_processor.py # 数据处理与分析
├── database # 数据库模块
│ └── models.py # 数据库模型定义
├── utils # 工具模块
│ ├── anti_crawler.py # 反爬处理
│ ├── proxy_pool.py # 代理IP池(优化新增)
│ └── notifier.py # 通知模块(优化新增)
└── requirements.txt # 依赖清单
2.2 流程示意图
目标网站 → 反爬处理(代理/UA/JS渲染/验证码) → 数据解析 → 数据库存储 → 数据分析(关键词/预算/趋势/聚类) → 可视化报告 → 邮件通知
3. 核心模块设计
3.1 反爬处理模块(utils/anti_crawler.py
)
3.1.1 功能特性
- User-Agent轮换:随机切换浏览器指纹,支持Chrome、Firefox等多种UA
- 代理IP池:多来源获取代理,定期刷新,验证有效性(
utils/proxy_pool.py
) - JS渲染:使用Selenium无头浏览器处理动态内容,模拟人类浏览行为(滚动、悬停)
- 验证码识别:支持图片验证码和reCAPTCHA,对接第三方打码平台
3.1.2 关键代码
# 模拟人类浏览行为(滚动和鼠标移动)
def _simulate_human_behavior(self):scroll_heights = [300, 500, 800, 1200]for height in scroll_heights:self.js_driver.execute_script(f"window.scrollTo(0, {height});")time.sleep(random.uniform(0.5, 1.5))# 随机悬停可点击元素elements = self.js_driver.find_elements(By.CSS_SELECTOR, 'a, button')for elem in random.sample(elements, min(3, len(elements))):ActionChains(self.js_driver).move_to_element(elem).perform()time.sleep(0.3)
3.2 爬虫模块(crawler/spiders/
)
3.2.1 基类设计(base_spider.py
)
- 异步请求:使用
aiohttp
实现高并发爬取,控制并发量(默认5个任务) - 日志记录:记录爬取进度、成功/失败次数,写入数据库日志表(
CrawlerLog
) - 异常处理:重试机制(默认3次),失败通知管理员
3.2.2 医疗爬虫示例(medical_spider.py
)
# 分页爬取处理
async def _crawl_next_pages(self, url, selector, max_pages=5):for page in range(max_pages):html = await self.fetch(url)if not html: breaksoup = self.get_soup(html)# 解析当前页项目for item in soup.select(selector):item_url = self._parse_item_url(item)items.append(item_url)# 提取下一页链接next_url = soup.select_one('.next-page')['href']url = self._build_absolute_url(next_url)await asyncio.sleep(3) # 控制请求间隔return items
3.3 数据库设计(database/models.py
)
3.3.1 数据表结构
表名 | 功能描述 | 核心字段 |
---|---|---|
bidding_projects | 招投标项目表 | id , title , url , type (枚举), publish_date , budget , content |
crawler_logs | 爬虫日志表 | spider_name , start_time , end_time , status , items_crawled |
keyword_stats | 关键词统计表 | keyword , count , type (枚举), date |
3.3.2 枚举类型
class ProjectType(enum.Enum):CONSTRUCTION = "construction" # 建筑MEDICAL = "medical" # 医疗TOURISM = "tourism" # 旅游HOTEL = "hotel" # 酒店
3.4 数据分析模块(analyzer/data_processor.py
)
3.4.1 分析维度
- 关键词统计:使用jieba分词,提取高频关键词并生成词云
- 预算分析:计算均值、标准差,绘制箱线图对比不同类型项目预算
- 时间趋势:按日/周统计项目数量,生成趋势曲线
- 地域分析:通过关键词匹配提取项目地域信息,绘制地域分布饼图
- 聚类分析:K-means算法自动分类项目,PCA可视化聚类结果
3.4.2 关键算法
# 肘部法则确定最佳聚类数
def _find_optimal_clusters(self, X, max_k=10):wss = [KMeans(k).fit(X).inertia_ for k in range(1, max_k+1)]deltas = [wss[i]-wss[i+1] for i in range(len(wss)-1)]return deltas.index(max(deltas)) + 1 # 选择拐点处的k值
4. 系统配置与部署
4.1 环境搭建
# 安装依赖
pip install sqlalchemy aiohttp beautifulsoup4 selenium webdriver-manager pandas numpy scikit-learn pyvirtualdisplay# 初始化数据库
mysql -u root -p
CREATE DATABASE bidding_data CHARACTER SET utf8mb4;
4.2 配置文件(config.py
)
DB_CONFIG = { # 数据库配置'host': 'localhost','port': 3306,'user': 'root','password': 'your_password','database': 'bidding_data'
}EMAIL_CONFIG = { # 邮件通知配置(可选)'smtp_server': 'smtp.example.com','smtp_port': 587,'username': 'sender@example.com','password': 'email_password','sender': 'sender@example.com','recipients': ['recipient1@example.com', 'recipient2@example.com']
}
5. 使用说明
5.1 启动爬虫
python main.py
5.2 日志查看
- 控制台日志:记录爬取进度、反爬处理状态、数据分析结果
- 数据库日志:
crawler_logs
表存储爬虫任务的开始/结束时间、成功数、错误信息
5.3 数据分析报告
- 自动生成图片报告(预算分析图、趋势图、词云等),存储在项目根目录
- 邮件通知:包含文字报告和图表附件(需配置
EMAIL_CONFIG
)
附录:核心代码片段
main.py
:项目启动入口,协调各模块初始化anti_crawler.py
:反爬处理核心逻辑,包含JS渲染和验证码解决方案data_processor.py
:数据分析算法实现,包含K-means聚类和可视化代码
免责声明
- 本项目涉及网络爬虫、数据解析等技术操作,可能因目标网站反爬策略调整、网络波动、代码漏洞等原因导致爬取失败、数据错误或账号封禁。我们不对上述风险导致的任何直接或间接损失(包括但不限于数据丢失、设备损坏、业务中断等)承担责任。
- 本项目可能依赖第三方库(如 Scrapy、Redis、MySQL 等)或服务(如代理 IP、验证码识别平台),因第三方原因导致的任何问题,我们不承担连带责任。
- 本项目的源代码、文档、架构设计等知识产权归开发团队所有,受《中华人民共和国著作权法》保护。未经书面授权,禁止任何形式的复制、修改、传播或商业化使用。
- 爬取的政府招投标数据版权归原发布方所有,本项目仅作为技术实现示例,不主张对数据的版权或所有权。
源码下载:《Python爬虫-实战医疗项目》