上海市二手房成交數據監控

最近一兩年比較關注上海市二手房市場成交量信息,和股市的成交量類似,可以輔助判斷房價走勢。

以前年輕,一心只知道上班學技術搞錢,有一次和同事聊天,其置換的房子價值800w,普通人打工上班人 聽到這個可以說相當震驚😲,心想一輩子都不可能達到。這種踩中時代紅利的機會,可遇不可求。回想起來,當我想很想買房子的時候,外地單身政策限制;熬到落戶能買時,房價已一路陰跌!結果是隻能觀望,畢竟囊中羞澀 掏不出800w,關注總是可以的,春江水暖鴨先知,不敏銳把握機會,來世還要做苦命打工人。而且,去年炒股賺錢比上班多,這種感覺非常奇妙,班還是要上的,除非你真的非常富裕。

題外話不多說,每天上海市都會準時公佈二手房成交量數據,網址是這個https://www.fangdi.com.cn/old_house/old_house.html,頁面雖醜但是很權威,不服的話,政府可以讓你多繳稅。每天中午, 我都會打開瞄一眼。天長日久,覺得這樣歷史信息無法查看,每次要打開這個網站也挺麻煩的。所以,想用程序自動採集數據,放到Prometheus中監控起來,甚至可以設定報警條件,比如日成交量大於1500套報警。

下面是我的操作過程記錄:

1.自動採集程序

代碼如下:

 1import requests
 2from flask import Flask
 3from prometheus_client import Gauge, generate_latest, CollectorRegistry
 4
 5app = Flask(__name__)
 6registry = CollectorRegistry()
 7# 定義一個 Gauge 指標來存儲二手房銷量數據
 8sell_count_gauge = Gauge('shanghai_second_hand_house_sell_count',
 9                         'Shanghai Second Hand House Sell Count', registry=registry)
10
11
12@app.route('/metrics')
13def metrics():
14    try:
15        # 創建一個會話對象,用於管理 cookie
16        session = requests.Session()
17
18        # 先訪問主頁面以獲取初始 cookie
19        main_url = 'https://www.fangdi.com.cn/old_house/old_house.html'
20        main_headers = {
21            'User-Agent': 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/134.0.0.0 Safari/537.36'
22        }
23        session.get(main_url, headers=main_headers)
24
25        # 定義請求的 URL
26        api_url = 'https://www.fangdi.com.cn/oldhouse/getSHYesterdaySell.action'
27
28        # 設置請求頭
29        headers = {
30            'Accept': 'application/json, text/javascript, */*; q=0.01',
31            'Accept-Language': 'en-US,en;q=0.9',
32            'Connection': 'keep-alive',
33            'Content-Type': 'application/x-www-form-urlencoded;charset=utf-8',
34            'Origin': 'https://www.fangdi.com.cn',
35            'Referer': 'https://www.fangdi.com.cn/old_house/old_house.html',
36            'Sec-Fetch-Dest': 'empty',
37            'Sec-Fetch-Mode': 'cors',
38            'Sec-Fetch-Site': 'same-origin',
39            'User-Agent': 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/134.0.0.0 Safari/537.36',
40            'X-Requested-With': 'XMLHttpRequest',
41            'sec-ch-ua': '"Not:A-Brand";v="24", "Chromium";v="134"',
42            'sec-ch-ua-mobile': '?0',
43            'sec-ch-ua-platform': '"Linux"'
44        }
45
46        # 使用會話對象發送 POST 請求
47        response = session.post(api_url, headers=headers, data="")
48        response.raise_for_status()
49
50        # 解析 JSON 響應
51        data = response.json()
52        sell_count = data.get('sellcount')
53
54        if sell_count is not None:
55            # 設置 Gauge 指標的值
56            sell_count_gauge.set(sell_count)
57            # 生成 Prometheus 格式的指標數據
58            metrics_data = generate_latest(registry).decode('utf-8')
59            return metrics_data, 200, {'Content-Type': 'text/plain; version=0.0.4; charset=utf-8'}
60        else:
61            return "未找到成交套數信息", 500
62    except requests.RequestException as e:
63        return f"請求出錯: {e}", 500
64    except ValueError:
65        return "無法解析響應的 JSON 數據", 500
66
67
68if __name__ == '__main__':
69    app.run(host='0.0.0.0', port=8000)

