name: sg-property-scraper description: 使用灵活筛选条件搜索新加坡房产租赁和销售房源。当被要求搜索新加坡房产、查找租赁或销售房源、检查地铁站附近的房产价格或比较通勤时间时使用。支持按房源类型(租赁/销售)、房产类型(组屋/公寓/有地住宅)、卧室数量、浴室数量、价格范围、面积、竣工年份、地铁站代码、距地铁站距离、房间类型、可用性以及到目的地的通勤时间进行筛选。将JSON输出到标准输出。 metadata: {“openclaw”:{“requires”:{“bins”:[“python3”]},“primaryEnv”:“GOOGLE_MAPS_API_KEY”}}
新加坡房产爬虫
通过HTTP请求抓取新加坡房产房源。返回结构化JSON。
脚本位置
scripts/scrape.py
相对于此SKILL目录。运行方式:
python3 <SKILL_DIR>/scripts/scrape.py [选项]
依赖项
- Python 3.8+
pip install curl_cffi beautifulsoup4 lxml- 可选:
GOOGLE_MAPS_API_KEY环境变量用于计算通勤时间(Google Routes API)
快速开始
# 搜索环线附近月租低于4000新元的2卧公寓
python3 scripts/scrape.py \
--listing-type rent --bedrooms 2 --max-price 4000 \
--property-type-group N --mrt-range CC:20-24 \
--output json
# JSON输入模式(更适合AI工具)
python3 scripts/scrape.py --json '{
"listingType": "rent",
"bedrooms": 2,
"maxPrice": 4000,
"propertyTypeGroup": ["N"],
"mrtStations": ["CC20","CC21","CC22","CC23","CC24"]
}'
# 试运行:仅打印URL而不抓取
python3 scripts/scrape.py --dry-run --listing-type rent --bedrooms 3
筛选参数
| 标志 | URL参数 | 类型 | 描述 |
|---|---|---|---|
--listing-type |
listingType |
字符串 | rent 或 sale |
--property-type-group |
propertyTypeGroup |
字符串(可重复) | N=公寓,L=有地住宅,H=组屋 |
--entire-unit-or-room |
entireUnitOrRoom |
字符串 | ent 仅限整套单位;省略则显示所有 |
--room-type |
roomType |
字符串(可重复) | master(主人房),common(普通房),shared(共享房) |
--bedrooms |
bedrooms |
整数 | -1=房间,0=单间公寓,1-5 |
--bathrooms |
bathrooms |
整数 | 浴室数量 |
--min-price |
minPrice |
整数 | 最低价格(新元) |
--max-price |
maxPrice |
整数 | 最高价格(新元) |
--min-size |
minSize |
整数 | 最小面积(平方英尺) |
--max-size |
maxSize |
整数 | 最大面积(平方英尺) |
--min-top-year |
minTopYear |
整数 | 最低竣工年份 |
--max-top-year |
maxTopYear |
整数 | 最高竣工年份 |
--distance-to-mrt |
distanceToMRT |
浮点数 | 距地铁站最大距离(公里)(例如 0.5,0.75) |
--availability |
availability |
整数 | 可用性筛选 |
--mrt-station |
mrtStations |
字符串(可重复) | 地铁站代码,例如 CC20 |
--mrt-range |
mrtStations |
字符串(可重复) | 地铁站范围,例如 CC:20-24 |
--sort |
sort |
字符串 | date(日期),price(价格),psf(每平方英尺价格),size(面积) |
--order |
order |
字符串 | asc(升序),desc(降序) |
--commute-to |
commuteTo |
字符串 | 用于计算通勤时间的目的地地址(需要 GOOGLE_MAPS_API_KEY) |
卧室/房间逻辑
--entire-unit-or-room ent --bedrooms 4= 4卧整套单位--entire-unit-or-room ent --bedrooms 0= 单间公寓--bedrooms -1 --room-type master --room-type common= 房间租赁(主人房或普通房)- 省略
--entire-unit-or-room以同时显示整套单位和房间
地铁站语法
- 单个车站:
--mrt-station CC20 - 范围(同一线路):
--mrt-range CC:20-24(扩展为 CC20, CC21, CC22, CC23, CC24) - 多条线路:使用多个标志
- 在JSON中:
"mrtStations": ["CC20", "EW15"]或[["CC", [20, 24]]](元组格式)
有关约213个有效地铁站代码的完整列表,请参阅 references/params.md。
执行参数
| 标志 | 描述 |
|---|---|
--pages N |
要抓取的页数(默认:1) |
--dry-run |
构建并打印URL,跳过抓取 |
--no-validate |
跳过参数验证 |
--timeout N |
HTTP请求超时时间(秒)(默认:30) |
--raw-param K=V |
额外的URL查询参数(可重复) |
--output json|text|none |
输出格式(默认:管道传输时为json) |
--verbose |
详细日志输出到标准错误 |
JSON输入模式
使用 --json 将筛选条件作为JSON字符串传递。键使用与URL参数名称匹配的驼峰命名法:
python3 scripts/scrape.py --json '{
"listingType": "rent",
"propertyTypeGroup": ["N"],
"bedrooms": 2,
"bathrooms": 2,
"maxPrice": 4000,
"mrtStations": ["EW16", "EW17", "EW18"],
"distanceToMRT": 0.75,
"minTopYear": 1990
}'
或从文件加载:--config filters.json
输出格式
标准输出上的JSON数组(若无结果则为空 []):
[
{
"id": "23744236",
"name": "Kingsford Waterbay",
"price": "S$ 3,900 /mo",
"psf": "S$ 4.53 psf",
"address": "68 Upper Serangoon View",
"bedrooms": "2",
"bathrooms": "2",
"area": "861 sqft",
"type": "Condominium",
"built": "Built: 2018",
"availability": "Ready to Move",
"mrt_distance": "14 min (1.15 km) from SE4 Kangkar LRT Station",
"list_date": "Listed on Feb 15, 2026 (2d ago)",
"agent": "May Chong",
"agency": "PROPNEX REALTY PTE. LTD.",
"headline": "Perfect work from home unit, river facing, unblocked high floor cozy",
"link": "https://www.propertyguru.com.sg/listing/for-rent-kingsford-waterbay-23744236",
"commute_driving": "25 mins",
"commute_transit": "45 mins"
}
]
退出代码
0:成功,找到结果1:错误(参数错误,抓取失败)2:成功但未找到房源
代理使用说明
当从AI代理调用此脚本时:
- 使用
--output json获取结构化输出(管道传输时默认) - 使用
--json标志比单独使用CLI标志更容易传递参数 - 使用
--dry-run在抓取前预览搜索URL - 如果用户需要更多结果,使用
--pages N(每页约有20个房源) - 使用
--commute-to和目的地地址计算每个房源的通勤时间(驾车+公共交通)。需要GOOGLE_MAPS_API_KEY环境变量。如果未设置密钥,则静默省略通勤字段。 - 当API密钥缺失或计算失败时,
commute_driving和commute_transit字段为空字符串""