一个基于 Next.js 构建的全栈应用,集成了智能批量采集和实时搜索功能,帮助用户发现全球远程工作机会。
- 自动化任务管理: 配置关键词和地区,自动批量采集LinkedIn职位数据
- 实时状态监控: 通过SSE实时展示采集进度和状态
- 智能去重机制: 避免重复采集,提高数据质量
- 灵活抓取配置: 三种抓取速度模式(快速/正常/安全)
- 数据持久化: 支持PostgreSQL数据库存储和本地缓存
- 任务状态管理: 支持启动、暂停、恢复、停止操作
- 实时搜索: 按关键词和地区搜索LinkedIn职位
- 智能排序: 按薪资、发布日期、公司名称等维度排序
- 高级筛选: 支持职位类型、经验等级、发布时间等多维度筛选
- 详情查看: 点击查看完整职位描述、薪资、申请人数等详细信息
- 响应式设计: 适配桌面和移动设备
- 职位数据标准化: 统一薪资格式、地理位置信息
- 技能标签提取: 自动识别技术栈和技能要求
- 薪资转换: 多币种薪资自动转换为美元年薪
- 数据质量控制: 重复数据检测和清理
- 框架: React 18 + Next.js 13
- 样式: Tailwind CSS + PostCSS
- 状态管理: React Hooks + Context API
- UI组件: 自定义组件库,支持拖拽排序 (@dnd-kit)
- 数据获取: Axios + React Query
- 实时通信: Server-Sent Events (SSE)
- API: Next.js API Routes
- 数据库: PostgreSQL + Prisma ORM
- 网络爬虫: Playwright (Chromium)
- 任务管理: 分布式任务队列系统
- 数据处理: 流式JSON处理 (stream-json)
- 主数据库: PostgreSQL (支持复杂查询和事务)
- 缓存系统: 本地JSON文件缓存
- 数据迁移: Prisma migrations
- 备份策略: 本地存储 + 数据库双重保障
- Node.js: 16.0.0 或更高版本
- 包管理器: npm, yarn 或 pnpm (推荐使用 pnpm)
- 数据库: PostgreSQL 12+ (可选,不配置时使用本地存储)
-
克隆仓库
git clone <your-repo-url> cd RemoteJobs
-
安装依赖
# 推荐使用 pnpm(更快、更省空间) pnpm install # 或使用其他包管理器 npm install # yarn install
-
安装 Playwright 浏览器 (必需步骤)
# 使用 pnpm pnpm exec playwright install # 使用 npm npx playwright install # 使用 yarn yarn playwright install
⚠️ 重要: 此步骤必不可少,否则爬虫功能无法工作 -
配置环境变量(可选)
# 复制环境变量模板 cp .env.example .env.local # 编辑环境变量文件,配置数据库连接 # DATABASE_URL="postgresql://username:password@localhost:5432/remotejobs" # DIRECT_URL="postgresql://username:password@localhost:5432/remotejobs"
-
初始化数据库(如果配置了数据库)
# 生成 Prisma 客户端 pnpm prisma:generate # 运行数据库迁移 pnpm prisma:migrate # 可选:初始化种子数据 pnpm prisma:seed
-
启动开发服务器
pnpm dev
-
访问应用
- 主页(实时搜索): http://localhost:3000
- 任务控制台(批量采集): http://localhost:3000/task-control
- 数据分析页面: http://localhost:3000/analysis
- 在主页输入职位关键词(如 "Frontend", "React", "Python")
- 选择地区或输入自定义地点
- 配置高级筛选条件(可选)
- 点击"搜索工作"按钮
- 查看搜索结果,支持多种排序和筛选方式
- 点击职位卡片查看详细信息
- 访问
/task-control页面 - 点击"配置搜索参数"按钮
- 配置关键词列表和目标国家/地区
- 设置搜索参数(结果阈值、去重选项等)
- 选择抓取速度模式
- 点击"开始任务"启动批量采集
- 通过实时状态监控查看采集进度
- 访问
/analysis页面 - 查看已采集的职位数据统计
- 使用虚拟化列表浏览大量数据
- 应用筛选条件分析特定数据子集
RemoteJobs/
├── components/ # React 组件
│ ├── analysis/ # 数据分析相关组件
│ ├── home/ # 主页搜索组件
│ ├── shared/ # 共享组件
│ └── task/ # 任务管理组件
├── pages/ # Next.js 页面
│ ├── api/ # API 路由
│ ├── index.js # 主页(实时搜索)
│ ├── task-control.js # 任务控制页面
│ └── analysis.js # 数据分析页面
├── utils/ # 工具函数
│ ├── cleanjob/ # 数据清洗工具
│ ├── taskManager.js # 任务管理核心
│ ├── salaryConverter.js # 薪资转换
│ └── regions.js # 地区配置
├── prisma/ # 数据库相关
│ ├── schema.prisma # 数据库模式
│ └── migrations/ # 数据库迁移
├── scripts/ # 辅助脚本
└── data/ # 本地数据缓存
问题: Executable doesn't exist 错误
解决方案:
# 重新安装 Playwright 浏览器
pnpm exec playwright install
# 或
npx playwright install问题: Playwright 版本兼容性问题 解决方案:
# 更新相关依赖
pnpm update playwright playwright-core
# 重新安装浏览器
pnpm exec playwright install问题: 数据库连接失败 解决方案:
- 确保 PostgreSQL 服务正在运行
- 检查
.env.local中的数据库连接字符串 - 如果不想使用数据库,可以不配置环境变量,系统会自动使用本地存储
问题: Prisma 客户端生成失败 解决方案:
# 清理并重新生成
rm -rf node_modules/.prisma
pnpm prisma:generate问题: 频繁被 LinkedIn 限制 解决方案:
- 调整抓取速度为"安全模式"
- 减少并发请求数量
- 增加请求间隔时间
- 考虑使用代理IP
问题: 内存占用过高 解决方案:
- 适当减少批量处理的数据量
- 定期清理本地缓存数据
- 监控系统资源使用情况
-
构建镜像
docker build -t remotejobs . -
运行容器
docker run -p 3000:3000 --env-file .env.local remotejobs
# 启动应用和数据库
docker-compose up -d
# 运行数据库迁移
docker-compose exec app pnpm prisma:migrate支持部署到以下平台:
- Render: 使用
render.yaml配置文件 - Fly.io: 使用
fly.toml配置文件 - Vercel: 需要配置环境变量和数据库
- Fork 项目
- 创建特性分支 (
git checkout -b feature/AmazingFeature) - 提交更改 (
git commit -m 'Add some AmazingFeature') - 推送到分支 (
git push origin feature/AmazingFeature) - 创建 Pull Request
项目包含以下主要数据模型:
- Job: 基础职位信息
- JobClean: 清洗后的标准化职位数据
- TaskProgress: 任务进度跟踪
- SearchConfig: 搜索配置管理
- ExchangeRate: 汇率数据
本项目采用 MIT 许可证 - 查看 LICENSE 文件了解详情
- 本项目仅供学习和研究目的使用
- 请遵守 LinkedIn 的服务条款和 robots.txt 规则
- 建议合理控制请求频率,避免对目标网站造成过大负担
- 用户需自行承担使用本项目可能产生的风险和责任
感谢以下开源项目:
- Next.js - React 全栈框架
- Playwright - 浏览器自动化工具
- Prisma - 数据库ORM
- Tailwind CSS - CSS 框架