抓取 TradeMe 新西兰房产数据,存储到 PostgreSQL(trademe 模式)。
- Python 3.8+
- PostgreSQL 12+
pip install psycopg2-binary beautifulsoup4编辑 config.ini:
[database]
host = 127.0.0.1
port = 5432
dbname = postgres
user = postgres
password = your_password| 项目 | 说明 |
|---|---|
| API | /v1/search/flatmates.json |
| 表名 | trademe.flatmates_wanted |
| 每页 | 100 条 |
| 用途 | 搜索列表数据抓取 |
python trademe_flatmates_wanted.py| 项目 | 说明 |
|---|---|
| API | /v1/search/property/residential.json |
| 表名 | trademe.for_sale |
| 每页 | 100 条 |
| 用途 | 搜索列表数据抓取 |
python trademe_for_sale.py| 项目 | 说明 |
|---|---|
| API | /v1/search/property/rental.json |
| 表名 | trademe.for_rent |
| 每页 | 100 条 |
| 用途 | 搜索列表数据抓取 |
python trademe_for_rent.py抓取详情页 HTML 提取 page_views,多线程执行。
| 项目 | 说明 |
|---|---|
| 请求地址 | https://www.trademe.co.nz/a/property/flatmates-wanted/listing/{listing_id} |
| 表名 | trademe.flatmates_wanted |
| 更新字段 | page_views BIGINT |
| 解析方式 | BeautifulSoup div.tm-property-listing__listing-metadata-page-views |
| 并发 | 5 线程 |
python trademe_flatmates_wanted_detail.py同时抓取详情页浏览量和学校学区数据,多线程执行。
详情页
- 地址:
https://www.trademe.co.nz/a/property/residential/rent/listing/{listing_id} - 更新
trademe.for_rent.page_views
学区 API
- 地址:
https://api.trademe.co.nz/v1/listings/{listing_id}/schools.json - 写入
trademe.for_rent_school表
python trademe_for_rent_detail.py| 列名 | 类型 | 说明 |
|---|---|---|
| listing_id | BIGINT PK | 房源 ID |
| title | TEXT | 标题 |
| category | TEXT | 分类 |
| start_price | INTEGER | 起拍价 |
| start_date | TIMESTAMPTZ | 开始日期 |
| end_date | TIMESTAMPTZ | 结束日期 |
| is_featured | BOOLEAN | 是否精选 |
| has_gallery | BOOLEAN | 是否有图库 |
| as_at | TIMESTAMPTZ | 数据时间戳 |
| category_path | TEXT | 分类路径 |
| picture_href | TEXT | 缩略图 URL |
| region_id / region | INTEGER / TEXT | 大区 |
| suburb_id / suburb | INTEGER / TEXT | 郊区 |
| reserve_state | INTEGER | 保留价状态 |
| is_classified | BOOLEAN | 是否分类广告 |
| open_homes | JSONB | 开放日时间 |
| geographic_location | JSONB | 经纬度坐标 |
| price_display | TEXT | 价格展示文本 |
| photo_urls | JSONB | 照片 URL 数组 |
| additional_data | JSONB | 额外标签数据 |
| canonical_path | TEXT | 规范路径 |
| member_id | INTEGER | 发布者 ID |
| district | TEXT | 行政区域 |
| available_from | TEXT | 可入住时间 |
| bathrooms / bedrooms | INTEGER | 卫浴 / 卧室数 |
| best_contact_time | TEXT | 最佳联系时间 |
| parking | TEXT | 停车信息 |
| pets_okay | INTEGER | 是否允许宠物 |
| property_type | TEXT | 房产类型 |
| rent_per_week | NUMERIC | 周租金 |
| smokers_okay | INTEGER | 是否允许吸烟 |
| whiteware | TEXT | 家具情况 |
| adjacent_suburb_names | JSONB | 附近郊区名数组 |
| adjacent_suburb_ids | JSONB | 附近郊区 ID 数组 |
| district_id | INTEGER | 区域 ID |
| agency | JSONB | 中介信息 |
| property_search_tags | JSONB | 搜索标签 |
| flatmates | INTEGER | 室友数 |
| current_flatmates | TEXT | 当前室友描述 |
| couples_okay | INTEGER | 是否接受情侣 |
| additional_costs | TEXT | 额外费用 |
| page_views | BIGINT | 页面浏览量 |
| created_at | TIMESTAMPTZ | 创建时间 |
| 列名 | 类型 | 说明 |
|---|---|---|
| listing_id | BIGINT PK | 房源 ID |
| title | TEXT | 标题 |
| category | TEXT | 分类 |
| start_price | INTEGER | 起拍价 |
| start_date / end_date | TIMESTAMPTZ | 起止日期 |
| is_featured / has_gallery / is_bold / is_highlighted | BOOLEAN | 广告标记 |
| as_at | TIMESTAMPTZ | 数据时间戳 |
| category_path / picture_href | TEXT | 分类路径 / 图片 |
| region / suburb / district | TEXT | 地理位置 |
| address | TEXT | 街道地址 |
| area | NUMERIC | 室内面积 (m²) |
| bathrooms / bedrooms | INTEGER | 卫浴 / 卧室 |
| parking / total_parking | TEXT / INTEGER | 停车信息 |
| property_type | TEXT | 房产类型 |
| agency | JSONB | 中介(含 Branding、Agents) |
| has_embedded_video | BOOLEAN | 是否有嵌入视频 |
| listing_extras | JSONB | 额外标记数组 |
| listing_group | TEXT | 分组 |
| premium_package_code | TEXT | 高级套餐 |
| property_sale_info | JSONB | 销售信息 |
| created_at | TIMESTAMPTZ | 创建时间 |
其余共有字段与 flatmates_wanted 一致。
与 for_sale 结构类似,差异字段:
| 列名 | 类型 | 说明 |
|---|---|---|
| agency_reference | TEXT | 中介参考编号 |
| available_from | TEXT | 可入住日期 |
| best_contact_time | TEXT | 最佳联系时间 |
| max_tenants | INTEGER | 最大租客数 |
| pets_okay | INTEGER | 宠物策略 |
| rent_per_week | NUMERIC | 周租金 |
| smokers_okay | INTEGER | 吸烟策略 |
| whiteware | TEXT | 家具情况 |
| page_views | BIGINT | 页面浏览量 |
学区数据,复合主键 (listing_id, school_id)。
| 列名 | 类型 | 说明 |
|---|---|---|
| listing_id | BIGINT | 房源 ID |
| school_id | INTEGER | 学校 ID |
| name | TEXT | 学校名称 |
| location | JSONB | 经纬度 {Latitude, Longitude} |
| street_address | TEXT | 街道地址 |
| suburb | TEXT | 郊区 |
| city_district | TEXT | 城市区域 |
| post_code | TEXT | 邮编 |
| institution_type | TEXT | 学校类型(Primary / Intermediate / Secondary) |
| authority | TEXT | 公立/私立 |
| school_roll | INTEGER | 学生人数 |
| gender | INTEGER | 性别类型 |
| gender_description | TEXT | 性别描述 |
| age_groups | JSONB | 年级组数组 |
| zones | JSONB | 学区边界多边形 |
| distance_from_property | INTEGER | 距房源距离 (m) |
| zoning_calculated | BOOLEAN | 是否已计算学区 |
| created_at | TIMESTAMPTZ | 创建时间 |
- Gzip 解压:自动处理响应压缩
- 重试机制:网络异常自动重试 3 次(指数退避)
- 增量更新:
ON CONFLICT ... DO UPDATE避免重复 - 多线程:详情爬虫使用 5 线程并发
- 断点续爬:只处理
page_views IS NULL的记录