上海市二手房成交數據監控
最近一兩年比較關注上海市二手房市場成交量信息,和股市的成交量類似,可以輔助判斷房價走勢。
以前年輕,一心只知道上班學技術搞錢,有一次和同事聊天,其置換的房子價值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,截圖如下所示:
注意切換到Graph,採用Stacked的圖表模式查看,其它不會的設置看上面截圖。
結果中同一天可能有多個同值採樣點,問題不大,畢竟一小時採集一次嘛,能看出每天成交量就可以了。
可以看出最近工作日每天成交800套左右,週末成交量顯著上升可達1400套,去年的時候,成交量通常是400-600的樣子,記不住了,所以纔想把數據保存下來。
我設置的保留3年的數據:Storage retention 3y,不懂怎麼設置的搜索下,懶得敲字了。
當然,你也可以直接發信息到你的微信或者郵箱,不放在Prometheus裏面,只是我個人覺得這樣對我比較合適而已。
如果你還有疑問,可以關注微信公衆號留言。另外上述接口還包含成交面積和成交總價,也就是可以算出均價,可以修改下程序,投遞多個指標。
版權申明:
- 未標註來源的內容皆為原創,未經授權請勿轉載(因轉載後排版往往錯亂、內容不可控、無法持續更新等);
- 非營利為目的,演繹本博客任何內容,請以'原文出處'或者'參考鏈接'等方式給出本站相關網頁地址(方便讀者)。
相關文章:
- OpenLDAP監控
- 簡單獲取celery任務即時結果
- 迷你主機組裝記
- Labwc更換定製皮膚
- 實用自動代理配置示例
- Openvpn示例
- Fastapi微信公衆號開發簡要
- 快速隱藏和呼出終端
- Hysteria科學上網簡要
- greetd和regreet使用教程