Use this skill for PropertyGuru Singapore search results pages when the job is to collect roughly 50 listing cards from one filtered search URL.
This target is browser-backed.
403.__NEXT_DATA__ is available.This skill depends on playwright.
{baseDir}/references/source-notes.md.window.__NEXT_DATA__.props.pageProps.pageData.pageData.data.listingsData as the canonical listing collection for that page.listingsData, use listingData.id as the stable dedupe key.listingData object whenever possible.source_urlpagecollected_atlisting_idpaginationData.currentPage >= paginationData.totalPageslistingsData is emptyPrefer:
window.__NEXT_DATA__.props.pageProps.pageData.data.listingsData
Related pagination data:
window.__NEXT_DATA__.props.pageProps.pageData.data.paginationData
Useful search context:
window.__NEXT_DATA__.props.pageProps.pageData.searchParams
Prefer keeping the raw listing payload plus a few convenience fields:
{
"source_url": "https://www.propertyguru.com.sg/property-for-sale?listingType=sale&page=1&isCommercial=false&maxPrice=1400000",
"page": 1,
"collected_at": "2026-03-18T04:40:00Z",
"listing_id": 500044843,
"raw": {
"id": 500044843,
"localizedTitle": "780B Woodlands Crescent",
"url": "https://www.propertyguru.com.sg/listing/hdb-for-sale-780b-woodlands-crescent-500044843",
"price": {
"value": 500000,
"pretty": "S$ 500,000"
},
"bedrooms": 2,
"bathrooms": 2
}
}
If the caller wants a flatter convenience export, these fields are usually available:
listingData.idlistingData.localizedTitlelistingData.urllistingData.price.valuelistingData.price.prettylistingData.area.localeStringValuelistingData.bedroomslistingData.bathroomslistingData.fullAddresslistingData.propertylistingData.psfTextlistingData.postedOnlistingData.agentlistingData.agencylistingData.mrtlistingData.isVerifiedcurl, plain HTTP, or static HTML parsing as the primary strategy.listingsData for the main dataset.listingData.id.Default target: about 50 unique listings.
__NEXT_DATA__ before changing extraction logic.共 1 个版本