一个基于Qt 6.9的低标准网页爬虫工具,支持非并发任务处理、数据库存储和SQL查询。
- Qt 6 框架 - 使用Qt 6.9进行GUI开发
- HTTP 请求 - 基于libcurl库实现网络爬取
- JSON 处理 - 使用nlohmann-json进行数据解析
- 数据库支持 - SQLite数据库集成,支持任务和结果存储
- 配置管理 - config.json统一管理
config.json文件
{
"email": {
"receiver": "you@example.com",
"sendAlert": true,
"sender": {
"from": "you@example.com",
"password": "<SMTP_PASSWORD>",
"smtp_port": 465,
"smtp_server": "smtp.example.com",
"use_ssl": true,
"username": "your_smtp_user"
}
},
"saveAndVectorize": false,
"zhipin": {
"cookie": "<YOUR_ZHIPIN_COOKIE>",
"updateTime": "2026-01-03"
}
}- 程序自动使用
- 程序启动时自动加载config.json
- API请求中自动注入Cookie
- 无需修改代码
Crawler/
├── main.cpp # 程序入口
├── cppGUI/ # C++ Qt GUI 子模块(LauncherWindow、CrawlerWindow 等,取代旧的 MainWindow)
├── CMakeLists.txt # CMake 构建配置
├── ai/ # Python AI 协调与 RAG 相关脚本(brain.py 等)
├── cppGUI/ # Qt C++ GUI 子模块(聊天/配置/爬虫窗口)
├── gui/ # Python GUI 辅助脚本(PyQt/PySide,若存在)
├── network/ # 网络爬虫核心模块(job_crawler_*)
├── db/ # 数据库模块(sqlinterface)
├── tasks/ # 任务管理层(presenter_task、crawler_task、ai_transfer_task 等)
├── constants/ # 数据结构定义(network_types.h / db_types.h)
├── documentations/ # 项目文档(设计、算法、API 说明)
├── web/ # 内置/实验性 Web 服务或示例(若存在)
├── include/ # 第三方库头/二进制(请确保以下内容存在或按需安装)
│ ├── curl-8.17.0_5-win64-mingw/ # libcurl 二进制/头
│ ├── nlohmann-json-develop/ # nlohmann::json header-only
│ ├── WebView2SDK/ # Windows WebView2 SDK(可选,若使用 WebView2)
│ ├── wil/ # Windows Implementation Libraries(若需)
│ └── openssl/ or libssl/ # 如果用到 SSL 的话(系统/包管理器 提供)
├── build/ # 本地构建输出(Qt Creator / CMake 生成)
├── data/ # 运行时数据与向量索引(conversation_history, vector_index 等)
├── db/ # 数据库相关文件
├── logs/ # 运行日志
├── maintenance/ # 维护脚本(邮件告警等)
├── presenter/ # Presenter 相关代码(若存在,与前端展示有关)
├── network/ # 重复条目已合并到上方 network/
├── tasks/ # 重复条目已合并到上方 tasks/
├── test/ # 测试程序
└── README.md / LICENSE / requirements.txt / config.json项目采用分层架构,通过任务层实现模块间的解耦:
┌───────────────────────────────────────────────────────────┐
│ PresenterTask (前端展示服务) │
│ 提供: 前端展示与调度接口,触发抓取与AI传输任务 │
└──────────────┬──────────────────────┬────────────────────┘
│ │
┌───────▼──────┐ ┌───────▼────────┐
│ CrawlerTask │◄──────┤ PresenterTask │
│ (总协调器) │ 调度 │ (前端) │
│ 提供: crawlAndStore()│ │ │
└──────┬──────┘ └──────┬────────┘
│ │
┌─────────▼────────┐ ┌──────▼──────┐ ┌──────────────────┐
│ InternetTask │ │ SqlTask │ │ ai_transfer_task│
│ (网络层) │ │ (存储层) │──────→│ (受前端/爬虫调度) │
└─────────┬────────┘ └─────┬───────┘ └────────┬─────────┘
│ │ │
┌─────────▼────────┐ ┌────────▼─────────┐ ─────▼─────
│ job_crawler │ │ SQLInterface │ │ AI │
│ (爬虫核心) │ │ (数据库/存储) │ │ 服务 │
└──────────────────┘ └──────────────────┘ └──────────┘
PK: 岗位ID (int) data.id
岗位名称 (char[]) data.jobName
SK: 类型ID (int) data.recruitType
SK: 来源ID (int) (TODO)
SK: 地区ID (int): 自增ID(见下)
SK: TagID (int): 自增ID(见下)
SK: 薪资档次ID (int): 自设计ID(见下)
岗位要求 (char[5000]) data.ext.requirements
最高薪资 (double) data.salaryMax
最低薪资 (double) data.salaryMin
创建日期(dateTime) data.createTime
更新日期(dateTime) data.updateTime
HR上次线时间(dateTime) data.user.loginTime
PK: 公司ID data.companyId
公司名称 (char[]) data.user.identity[].companyName(仅从identity列表获取,缺失视为错误)
PK: 类型ID data.recruitType
类型名称 (char[]): (固定枚举,1 校招,2 实习,3 社招)
PK: 地区ID: 自增ID
地区名称: data.jobCity(字符串);在数据库侧按名称插入/查找,返回自增cityId
PK: TagID: 自增ID
Tag内容:遍历 data.pcTagInfo.jobInfoTagList,优先取 `tag.title`(兼容 `content`/`name`),对标题进行去重后插入 JobTag(INSERT OR IGNORE),并返回对应 tagId 用于 JobTagMapping
PK: 薪资档次ID: 自设计ID
薪资上限 (int)(设计阶梯,按Max与上限比较,阈值分类存储)
## 🛠️ 技术栈
| 组件 | 版本 | 用途 |
|------|------|------|
| Qt | 6.9.2 | GUI框架 |
| CMake | 3.30.5 | 项目构建 |
| libcurl | 8.17.0 | HTTP请求 |
| nlohmann-json | - | JSON解析 |
| SQLite | - | 数据库 |
| MSVC | 2022 | C++编译器 |
## 📦 依赖库
### 外部依赖
- **libcurl** - 网络HTTP库
- **nlohmann-json** - 现代C++ JSON库
- **SQLite** - 轻量级数据库
### 内置模块
- **job_crawler** - 爬虫核心实现
- **sqlinterface** - 数据库操作接口
- **sqltask** - SQL任务管理
## 📚 模块说明
### 常量定义模块 (constants/)
- **network_types.h** - 网络模块数据结构(`JobInfo`、`MappingData`、`DebugLevel`等)。
- **db_types.h** - 数据库模块数据结构(`SQLNS::JobInfo`、`SQLNS::SalaryRange`等)。
### 网络爬虫模块 (network/)
- **job_crawler.h** - 爬虫公共接口与数据结构声明(引用 `constants/network_types.h`)。
- **job_crawler_main.cpp** - 爬虫主入口,聚合网络层与解析器并驱动抓取流程。
- **job_crawler_network.cpp** - 低层 HTTP 实现(libcurl)、超时、重试与请求头管理。
- **job_crawler_parser.cpp** - 响应解析与适配器:容错、字段映射、不同站点格式兼容。
- **job_crawler_printer.cpp** - 统一输出/调试打印(`qDebug()`)。
- **job_crawler_utils.cpp** - 公共工具(时间/HTML 清理、CURL 回调、格式化)。
### 数据库模块 (db/)
- **sqlinterface.h / sqlinterface.cpp** - SQL 接口(`SQLNS` 命名空间):负责表结构、插入/查询、去重与事务控制。
- 注意事项:当前使用 SQLite,采用每线程 DB 连接策略;提供幂等写入(INSERT OR IGNORE)与批量插入路径。
### 任务模块 (tasks/)
- **presenter_task.h / presenter_task.cpp** - 前端展示与调度服务:对外暴露 UI/前端的任务入口,触发 `crawler_task`、`ai_transfer_task`,并推送任务状态到 UI(前端/展示专用)。
- **crawler_task.h / crawler_task.cpp** - 爬虫总协调器:执行 `crawlAndStore()`,协调 `internet_task` 与 `sql_task`,处理抓取流程与结果汇总。
- **internet_task.h / internet_task.cpp** - 网络爬取任务:封装对单站点或任务的抓取实现,负责并发、限速、重试与反爬退避策略。
- **sql_task.h / sql_task.cpp** - 存储任务:负责数据映射、薪资档次计算、标签/城市自增映射与事务化写入数据库。
- **ai_transfer_task.h / ai_transfer_task.cpp** - AI 数据传输与 RAG 管道:由前端或 `crawler_task` 调度,负责文档抽取、embedding、向量存储更新以及调用 Python LLM 服务进行后处理或问答准备。
### 前端 / GUI 模块 (cppGUI/ 与 gui/)
- `mainwindow`, `crawlerwindow`, `launcherwindow` 等:UI 控件、筛选与任务入口。
- `presenter`(前端展现层)负责展示逻辑与任务调度入口(与 `presenter_task` 对应)。
### AI 模块 (ai/)
- **brain.py** - RAG 与 LLM 协调:构建检索提示、调用 embedding、合并检索结果并向 LLM 发出生成请求,支持知识库更新与检索管线。
- **config/** 与 **settings.py** - 本地 LLM(如 Ollama)与 embedding 服务配置。
### 其他模块
- **include/** - 第三方头/二进制(curl、nlohmann-json 等)。
- **web/** - 内置或实验性 Web 服务(若存在)。
- **test/** - 单元与集成测试用例。
## 🧪 测试
项目包含测试代码在 `test/` 目录:
- `test_internet_task.cpp` - 网络爬取单元测试
- `test_sql_task.cpp` - SQL任务/映射与存储测试
- `test_crawler_task.cpp` - 爬取+存储集成测试
运行测试:
```bash
cmake --build . --target test
MIT License
欢迎提交 Issue 和 Pull Request!
如有问题,请提交 Issue 或联系项目维护者。
一·qt准备 1·首先安装qt6.9.2 2·安装cmake3.30.5 3·安装Desktop_Qt_6_9_2_MSVC2022_64bit-Debug 4·vs2022安装器的Desktop开发工具中勾选MSVC2022 64位
二·python准备 1·搭配python3.12及以上版本(最好保持一个版本3.12) 2·搭配好IDE的python环境,该python用于大模型而非爬虫 3·安装python的第三方库,安装方法如下: 找到requirements.txt文件 在该文件所在目录打开命令行
pip install -r requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple/三·ollama准备(用于AI) 1·首先安装ollama 2·打开ollama 3·输入ollama pull qwen3:0.6b 4·下载qwen3:0.6b模型
ollama pull qwen3:0.6b5·每次启动项目记得打开cmd,输入指令
ollama serve并挂在后台
做完以上准备后,就可以自由运行项目,自由修改了,c++端由qt运行,python由本地IDE运行 实际上,若本地IDE和qt打开的项目是同一个文件地址的话,它们修改和更新是同步进行的