Files
wiki/skills/jd-fapai-scrape/SKILL.md
T
liamandClaude Opus 4.6 e332d346f6 Add V6 stock strategy analysis and JD fapai scrape skill
- Add V6 strategy section to us-stock-trading-evaluation: fixes indicator
  dilution, SMA period hardcode, and stoploss tier issues; includes hyperopt
  results and backtest comparison
- Add jd-fapai-scrape skill: Playwright-based scraper for JD judicial auction
  properties with incremental update support

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-09-09 08:05:57 +00:00

124 lines
5.3 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
---
name: jd-fapai-scrape
description: 抓取京东法拍房搜索结果并支持增量更新。通过 Playwright 渲染京东法拍 H5 页面,拦截 API 响应,提取完整房源数据。支持项目链接、拍卖轮次、智能增量更新(遇到已知数据即停止,不全量下载)。
---
# 京东法拍房源抓取
## 用途
从京东司法拍卖频道搜索结果页抓取全部房源信息:
- 房源标题与地址(完整不截断)
- 项目链接(`https://m.jd.com/product/{skuId}.html`
- 起拍价 / 当前价 / 均价
- 户型 / 面积 / 用途 / 小区名称
- 拍卖轮次(一拍/二拍/变卖,从 API 标签或折扣率推断)
- 拍卖状态 / 出价次数 / 围观人数
- 拍卖开始与结束时间
- 增量追踪字段(`_first_seen` / `_last_seen`
## 前置条件
```bash
pip install playwright
python3 -m playwright install chromium
# 或 apt install chromium-browser
```
## 使用方法
### 首次抓取
```bash
# 默认抓取塘厦镇
python3 skills/jd-fapai-scrape/scrape.py
# 抓取东莞市全部法拍房(~4000 条,约 3 分钟)
python3 skills/jd-fapai-scrape/scrape.py --keyword 东莞市 --output-dir ../法拍/data
# 自定义参数
python3 skills/jd-fapai-scrape/scrape.py --keyword 长安 --sort-field 11 --cate-id 15
```
### 增量更新
```bash
# 加 -i 标志,只下载新房源,遇到已知 paimaiId 即停止
python3 skills/jd-fapai-scrape/scrape.py --keyword 东莞市 --output-dir ../法拍/data -i
```
增量模式的智能行为:
- 读取已有 `{keyword}_法拍房源.json` 中的所有 `paimaiId`
- 按最新发布排序加载(`spo_sortField=11`
- **每加载一批(~40 条)检查是否全部已知**,如果是则立即停止
- 典型增量更新只需加载 1-2 批(~30 秒),而非全量下载 100 批(~3 分钟)
- 新房源添加 `_first_seen``_last_seen` 时间戳
- 已有房源更新可变字段(当前价、状态、出价次数等)并刷新 `_last_seen`
## 去重机制
**去重 key = `paimaiId`(拍卖ID**
- 每次拍卖有唯一的 `paimaiId`,同一房产的一拍和二拍是不同的 `paimaiId`,各自保留
- 不会因为标题相同而合并不同拍卖轮次
- `paimaiId` 对应唯一的详情页 URL`https://m.jd.com/product/{skuId}.html`),等价于按 URL 去重
## 命令行参数
| 参数 | 默认值 | 说明 |
|------|--------|------|
| `--keyword` | 塘厦 | 搜索关键词 |
| `--cate-id` | 15 | 类目 ID15=法拍房) |
| `--sort-field` | 11 | 排序(11=最新发布) |
| `--max-scrolls` | 100 | 最大滚动次数 |
| `--output-dir` | . | 输出目录 |
| `--incremental` / `-i` | false | 增量更新模式 |
## 输出文件
| 文件 | 内容 |
|------|------|
| `{keyword}_法拍房源.csv` | CSV 表格(26 列,最新发布在前) |
| `{keyword}_法拍房源.json` | 完整原始 JSON(含增量追踪字段) |
| `{keyword}_增量日志.log` | 每次增量更新的新增/变更记录(仅增量模式) |
### CSV 列说明
| 列 | 说明 |
|----|------|
| 序号 / 拍卖ID / SKU ID | 唯一标识 |
| 标题 | 完整房产标题 |
| **项目链接** | `https://m.jd.com/product/{skuId}.html` |
| 位置 / 用途 / 户型 / 面积(㎡) / 小区 / 均价 | 房产属性 |
| 起拍价 / 当前价 / 折扣率 | 价格信息 |
| **拍卖轮次** | 一拍/二拍/变卖(API 标签或折扣率推断) |
| **标签** | 全部标签(诉讼资产、低于评估价等) |
| 状态 / 出价次数 / 围观人数 | 拍卖状态 |
| 开始时间 / 结束时间 | 拍卖时间 |
| 拍卖类型 | 司法拍卖等 |
| **首次发现** / **最后更新** | 增量追踪时间戳 |
## 工作原理
1. **Playwright 渲染**headless Chromium 打开京东法拍 H5 页面
2. **SSR 数据提取**:页面加载后从 `<script>` 标签中解析内嵌的 page 1 数据(约 40 条)
3. **API 拦截**:监听 `api.m.jd.com` 响应,捕获三个 API
- `getSearchData`appid=paimai)→ 房源列表 page 2+(标题、价格、户型、面积等)
- `getPaimaiCurrentInfoByIdsForApi` → 实时拍卖状态(当前价、出价、围观)
- `getAuctionLabelConfigs` → 拍卖标签(一拍/二拍/变卖等)
4. **无限滚动**:自动滚动触发加载更多
5. **智能停止**:增量模式下,检测到一批数据全部已知即停止(SSR page 1 和 API 各批都检查)
6. **拍卖轮次推断**:优先用 API 标签,无标签时从折扣率推断(7折≈一拍, 5.6折≈二拍/变卖)
7. **排序**:保持 API 返回顺序(spo_sortField=11 已按发布时间降序),不重新排序
8. **增量合并**:按 `paimaiId` 去重合并,新数据在前,旧数据在后
## 注意事项
- 京东法拍 API 有风控验证,必须通过浏览器渲染,无法直接调用 API
- 页面是 JS SPA,但第一页数据通过 SSR 内嵌在 HTML `<script>` 标签中,需单独提取
- API 只返回 page 2+,只拦截 API 会漏掉 page 1(包括最新发布的房源)
- URL 中的位置参数(`tttparams``spo_lat``spo_lng`)影响搜索结果范围
- API 每页约 40 条,东莞市全量约 4000 条(可能为 API 上限)
- 拍卖标签(一拍/二拍)仅对部分数据能从 API 获取,其余从折扣率推断
- 同一房产的多次拍卖(一拍流拍后二拍)有不同的 `paimaiId`,各自独立保留