Skip to content

ChesterNotChest/Crawler

Repository files navigation

Crawler 项目

一个基于Qt 6.9的低标准网页爬虫工具,支持非并发任务处理、数据库存储和SQL查询。

📋 项目特性

  • Qt 6 框架 - 使用Qt 6.9进行GUI开发
  • HTTP 请求 - 基于libcurl库实现网络爬取
  • JSON 处理 - 使用nlohmann-json进行数据解析
  • 数据库支持 - SQLite数据库集成,支持任务和结果存储
  • 配置管理 - config.json统一管理

🔐 Cookie管理方案

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"
  }
}
  1. 程序自动使用
    • 程序启动时自动加载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    │
    │  (爬虫核心)      │    │   (数据库/存储)  │         │    服务  │
    └──────────────────┘   └──────────────────┘         └──────────┘

数据来源与SQL对齐


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.6b

5·每次启动项目记得打开cmd,输入指令

ollama serve

并挂在后台

做完以上准备后,就可以自由运行项目,自由修改了,c++端由qt运行,python由本地IDE运行 实际上,若本地IDE和qt打开的项目是同一个文件地址的话,它们修改和更新是同步进行的

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Contributors 2

  •  
  •