# 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`)