上面的程序非常簡單,訪問得到cookie後模擬瀏覽器拿到頁面上的目標數據,注意接口url:https://www.fangdi.com.cn/oldhouse/getSHYesterdaySell.action,可能以後會變動,萬一對方改版了呢? 萬一真的改版了,用瀏覽器調試工具找下修改即可。新手可能會問,那麼多header頭,你怎麼知道的?瀏覽器裏面copy as curl,再讓AI幫你轉成Requests庫需要的樣子,AI適合幹這樣的活,而且不怎麼出錯,效率高。

上述程序不懂的地方,也可以讓AI解釋,反正善於利用工具解決問題,搞到錢纔是王道。

2. 部署Prometheus自動採集數據

上面的代碼其實已經生成指標數據了,部署Prometheus到本地電腦,網上有大把教程,就不贅述了。

上述程序,也就是採集客戶端也部署在本機,我是用supervisd接管的:

 1➜  ershoufang sudo supervisorctl status shanghai
 2[sudo] password for mephisto:
 3shanghai                         RUNNING   pid 781, uptime 2:12:17
 4➜  ershoufang cat /etc/supervisor.d/shanghai.ini
 5[program:shanghai]
 6command=/home/mephisto/github/ershoufang/.venv/bin/python shanghai.py  # 替換爲你的 Flask 程序的實際路徑
 7directory=/home/mephisto/github/ershoufang    # 替換爲你的 Flask 程序所在的目錄
 8autostart=true
 9autorestart=true
10stderr_logfile=/var/log/app.err.log
11stdout_logfile=/var/log/app.out.log

確認客戶端(採集程序)和服務端(Prometheus)都跑起來了:

1➜  ershoufang sudo ss -lntp | grep -E  "python|prometheus"
2LISTEN 0      128          0.0.0.0:8000       0.0.0.0:*    users:(("python",pid=781,fd=3))
3LISTEN 0      4096               *:9090             *:*    users:(("prometheus",pid=796,fd=6))

沒有問題,端口正常監聽,也可以用瀏覽器訪問對應的服務地址試試看。

3. 設置採集頻率

這一步就是配置prometheus.yml文件

 1➜  ershoufang sudo cat /etc/prometheus/prometheus.yml
 2# my global config
 3global:
 4  scrape_interval: 30m # Set the scrape interval to every 15 seconds. Default is every 1 minute.
 5  evaluation_interval: 15s # Evaluate rules every 15 seconds. The default is every 1 minute.
 6  # scrape_timeout is set to the global default (10s).
 7
 8# Alertmanager configuration
 9alerting:
10  alertmanagers:
11    - static_configs:
12        - targets:
13          # - alertmanager:9093
14
15# Load rules once and periodically evaluate them according to the global 'evaluation_interval'.
16rule_files:
17  # - "first_rules.yml"
18  # - "second_rules.yml"
19
20# A scrape configuration containing exactly one endpoint to scrape:
21# Here it's Prometheus itself.
22scrape_configs:
23  # The job name is added as a label `job=<job_name>` to any timeseries scraped from this config.
24  - job_name: "prometheus"
25
26    # metrics_path defaults to '/metrics'
27    # scheme defaults to 'http'.
28
29    static_configs:
30      - targets: ["localhost:9090"]
31
32  - job_name: 'shanghai_second_hand_house'
33    scrape_interval: 1h
34    static_configs:
35      - targets: ['localhost:8000']

最後的那個job: shanghai_second_hand_house 就是要添加的,採集間隔scrape_interval: 1h,一個小時拿一次數據,頻率太高,給你定個擾亂社會秩序,拘留5天可不太好。 不浪費公共資源,爭做守法好市民,採多了,那天關了豈不是給大家添麻煩,你應該懂的。

4. 結果核對

瀏覽器打開:http://localhost:9090,截圖如下所示:

shanghai_house

注意切換到Graph,採用Stacked的圖表模式查看,其它不會的設置看上面截圖。

結果中同一天可能有多個同值採樣點,問題不大,畢竟一小時採集一次嘛,能看出每天成交量就可以了。

可以看出最近工作日每天成交800套左右,週末成交量顯著上升可達1400套,去年的時候,成交量通常是400-600的樣子,記不住了,所以纔想把數據保存下來。

我設置的保留3年的數據:Storage retention 3y,不懂怎麼設置的搜索下,懶得敲字了。

當然,你也可以直接發信息到你的微信或者郵箱,不放在Prometheus裏面,只是我個人覺得這樣對我比較合適而已。

如果你還有疑問,可以關注微信公衆號留言。另外上述接口還包含成交面積和成交總價,也就是可以算出均價,可以修改下程序,投遞多個指標。

最後修改於: Wednesday, March 19, 2025

相關文章:

翻譯: