|
|
@@ -0,0 +1,221 @@
|
|
|
+# spides — 淘宝 / 京东 / 药房网爬虫
|
|
|
+
|
|
|
+PC 端浏览器自动化 + API 采集,覆盖三个电商平台。
|
|
|
+
|
|
|
+## 目录结构
|
|
|
+
|
|
|
+```
|
|
|
+spides/
|
|
|
+├── start_run_taobao.py # 淘宝入口
|
|
|
+├── start_run_jd.py # 京东入口
|
|
|
+├── start_run_yaofangwang.py # 药房网入口
|
|
|
+│
|
|
|
+├── spiders/
|
|
|
+│ ├── taobao/
|
|
|
+│ │ ├── taobao_crawl.py # 淘宝 API 爬虫(mtop 接口)
|
|
|
+│ │ ├── taobao_login.py # DrissionPage 登录 / Cookie 刷新
|
|
|
+│ │ ├── snapshot_taobao_crawl2.py# 快照模式 v2
|
|
|
+│ │ └── snapshot_taobao_login.py # 快照登录
|
|
|
+│ ├── jd/
|
|
|
+│ │ ├── jd_auto_crawl.py # 京东浏览器爬虫
|
|
|
+│ │ ├── jd_auto_crawl_snap2.py # 快照模式 v2
|
|
|
+│ │ └── jd_captcha.py # 京东验证码处理
|
|
|
+│ └── yaofangwang/
|
|
|
+│ └── yaofangwang_crawl.py # 药房网浏览器爬虫
|
|
|
+│
|
|
|
+├── commons/ # 共用基础设施
|
|
|
+│ ├── scheduler.py # 爬虫调度器(心跳 + 任务拉取)
|
|
|
+│ ├── collect_schedule_runner.py # 通用采集调度循环
|
|
|
+│ ├── conn_mysql.py # MySQL 连接池
|
|
|
+│ ├── feishu_webhook.py # 飞书通知
|
|
|
+│ ├── config.py # 设备 ID / 账号配置
|
|
|
+│ ├── Logger.py # 日志
|
|
|
+│ └── sql_data.py # SQL 辅助
|
|
|
+│
|
|
|
+├── pipelines/
|
|
|
+│ └── drug_pipelines.py # 数据管道(入库 + OSS 上传)
|
|
|
+├── oss_upload/
|
|
|
+│ └── oss_upload.py # 阿里云 OSS 图片上传
|
|
|
+└── area_info/
|
|
|
+ ├── city_name_to_id.py # 城市名称 → ID 映射
|
|
|
+ └── city_name_to_id_2.py
|
|
|
+```
|
|
|
+
|
|
|
+---
|
|
|
+
|
|
|
+## 1. 淘宝(platform=1)
|
|
|
+
|
|
|
+### 启动
|
|
|
+
|
|
|
+```bash
|
|
|
+cd spides
|
|
|
+python start_run_taobao.py
|
|
|
+```
|
|
|
+
|
|
|
+### 技术方案
|
|
|
+
|
|
|
+- **API 采集**:调用淘宝 mtop 接口 `h5api.m.taobao.com`,无需浏览器渲染商品列表
|
|
|
+- **登录**:DrissionPage 浏览器自动化获取 Cookie,Cookie 有效期 3600 秒
|
|
|
+- **请求库**:`curl_cffi`(模拟 Chrome TLS 指纹防反爬)
|
|
|
+
|
|
|
+### 运行流程
|
|
|
+
|
|
|
+```
|
|
|
+while True:
|
|
|
+ 1. CrawlerScheduler.start() → 启动后台心跳线程
|
|
|
+ 2. 从调度 API 拉取任务(药品关键词 + 品牌 + 规格)
|
|
|
+ 3. TaobaoCrawl(task).run():
|
|
|
+ a. 检查/刷新 Cookie
|
|
|
+ b. 搜索页 API 请求(翻页最多 20 页)
|
|
|
+ c. 每页获取商品列表,递归提取产品名称
|
|
|
+ d. DrugPipeline 入库 + OSS 上传商品图
|
|
|
+ 4. 飞书通知采集结果
|
|
|
+ 5. 休眠 20~30 分钟
|
|
|
+```
|
|
|
+
|
|
|
+### 关键配置
|
|
|
+
|
|
|
+| 项 | 值 |
|
|
|
+|----|-----|
|
|
|
+| 平台 ID | 1 |
|
|
|
+| mtop AppKey | 12574478 |
|
|
|
+| 最大翻页 | 20 |
|
|
|
+| Cookie 有效期 | 3600 秒 |
|
|
|
+| 重试次数 | 3 |
|
|
|
+| 调度间隔 | 1200~1800 秒 |
|
|
|
+
|
|
|
+
|
|
|
+---
|
|
|
+
|
|
|
+## 2. 京东(platform=2)
|
|
|
+
|
|
|
+### 启动
|
|
|
+
|
|
|
+```bash
|
|
|
+cd spides
|
|
|
+python start_run_jd.py
|
|
|
+```
|
|
|
+
|
|
|
+### 技术方案
|
|
|
+
|
|
|
+- **DrissionPage 浏览器自动化**:操控 Chrome 搜索 → 翻页 → 提取商品
|
|
|
+- **任务来源**:调度 API `http://192.168.2.246:8080/api/collect_task/pull`
|
|
|
+- **翻页方式**:JS 检测"下一页"按钮是否在视口内,自动点击
|
|
|
+
|
|
|
+### 运行流程
|
|
|
+
|
|
|
+```
|
|
|
+while True:
|
|
|
+ 1. CrawlerScheduler.start() → 后台心跳
|
|
|
+ 2. API 拉取最新任务
|
|
|
+ 3. JdCrawlerV2(task).run():
|
|
|
+ a. 浏览器打开京东 → 搜索关键词
|
|
|
+ b. 逐页翻页,每页提取商品列表
|
|
|
+ c. 支持省份切换(area_info 城市映射)
|
|
|
+ d. DrugPipeline 入库 + OSS 上传
|
|
|
+ 4. spider_schedule.stop()
|
|
|
+ 5. 休眠 60 秒
|
|
|
+```
|
|
|
+
|
|
|
+### 关键配置
|
|
|
+
|
|
|
+| 项 | 值 |
|
|
|
+|----|-----|
|
|
|
+| 平台 ID | 2 |
|
|
|
+| 浏览器路径 | `C:\Program Files\Google\Chrome\Application\chrome.exe` |
|
|
|
+| 采集超时 | 5s(首屏)/ 6s(滚动) |
|
|
|
+| 调度间隔 | 60 秒 |
|
|
|
+
|
|
|
+### 注意
|
|
|
+
|
|
|
+- 需要 Chrome 浏览器和 DrissionPage
|
|
|
+
|
|
|
+---
|
|
|
+
|
|
|
+## 3. 药房网(platform=11)
|
|
|
+
|
|
|
+### 启动
|
|
|
+
|
|
|
+```bash
|
|
|
+cd spides
|
|
|
+python start_run_yaofangwang.py
|
|
|
+```
|
|
|
+
|
|
|
+### 技术方案
|
|
|
+
|
|
|
+- **DrissionPage 浏览器自动化**:直接打开 yaofangwang.com 搜索
|
|
|
+- **任务来源**:代码内置固定任务列表(TASK_LIST),也可通过 CrawlerScheduler 拉取
|
|
|
+
|
|
|
+### 运行流程
|
|
|
+
|
|
|
+```
|
|
|
+while True:
|
|
|
+ 1. CrawlerScheduler.start() → 后台心跳
|
|
|
+ 2. get_task() 拉取任务(或 TASK_LIST 兜底)
|
|
|
+ 3. YaofangwangCrawl(task).run():
|
|
|
+ a. 浏览器打开药房网,搜索药品
|
|
|
+ b. 翻页提取商品详情(最多 100 页)
|
|
|
+ c. 解析价格、标题、规格
|
|
|
+ d. DrugPipeline 入库 + OSS 上传
|
|
|
+ 4. spider_schedule.stop()
|
|
|
+ 5. 休眠 30 秒
|
|
|
+```
|
|
|
+
|
|
|
+### 关键配置
|
|
|
+
|
|
|
+| 项 | 值 |
|
|
|
+|----|-----|
|
|
|
+| 平台 ID | 11 |
|
|
|
+| 最大翻页 | 100 |
|
|
|
+| 页间等待 | 2~4 秒 |
|
|
|
+| 域名 | yaofangwang.com |
|
|
|
+
|
|
|
+---
|
|
|
+
|
|
|
+## 共用基础设施
|
|
|
+
|
|
|
+### CrawlerScheduler(`commons/scheduler.py`)
|
|
|
+
|
|
|
+心跳 + 任务拉取的调度器基类,被三个平台入口共用。
|
|
|
+
|
|
|
+```python
|
|
|
+scheduler = CrawlerScheduler(device_id, platform_id)
|
|
|
+scheduler.start() # 启动后台心跳线程(默认 30s 间隔)
|
|
|
+task = scheduler.get_task() # 拉取待执行任务
|
|
|
+scheduler.stop() # 停止心跳
|
|
|
+```
|
|
|
+
|
|
|
+**心跳地址:** `http://pricesys.kailin.com.cn:8083/api/collect_task/heartbeat`
|
|
|
+
|
|
|
+### CollectScheduleRunner(`commons/collect_schedule_runner.py`)
|
|
|
+
|
|
|
+通用采集调度循环,封装"拉任务 → 跑爬虫 → 上报状态 → 飞书通知"的完整流程。
|
|
|
+
|
|
|
+```python
|
|
|
+run_scheduled_loop("平台名", platform_id, SpiderClass)
|
|
|
+```
|
|
|
+
|
|
|
+### DrugPipeline(`pipelines/drug_pipelines.py`)
|
|
|
+
|
|
|
+统一数据出口:商品信息入库(`retrieve_scrape_data`)+ 商品图片上传 OSS。
|
|
|
+
|
|
|
+---
|
|
|
+
|
|
|
+## 依赖
|
|
|
+
|
|
|
+```bash
|
|
|
+pip install DrissionPage curl_cffi lxml pymysql oss2 requests
|
|
|
+```
|
|
|
+
|
|
|
+- Chrome 浏览器(淘宝仅需登录时,京东和药房网全程需要)
|
|
|
+- MySQL 数据库 `drug_retrieve`
|
|
|
+- 阿里云 OSS
|
|
|
+
|
|
|
+---
|
|
|
+
|
|
|
+## 注意事项
|
|
|
+
|
|
|
+- `spides/commons/config.py` 含药师帮/壹药城明文密码,不要提交公开仓库
|
|
|
+- 京东 `start_run_jd.py` 有两个 `get_task()` 定义,第二个覆盖第一个
|
|
|
+- 淘宝 `start_run_taobao.py` 内 `TB_DEVICE_ID = '17'` 覆盖 config 导入
|
|
|
+- 药房网 `start_run_yaofangwang.py` 缺少 `import time`(但代码内用了 `time.sleep`)
|