全流程测试
This commit is contained in:
parent
bd8aed9f4f
commit
c458341633
3
.gitignore
vendored
3
.gitignore
vendored
@ -25,7 +25,8 @@ pids/
|
||||
.yarn-integrity
|
||||
|
||||
# dotenv environment variables file
|
||||
.env
|
||||
.env.local
|
||||
.env.*.local
|
||||
|
||||
# OS files
|
||||
.DS_Store
|
||||
|
||||
@ -41,12 +41,12 @@
|
||||
│ ├── index.html # 主页面
|
||||
│ ├── style.css # 样式
|
||||
│ ├── app.js # 前端逻辑
|
||||
│ └── define.js # 数据定义
|
||||
├── scripts/ # 后端脚本
|
||||
│ ├── daily.js # 完整爬取流程
|
||||
│ └── screenshot.js # 仅截图
|
||||
├── public/ # 公共资源
|
||||
│ └── extract.js # 数据提取逻辑
|
||||
│ └── define.js # 数据定义
|
||||
├── server.js # Web 服务器
|
||||
├── package.json # 项目配置
|
||||
└── README.md # 本文件
|
||||
|
||||
307
data/2026-03-23.json
Normal file
307
data/2026-03-23.json
Normal file
@ -0,0 +1,307 @@
|
||||
{
|
||||
"date": "2026-03-23",
|
||||
"timestamp": 1774233229501,
|
||||
"source": "http://bjjs.zjw.beijing.gov.cn/eportal/ui?pageId=307749",
|
||||
"data": {
|
||||
"spfsjtj": {
|
||||
"ksqf": {
|
||||
"kspf_total_units": "89040",
|
||||
"kspf_total_area": "7571859.5700",
|
||||
"kspf_residential_units": "39888",
|
||||
"kspf_residential_area": "5511182.5200",
|
||||
"kspf_commercial_units": "214",
|
||||
"kspf_commercial_area": "159917.8800",
|
||||
"kspf_office_units": "533",
|
||||
"kspf_office_area": "517721.2300",
|
||||
"kspf_parking_units": "39286",
|
||||
"kspf_parking_area": "1081054.5200"
|
||||
},
|
||||
"ysxk": {
|
||||
"ysxk_license_count": "8",
|
||||
"ysxk_total_area": "314659.9000",
|
||||
"ysxk_residential_units": "2020",
|
||||
"ysxk_residential_area": "264160.8100",
|
||||
"ysxk_commercial_units": "0",
|
||||
"ysxk_commercial_area": "0.0000",
|
||||
"ysxk_office_units": "0",
|
||||
"ysxk_office_area": "0.0000",
|
||||
"ysxk_parking_units": "1384",
|
||||
"ysxk_parking_area": "38546.2200"
|
||||
},
|
||||
"qfrg": {
|
||||
"qfrg_total_units": "57",
|
||||
"qfrg_total_area": "6659.5600",
|
||||
"qfrg_residential_units": "53",
|
||||
"qfrg_residential_area": "6550.1200",
|
||||
"qfrg_commercial_units": "0",
|
||||
"qfrg_commercial_area": "0.0000",
|
||||
"qfrg_office_units": "0",
|
||||
"qfrg_office_area": "0.0000",
|
||||
"qfrg_parking_units": "3",
|
||||
"qfrg_parking_area": "88.2900"
|
||||
},
|
||||
"qfqy": {
|
||||
"qfqy_total_units": "70",
|
||||
"qfqy_total_area": "6102.5800",
|
||||
"qfqy_residential_units": "49",
|
||||
"qfqy_residential_area": "5618.9100",
|
||||
"qfqy_commercial_units": "0",
|
||||
"qfqy_commercial_area": "0.0000",
|
||||
"qfqy_office_units": "0",
|
||||
"qfqy_office_area": "0.0000",
|
||||
"qfqy_parking_units": "17",
|
||||
"qfqy_parking_area": "380.8600"
|
||||
},
|
||||
"wyxf": {
|
||||
"wyxf_total_units": "212494",
|
||||
"wyxf_total_area": "11397185.3200",
|
||||
"wyxf_residential_units": "29974",
|
||||
"wyxf_residential_area": "3409421.6900",
|
||||
"wyxf_commercial_units": "1738",
|
||||
"wyxf_commercial_area": "797406.8600",
|
||||
"wyxf_office_units": "4427",
|
||||
"wyxf_office_area": "1544716.4200",
|
||||
"wyxf_parking_units": "124128",
|
||||
"wyxf_parking_area": "4148777.9000"
|
||||
},
|
||||
"xfxm": {
|
||||
"xfxm_project_count": "39917",
|
||||
"xfxm_total_area": "279541202.2700",
|
||||
"xfxm_residential_units": "937787",
|
||||
"xfxm_residential_area": "116845842.5300",
|
||||
"xfxm_commercial_units": "96928",
|
||||
"xfxm_commercial_area": "23085554.9600",
|
||||
"xfxm_office_units": "134740",
|
||||
"xfxm_office_area": "25167845.3100",
|
||||
"xfxm_parking_units": "828373",
|
||||
"xfxm_parking_area": "31600058.2600"
|
||||
},
|
||||
"xfrg": {
|
||||
"xfrg_total_units": "41",
|
||||
"xfrg_total_area": "4229.3500",
|
||||
"xfrg_residential_units": "37",
|
||||
"xfrg_residential_area": "4132.3900",
|
||||
"xfrg_commercial_units": "0",
|
||||
"xfrg_commercial_area": "0.0000",
|
||||
"xfrg_office_units": "0",
|
||||
"xfrg_office_area": "0.0000",
|
||||
"xfrg_parking_units": "1",
|
||||
"xfrg_parking_area": "38.1600"
|
||||
},
|
||||
"xfqy": {
|
||||
"xfqy_total_units": "46",
|
||||
"xfqy_total_area": "3421.7700",
|
||||
"xfqy_residential_units": "14",
|
||||
"xfqy_residential_area": "1770.4700",
|
||||
"xfqy_commercial_units": "1",
|
||||
"xfqy_commercial_area": "691.7800",
|
||||
"xfqy_office_units": "0",
|
||||
"xfqy_office_area": "0.0000",
|
||||
"xfqy_parking_units": "20",
|
||||
"xfqy_parking_area": "525.8600"
|
||||
}
|
||||
},
|
||||
"clfwsqytj": {
|
||||
"clf_month": {
|
||||
"clf_month_total_units": "9111",
|
||||
"clf_month_total_area": "772959.8600",
|
||||
"clf_month_residential_units": "8130",
|
||||
"clf_month_residential_area": "721746.3800"
|
||||
},
|
||||
"clf_day": {
|
||||
"clf_day_total_units": "202",
|
||||
"clf_day_total_area": "16951.6200",
|
||||
"clf_day_residential_units": "191",
|
||||
"clf_day_residential_area": "16459.4000"
|
||||
}
|
||||
},
|
||||
"clfwdtj": {
|
||||
"broker": [
|
||||
{
|
||||
"broker_seq": "1",
|
||||
"broker_name": "北京链家置地房地产经纪有限公司",
|
||||
"broker_deal_units": "3968",
|
||||
"broker_refund_units": "67"
|
||||
},
|
||||
{
|
||||
"broker_seq": "2",
|
||||
"broker_name": "北京我爱我家房地产经纪有限公司",
|
||||
"broker_deal_units": "860",
|
||||
"broker_refund_units": "27"
|
||||
},
|
||||
{
|
||||
"broker_seq": "3",
|
||||
"broker_name": "北京我爱我家华熙房地产经纪有限公司",
|
||||
"broker_deal_units": "191",
|
||||
"broker_refund_units": "4"
|
||||
},
|
||||
{
|
||||
"broker_seq": "4",
|
||||
"broker_name": "北京金色时光房地产经纪有限公司",
|
||||
"broker_deal_units": "183",
|
||||
"broker_refund_units": "7"
|
||||
},
|
||||
{
|
||||
"broker_seq": "5",
|
||||
"broker_name": "北京麦田房产经纪有限公司",
|
||||
"broker_deal_units": "167",
|
||||
"broker_refund_units": "2"
|
||||
},
|
||||
{
|
||||
"broker_seq": "6",
|
||||
"broker_name": "北京市易合房地产经纪有限责任公司",
|
||||
"broker_deal_units": "54",
|
||||
"broker_refund_units": "0"
|
||||
},
|
||||
{
|
||||
"broker_seq": "7",
|
||||
"broker_name": "汇石凯岩(北京)停车管理有限公司",
|
||||
"broker_deal_units": "45",
|
||||
"broker_refund_units": "0"
|
||||
},
|
||||
{
|
||||
"broker_seq": "8",
|
||||
"broker_name": "北京金城阜业房地产经纪有限公司",
|
||||
"broker_deal_units": "40",
|
||||
"broker_refund_units": "1"
|
||||
},
|
||||
{
|
||||
"broker_seq": "9",
|
||||
"broker_name": "北京市兴商房地产经纪中心有限公司",
|
||||
"broker_deal_units": "36",
|
||||
"broker_refund_units": "1"
|
||||
},
|
||||
{
|
||||
"broker_seq": "10",
|
||||
"broker_name": "京安驰(北京)房地产经纪有限公司",
|
||||
"broker_deal_units": "30",
|
||||
"broker_refund_units": "3"
|
||||
}
|
||||
],
|
||||
"district": [
|
||||
{
|
||||
"district_name": "全 市",
|
||||
"district_deal_units": "9111.0",
|
||||
"district_deal_area": "772959.86"
|
||||
},
|
||||
{
|
||||
"district_name": "东 城",
|
||||
"district_deal_units": "368",
|
||||
"district_deal_area": "26395.3600"
|
||||
},
|
||||
{
|
||||
"district_name": "西 城",
|
||||
"district_deal_units": "526",
|
||||
"district_deal_area": "33057.9300"
|
||||
},
|
||||
{
|
||||
"district_name": "朝 阳",
|
||||
"district_deal_units": "2150",
|
||||
"district_deal_area": "190029.8400"
|
||||
},
|
||||
{
|
||||
"district_name": "海 淀",
|
||||
"district_deal_units": "1026",
|
||||
"district_deal_area": "81386.1200"
|
||||
},
|
||||
{
|
||||
"district_name": "丰 台",
|
||||
"district_deal_units": "951",
|
||||
"district_deal_area": "76383.6700"
|
||||
},
|
||||
{
|
||||
"district_name": "石景山",
|
||||
"district_deal_units": "276",
|
||||
"district_deal_area": "20243.8900"
|
||||
},
|
||||
{
|
||||
"district_name": "通 州",
|
||||
"district_deal_units": "651",
|
||||
"district_deal_area": "57381.0200"
|
||||
},
|
||||
{
|
||||
"district_name": "房 山",
|
||||
"district_deal_units": "477",
|
||||
"district_deal_area": "39740.7200"
|
||||
},
|
||||
{
|
||||
"district_name": "顺 义",
|
||||
"district_deal_units": "477",
|
||||
"district_deal_area": "48649.5400"
|
||||
},
|
||||
{
|
||||
"district_name": "门头沟",
|
||||
"district_deal_units": "295",
|
||||
"district_deal_area": "21153.3900"
|
||||
},
|
||||
{
|
||||
"district_name": "大 兴",
|
||||
"district_deal_units": "590",
|
||||
"district_deal_area": "51463.3600"
|
||||
},
|
||||
{
|
||||
"district_name": "怀 柔",
|
||||
"district_deal_units": "107",
|
||||
"district_deal_area": "10798.1600"
|
||||
},
|
||||
{
|
||||
"district_name": "密 云",
|
||||
"district_deal_units": "196",
|
||||
"district_deal_area": "19915.1000"
|
||||
},
|
||||
{
|
||||
"district_name": "昌 平",
|
||||
"district_deal_units": "712",
|
||||
"district_deal_area": "67716.5300"
|
||||
},
|
||||
{
|
||||
"district_name": "延 庆",
|
||||
"district_deal_units": "102",
|
||||
"district_deal_area": "8821.4400"
|
||||
},
|
||||
{
|
||||
"district_name": "平 谷",
|
||||
"district_deal_units": "108",
|
||||
"district_deal_area": "10040.0800"
|
||||
},
|
||||
{
|
||||
"district_name": "开发区",
|
||||
"district_deal_units": "99",
|
||||
"district_deal_area": "9783.7100"
|
||||
}
|
||||
],
|
||||
"area": [
|
||||
{
|
||||
"area_range": "60m2以下",
|
||||
"area_deal_units": "2828",
|
||||
"area_deal_percent": "127669.4500"
|
||||
},
|
||||
{
|
||||
"area_range": "60~80m2",
|
||||
"area_deal_units": "2200",
|
||||
"area_deal_percent": "152566.2600"
|
||||
},
|
||||
{
|
||||
"area_range": "80~100m2",
|
||||
"area_deal_units": "1999",
|
||||
"area_deal_percent": "177844.6000"
|
||||
},
|
||||
{
|
||||
"area_range": "100~120m2",
|
||||
"area_deal_units": "791",
|
||||
"area_deal_percent": "86075.4300"
|
||||
},
|
||||
{
|
||||
"area_range": "120~140m2",
|
||||
"area_deal_units": "550",
|
||||
"area_deal_percent": "71435.1700"
|
||||
},
|
||||
{
|
||||
"area_range": "140m2以上",
|
||||
"area_deal_units": "743",
|
||||
"area_deal_percent": "157368.9500"
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
}
|
||||
11
package.json
11
package.json
@ -4,14 +4,21 @@
|
||||
"description": "北京市房地产数据监控系统 - 自动爬取、提取、可视化展示",
|
||||
"main": "server.js",
|
||||
"scripts": {
|
||||
"server": "node ./server.js",
|
||||
"server": "node server.js",
|
||||
"screenshot": "node scripts/screenshot.js",
|
||||
"daily": "node scripts/daily.js"
|
||||
},
|
||||
"keywords": ["房地产", "数据监控", "北京", "爬虫", "可视化"],
|
||||
"keywords": [
|
||||
"房地产",
|
||||
"数据监控",
|
||||
"北京",
|
||||
"爬虫",
|
||||
"可视化"
|
||||
],
|
||||
"author": "",
|
||||
"license": "ISC",
|
||||
"dependencies": {
|
||||
"dotenv": "^17.3.1",
|
||||
"playwright": "^1.40.0"
|
||||
}
|
||||
}
|
||||
|
||||
BIN
pic/2026-03-23.png
Normal file
BIN
pic/2026-03-23.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 374 KiB |
52
pnpm-lock.yaml
generated
Normal file
52
pnpm-lock.yaml
generated
Normal file
@ -0,0 +1,52 @@
|
||||
lockfileVersion: '9.0'
|
||||
|
||||
settings:
|
||||
autoInstallPeers: true
|
||||
excludeLinksFromLockfile: false
|
||||
|
||||
importers:
|
||||
|
||||
.:
|
||||
dependencies:
|
||||
dotenv:
|
||||
specifier: ^17.3.1
|
||||
version: 17.3.1
|
||||
playwright:
|
||||
specifier: ^1.40.0
|
||||
version: 1.58.2
|
||||
|
||||
packages:
|
||||
|
||||
dotenv@17.3.1:
|
||||
resolution: {integrity: sha512-IO8C/dzEb6O3F9/twg6ZLXz164a2fhTnEWb95H23Dm4OuN+92NmEAlTrupP9VW6Jm3sO26tQlqyvyi4CsnY9GA==}
|
||||
engines: {node: '>=12'}
|
||||
|
||||
fsevents@2.3.2:
|
||||
resolution: {integrity: sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==}
|
||||
engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0}
|
||||
os: [darwin]
|
||||
|
||||
playwright-core@1.58.2:
|
||||
resolution: {integrity: sha512-yZkEtftgwS8CsfYo7nm0KE8jsvm6i/PTgVtB8DL726wNf6H2IMsDuxCpJj59KDaxCtSnrWan2AeDqM7JBaultg==}
|
||||
engines: {node: '>=18'}
|
||||
hasBin: true
|
||||
|
||||
playwright@1.58.2:
|
||||
resolution: {integrity: sha512-vA30H8Nvkq/cPBnNw4Q8TWz1EJyqgpuinBcHET0YVJVFldr8JDNiU9LaWAE1KqSkRYazuaBhTpB5ZzShOezQ6A==}
|
||||
engines: {node: '>=18'}
|
||||
hasBin: true
|
||||
|
||||
snapshots:
|
||||
|
||||
dotenv@17.3.1: {}
|
||||
|
||||
fsevents@2.3.2:
|
||||
optional: true
|
||||
|
||||
playwright-core@1.58.2: {}
|
||||
|
||||
playwright@1.58.2:
|
||||
dependencies:
|
||||
playwright-core: 1.58.2
|
||||
optionalDependencies:
|
||||
fsevents: 2.3.2
|
||||
494
public/define.js
Normal file
494
public/define.js
Normal file
@ -0,0 +1,494 @@
|
||||
const rootDefined = {
|
||||
spfsjtj: {
|
||||
key: 'spfsjtj',
|
||||
label: '商品房数据统计',
|
||||
childMap: {
|
||||
ksqf: {
|
||||
key: 'kspf',
|
||||
label: '可售期房统计',
|
||||
childMap: {
|
||||
kspf_total_units: {
|
||||
key: 'kspf_total_units',
|
||||
label: '可售房屋套数',
|
||||
},
|
||||
kspf_total_area: {
|
||||
key: 'kspf_total_area',
|
||||
label: '可售房屋面积(M2)',
|
||||
},
|
||||
kspf_residential_units: {
|
||||
key: 'kspf_residential_units',
|
||||
label: '其中,住宅套数',
|
||||
},
|
||||
kspf_residential_area: {
|
||||
key: 'kspf_residential_area',
|
||||
label: '面积(M2)',
|
||||
},
|
||||
kspf_residential_units: {
|
||||
key: 'kspf_residential_units',
|
||||
label: '其中,住宅套数',
|
||||
},
|
||||
kspf_commercial_units: {
|
||||
key: 'kspf_commercial_units',
|
||||
label: '其中,商业单元',
|
||||
},
|
||||
kspf_commercial_area: {
|
||||
key: 'kspf_commercial_area',
|
||||
label: '面积(M2)',
|
||||
},
|
||||
kspf_office_units: {
|
||||
key: 'kspf_office_units',
|
||||
label: '其中,办公单元',
|
||||
},
|
||||
kspf_office_area: {
|
||||
key: 'kspf_office_area',
|
||||
label: '面积(M2)',
|
||||
},
|
||||
kspf_parking_units: {
|
||||
key: 'kspf_parking_units',
|
||||
label: '其中,车位个数',
|
||||
},
|
||||
kspf_parking_area: {
|
||||
key: 'kspf_parking_area',
|
||||
label: '面积(M2)',
|
||||
},
|
||||
},
|
||||
},
|
||||
ysxk: {
|
||||
key: 'ysxk',
|
||||
label: '预售许可',
|
||||
childMap: {
|
||||
ysxk_license_count: {
|
||||
key: 'ysxk_license_count',
|
||||
label: '批准预售许可证',
|
||||
},
|
||||
ysxk_total_area: {
|
||||
key: 'ysxk_total_area',
|
||||
label: '批准预售面积(M2)',
|
||||
},
|
||||
ysxk_residential_units: {
|
||||
key: 'ysxk_residential_units',
|
||||
label: '其中,住宅套数',
|
||||
},
|
||||
ysxk_residential_area: {
|
||||
key: 'ysxk_residential_area',
|
||||
label: '面积(M2)',
|
||||
},
|
||||
ysxk_commercial_units: {
|
||||
key: 'ysxk_commercial_units',
|
||||
label: '其中,商业单元',
|
||||
},
|
||||
ysxk_commercial_area: {
|
||||
key: 'ysxk_commercial_area',
|
||||
label: '面积(M2)',
|
||||
},
|
||||
ysxk_office_units: {
|
||||
key: 'ysxk_office_units',
|
||||
label: '其中,办公单元',
|
||||
},
|
||||
ysxk_office_area: {
|
||||
key: 'ysxk_office_area',
|
||||
label: '面积(M2)',
|
||||
},
|
||||
ysxk_parking_units: {
|
||||
key: 'ysxk_parking_units',
|
||||
label: '其中,车位个数',
|
||||
},
|
||||
ysxk_parking_area: {
|
||||
key: 'ysxk_parking_area',
|
||||
label: '面积(M2)',
|
||||
},
|
||||
},
|
||||
},
|
||||
qfrg: {
|
||||
key: 'qfrg',
|
||||
label: '期房网上认购',
|
||||
childMap: {
|
||||
qfrg_total_units: {
|
||||
key: 'qfrg_total_units',
|
||||
label: '网上认购套数',
|
||||
},
|
||||
qfrg_total_area: {
|
||||
key: 'qfrg_total_area',
|
||||
label: '网上认购面积(M2)',
|
||||
},
|
||||
qfrg_residential_units: {
|
||||
key: 'qfrg_residential_units',
|
||||
label: '住宅套数',
|
||||
},
|
||||
qfrg_residential_area: {
|
||||
key: 'qfrg_residential_area',
|
||||
label: '面积(M2)',
|
||||
},
|
||||
qfrg_commercial_units: {
|
||||
key: 'qfrg_commercial_units',
|
||||
label: '商业单元',
|
||||
},
|
||||
qfrg_commercial_area: {
|
||||
key: 'qfrg_commercial_area',
|
||||
label: '面积(M2)',
|
||||
},
|
||||
qfrg_office_units: {
|
||||
key: 'qfrg_office_units',
|
||||
label: '办公单元',
|
||||
},
|
||||
qfrg_office_area: {
|
||||
key: 'qfrg_office_area',
|
||||
label: '面积(M2)',
|
||||
},
|
||||
qfrg_parking_units: {
|
||||
key: 'qfrg_parking_units',
|
||||
label: '车位个数',
|
||||
},
|
||||
qfrg_parking_area: {
|
||||
key: 'qfrg_parking_area',
|
||||
label: '面积(M2)',
|
||||
},
|
||||
},
|
||||
},
|
||||
qfqy: {
|
||||
key: 'qfqy',
|
||||
label: '期房网上签约',
|
||||
childMap: {
|
||||
qfqy_total_units: {
|
||||
key: 'qfqy_total_units',
|
||||
label: '网上签约套数',
|
||||
},
|
||||
qfqy_total_area: {
|
||||
key: 'qfqy_total_area',
|
||||
label: '网上签约面积(M2)',
|
||||
},
|
||||
qfqy_residential_units: {
|
||||
key: 'qfqy_residential_units',
|
||||
label: '住宅套数',
|
||||
},
|
||||
qfqy_residential_area: {
|
||||
key: 'qfqy_residential_area',
|
||||
label: '面积(M2)',
|
||||
},
|
||||
qfqy_commercial_units: {
|
||||
key: 'qfqy_commercial_units',
|
||||
label: '商业单元',
|
||||
},
|
||||
qfqy_commercial_area: {
|
||||
key: 'qfqy_commercial_area',
|
||||
label: '面积(M2)',
|
||||
},
|
||||
qfqy_office_units: {
|
||||
key: 'qfqy_office_units',
|
||||
label: '办公单元',
|
||||
},
|
||||
qfqy_office_area: {
|
||||
key: 'qfqy_office_area',
|
||||
label: '面积(M2)',
|
||||
},
|
||||
qfqy_parking_units: {
|
||||
key: 'qfqy_parking_units',
|
||||
label: '车位个数',
|
||||
},
|
||||
qfqy_parking_area: {
|
||||
key: 'qfqy_parking_area',
|
||||
label: '面积(M2)',
|
||||
},
|
||||
},
|
||||
},
|
||||
wyxf: {
|
||||
key: 'wyxf',
|
||||
label: '未签约现房统计',
|
||||
childMap: {
|
||||
wyxf_total_units: {
|
||||
key: 'wyxf_total_units',
|
||||
label: '未签约套数',
|
||||
},
|
||||
wyxf_total_area: {
|
||||
key: 'wyxf_total_area',
|
||||
label: '未签约面积(M2)',
|
||||
},
|
||||
wyxf_residential_units: {
|
||||
key: 'wyxf_residential_units',
|
||||
label: '住宅套数',
|
||||
},
|
||||
wyxf_residential_area: {
|
||||
key: 'wyxf_residential_area',
|
||||
label: '面积(M2)',
|
||||
},
|
||||
wyxf_commercial_units: {
|
||||
key: 'wyxf_commercial_units',
|
||||
label: '商业单元',
|
||||
},
|
||||
wyxf_commercial_area: {
|
||||
key: 'wyxf_commercial_area',
|
||||
label: '面积(M2)',
|
||||
},
|
||||
wyxf_office_units: {
|
||||
key: 'wyxf_office_units',
|
||||
label: '办公单元',
|
||||
},
|
||||
wyxf_office_area: {
|
||||
key: 'wyxf_office_area',
|
||||
label: '面积(M2)',
|
||||
},
|
||||
wyxf_parking_units: {
|
||||
key: 'wyxf_parking_units',
|
||||
label: '车位个数',
|
||||
},
|
||||
wyxf_parking_area: {
|
||||
key: 'wyxf_parking_area',
|
||||
label: '面积(M2)',
|
||||
},
|
||||
},
|
||||
},
|
||||
xfxm: {
|
||||
key: 'xfxm',
|
||||
label: '现房项目情况',
|
||||
childMap: {
|
||||
xfxm_project_count: {
|
||||
key: 'xfxm_project_count',
|
||||
label: '现房项目个数',
|
||||
},
|
||||
xfxm_total_area: {
|
||||
key: 'xfxm_total_area',
|
||||
label: '初始登记面积(M2)',
|
||||
},
|
||||
xfxm_residential_units: {
|
||||
key: 'xfxm_residential_units',
|
||||
label: '住宅套数',
|
||||
},
|
||||
xfxm_residential_area: {
|
||||
key: 'xfxm_residential_area',
|
||||
label: '面积(M2)',
|
||||
},
|
||||
xfxm_commercial_units: {
|
||||
key: 'xfxm_commercial_units',
|
||||
label: '商业单元',
|
||||
},
|
||||
xfxm_commercial_area: {
|
||||
key: 'xfxm_commercial_area',
|
||||
label: '面积(M2)',
|
||||
},
|
||||
xfxm_office_units: {
|
||||
key: 'xfxm_office_units',
|
||||
label: '办公单元',
|
||||
},
|
||||
xfxm_office_area: {
|
||||
key: 'xfxm_office_area',
|
||||
label: '面积(M2)',
|
||||
},
|
||||
xfxm_parking_units: {
|
||||
key: 'xfxm_parking_units',
|
||||
label: '车位个数',
|
||||
},
|
||||
xfxm_parking_area: {
|
||||
key: 'xfxm_parking_area',
|
||||
label: '面积(M2)',
|
||||
},
|
||||
},
|
||||
},
|
||||
xfrg: {
|
||||
key: 'xfrg',
|
||||
label: '现房网上认购',
|
||||
childMap: {
|
||||
xfrg_total_units: {
|
||||
key: 'xfrg_total_units',
|
||||
label: '网上认购套数',
|
||||
},
|
||||
xfrg_total_area: {
|
||||
key: 'xfrg_total_area',
|
||||
label: '网上认购面积(M2)',
|
||||
},
|
||||
xfrg_residential_units: {
|
||||
key: 'xfrg_residential_units',
|
||||
label: '住宅套数',
|
||||
},
|
||||
xfrg_residential_area: {
|
||||
key: 'xfrg_residential_area',
|
||||
label: '面积(M2)',
|
||||
},
|
||||
xfrg_commercial_units: {
|
||||
key: 'xfrg_commercial_units',
|
||||
label: '商业单元',
|
||||
},
|
||||
xfrg_commercial_area: {
|
||||
key: 'xfrg_commercial_area',
|
||||
label: '面积(M2)',
|
||||
},
|
||||
xfrg_office_units: {
|
||||
key: 'xfrg_office_units',
|
||||
label: '办公单元',
|
||||
},
|
||||
xfrg_office_area: {
|
||||
key: 'xfrg_office_area',
|
||||
label: '面积(M2)',
|
||||
},
|
||||
xfrg_parking_units: {
|
||||
key: 'xfrg_parking_units',
|
||||
label: '车位个数',
|
||||
},
|
||||
xfrg_parking_area: {
|
||||
key: 'xfrg_parking_area',
|
||||
label: '面积(M2)',
|
||||
},
|
||||
},
|
||||
},
|
||||
xfqy: {
|
||||
key: 'xfqy',
|
||||
label: '现房网上签约',
|
||||
childMap: {
|
||||
xfqy_total_units: {
|
||||
key: 'xfqy_total_units',
|
||||
label: '网上签约套数',
|
||||
},
|
||||
xfqy_total_area: {
|
||||
key: 'xfqy_total_area',
|
||||
label: '网上签约面积(M2)',
|
||||
},
|
||||
xfqy_residential_units: {
|
||||
key: 'xfqy_residential_units',
|
||||
label: '住宅套数',
|
||||
},
|
||||
xfqy_residential_area: {
|
||||
key: 'xfqy_residential_area',
|
||||
label: '面积(M2)',
|
||||
},
|
||||
xfqy_commercial_units: {
|
||||
key: 'xfqy_commercial_units',
|
||||
label: '商业单元',
|
||||
},
|
||||
xfqy_commercial_area: {
|
||||
key: 'xfqy_commercial_area',
|
||||
label: '面积(M2)',
|
||||
},
|
||||
xfqy_office_units: {
|
||||
key: 'xfqy_office_units',
|
||||
label: '办公单元',
|
||||
},
|
||||
xfqy_office_area: {
|
||||
key: 'xfqy_office_area',
|
||||
label: '面积(M2)',
|
||||
},
|
||||
xfqy_parking_units: {
|
||||
key: 'xfqy_parking_units',
|
||||
label: '车位个数',
|
||||
},
|
||||
xfqy_parking_area: {
|
||||
key: 'xfqy_parking_area',
|
||||
label: '面积(M2)',
|
||||
},
|
||||
},
|
||||
}
|
||||
}
|
||||
},
|
||||
clfwsqytj: {
|
||||
key: 'clfwsqytj',
|
||||
label: '存量房网上签约统计',
|
||||
childMap: {
|
||||
clf_month: {
|
||||
key: 'clf_month',
|
||||
label: '月签约',
|
||||
childMap: {
|
||||
clf_month_total_units: {
|
||||
key: 'clf_month_total_units',
|
||||
label: '网上签约套数',
|
||||
},
|
||||
clf_month_total_area: {
|
||||
key: 'clf_month_total_area',
|
||||
label: '网上签约面积(m2)',
|
||||
},
|
||||
clf_month_residential_units: {
|
||||
key: 'clf_month_residential_units',
|
||||
label: '住宅签约套数',
|
||||
},
|
||||
clf_month_residential_area: {
|
||||
key: 'clf_month_residential_area',
|
||||
label: '住宅签约面积(m2)',
|
||||
},
|
||||
},
|
||||
},
|
||||
clf_day: {
|
||||
key: 'clf_day',
|
||||
label: '日签约',
|
||||
childMap: {
|
||||
clf_day_total_units: {
|
||||
key: 'clf_day_total_units',
|
||||
label: '网上签约套数',
|
||||
},
|
||||
clf_day_total_area: {
|
||||
key: 'clf_day_total_area',
|
||||
label: '网上签约面积(m2)',
|
||||
},
|
||||
clf_day_residential_units: {
|
||||
key: 'clf_day_residential_units',
|
||||
label: '住宅签约套数',
|
||||
},
|
||||
clf_day_residential_area: {
|
||||
key: 'clf_day_residential_area',
|
||||
label: '住宅签约面积(m2)',
|
||||
},
|
||||
},
|
||||
}
|
||||
}
|
||||
},
|
||||
clfwdtj: {
|
||||
key: 'clfwdtj',
|
||||
label: '存量房维度统计',
|
||||
childMap: {
|
||||
broker: {
|
||||
key: 'broker',
|
||||
label: '按经纪机构',
|
||||
childMap: {
|
||||
broker_seq: {
|
||||
key: 'broker_seq',
|
||||
label: '序号',
|
||||
},
|
||||
broker_name: {
|
||||
key: 'broker_name',
|
||||
label: '房地产经纪机构名称',
|
||||
},
|
||||
broker_deal_units: {
|
||||
key: 'broker_deal_units',
|
||||
label: '签约套数',
|
||||
},
|
||||
broker_refund_units: {
|
||||
key: 'broker_refund_units',
|
||||
label: '退房套数',
|
||||
},
|
||||
},
|
||||
},
|
||||
district: {
|
||||
key: 'district',
|
||||
label: '按所在区县',
|
||||
childMap: {
|
||||
district_name: {
|
||||
key: 'district_name',
|
||||
label: '所在区县',
|
||||
},
|
||||
district_deal_units: {
|
||||
key: 'district_deal_units',
|
||||
label: '签约套数',
|
||||
},
|
||||
district_deal_area: {
|
||||
key: 'district_deal_area',
|
||||
label: '签约面积(m2)',
|
||||
},
|
||||
},
|
||||
},
|
||||
area: {
|
||||
key: 'area',
|
||||
label: '按建筑面积',
|
||||
childMap: {
|
||||
area_range: {
|
||||
key: 'area_range',
|
||||
label: '建筑面积区间',
|
||||
},
|
||||
area_deal_units: {
|
||||
key: 'area_deal_units',
|
||||
label: '签约套数',
|
||||
},
|
||||
area_deal_percent: {
|
||||
key: 'area_deal_percent',
|
||||
label: '占比(%)',
|
||||
},
|
||||
},
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -6,11 +6,11 @@ const { chromium } = require('playwright');
|
||||
|
||||
const fs = require('fs');
|
||||
const path = require('path');
|
||||
const dotenv = require('dotenv');
|
||||
|
||||
const extractFunc = require('../utils/extract_data');
|
||||
dotenv.config({path: ['.env.local', '.env'], quiet: true});
|
||||
|
||||
const BASE_DIR = '/app/houseDream';
|
||||
// const BASE_DIR = '/Users/liyanyan/vps/tencet-ecs/app/houseDream';
|
||||
const BASE_DIR = process.env.BASE_DIR;
|
||||
const PIC_DIR = path.join(BASE_DIR, 'pic');
|
||||
const DATA_DIR = path.join(BASE_DIR, 'data');
|
||||
|
||||
|
||||
@ -5,9 +5,11 @@
|
||||
const { chromium } = require('playwright');
|
||||
const fs = require('fs');
|
||||
const path = require('path');
|
||||
const dotenv = require('dotenv');
|
||||
|
||||
const BASE_DIR = '/app/houseDream';
|
||||
// const BASE_DIR = '/Users/liyanyan/vps/tencet-ecs/app/houseDream';
|
||||
dotenv.config({path: ['.env.local', '.env'], quiet: true});
|
||||
|
||||
const BASE_DIR = process.env.BASE_DIR;
|
||||
const PIC_DIR = path.join(BASE_DIR, 'pic');
|
||||
|
||||
const TARGET_URL = 'http://bjjs.zjw.beijing.gov.cn/eportal/ui?pageId=307749';
|
||||
|
||||
13
server.js
13
server.js
@ -7,9 +7,13 @@ const http = require('http');
|
||||
const fs = require('fs');
|
||||
const path = require('path');
|
||||
const url = require('url');
|
||||
const dotenv = require('dotenv');
|
||||
|
||||
const BASE_DIR = '/app/houseDream';
|
||||
// const BASE_DIR = '/Users/liyanyan/vps/tencet-ecs/app/houseDream';
|
||||
dotenv.config({path: ['.env.local', '.env'], quiet: true});
|
||||
|
||||
console.log('环境变量:', process.env.BASE_DIR);
|
||||
|
||||
const BASE_DIR = process.env.BASE_DIR;
|
||||
const WEB_DIR = path.join(BASE_DIR, 'web');
|
||||
const DATA_DIR = path.join(BASE_DIR, 'data');
|
||||
const PIC_DIR = path.join(BASE_DIR, 'pic');
|
||||
@ -130,6 +134,7 @@ const server = http.createServer(async (req, res) => {
|
||||
res.end(data);
|
||||
|
||||
} catch (err) {
|
||||
console.error('文件读取错误:', err);
|
||||
if (err.code === 'ENOENT') {
|
||||
res.writeHead(404, { 'Content-Type': 'text/plain' });
|
||||
res.end('Not Found');
|
||||
@ -152,7 +157,7 @@ server.listen(PORT, 'localhost', () => {
|
||||
|
||||
// 优雅关闭
|
||||
process.on('SIGTERM', () => {
|
||||
console.log('\n正在关闭服务器...');
|
||||
console.log('\nSIGTERM\n正在关闭服务器...');
|
||||
server.close(() => {
|
||||
console.log('服务器已关闭');
|
||||
process.exit(0);
|
||||
@ -160,7 +165,7 @@ process.on('SIGTERM', () => {
|
||||
});
|
||||
|
||||
process.on('SIGINT', () => {
|
||||
console.log('\n正在关闭服务器...');
|
||||
console.log('\nSIGINT\n正在关闭服务器...');
|
||||
server.close(() => {
|
||||
console.log('服务器已关闭');
|
||||
process.exit(0);
|
||||
|
||||
5
startup.sh
Executable file
5
startup.sh
Executable file
@ -0,0 +1,5 @@
|
||||
#!/bin/bash
|
||||
|
||||
# 启动 houseDream
|
||||
# cd /app/houseDream
|
||||
pnpm run server
|
||||
@ -175,7 +175,6 @@ function renderBrokerTable(table, data, fieldMap) {
|
||||
// 表体
|
||||
const tbody = document.createElement('tbody');
|
||||
data.forEach(item => {
|
||||
console.log('渲染经纪机构表格数据:', item);
|
||||
const row = document.createElement('tr');
|
||||
row.innerHTML = Object.values(fieldMap).map(field => `<td>${item[field.key]}</td>`).join('');
|
||||
tbody.appendChild(row);
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user