上海中古住宅取引データモニタリング

ここ1、2年、上海の中古住宅市場の取引量に注目しています。株式市場の取引量と同様に、住宅価格の動向を予測するのに役立ちます。

若い頃は、働くこと、テクノロジーを学ぶこと、そしてお金を稼ぐことばかり考えていました。ある時、同僚と雑談していたら、彼が買った家の価値が800万ドルだと言っていました。平均的な労働者は…

それを聞いて、かなりショックを受けました。😲 今の私には到底無理だと思っていました。人生でこれほどの好景気に乗じたチャンスは滅多にありません。振り返ってみると、私が本当に家を買いたかった頃は、市外在住の独身者に対する規制が敷かれていました。ようやく戸籍を取得し購入できる頃には、住宅価格はすでに暴落していました!そのため、財布の紐が緩み、様子見するしかありませんでした。

800万元は無理でしたが、常に状況を見守ることができました。春に川が温まる時期は鴨に分かるように、チャンスを逃せば来世で苦労することになるのです。それに、昨年は株式取引で稼いだ金額が実際に働いていた金額を上回るという、素晴らしい気分でした。よほど裕福でない限り、仕事に行かなければなりません。

さて、上海は中古住宅取引データをhttps://www.fangdi.com.cn/old_house/old_house.htmlで毎日公開しています。見にくいデータですが、信頼できるものです。もしあなたが反対です。政府はあなたにもっと税金を支払わせることができるのです。毎日正午に

開いて見ていましたが、時間が経つにつれて履歴データへのアクセスが難しくなり、毎回ウェブサイトを開くのが面倒になってきました。そこで、プログラムを使ってPrometheusでデータを自動的に収集し、監視できるようにしたいと考えました。例えば、1日の取引量が1,500セットを超えたらアラームを出すといったアラーム条件も設定できます。

以下は私の操作手順の記録です。

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'上海の中古住宅Sell Count', registry=registry)
10
11@app.route('/metrics')
12def metrics():
13try:
14# Cookie管理用のセッションオブジェクトを作成
15session = requests.Session()
16
17# 初期Cookieを取得するために、まずメインページにアクセス
18main_url = 'https://www.fangdi.com.cn/old_house/old_house.html'
19main_headers = {
20'User-Agent': 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/134.0.0.0 Safari/537.36'
21
22session.get(main_url, headers=main_headers)
23
24# リクエストURLを定義
25api_url = 'https://www.fangdi.com.cn/oldhouse/getSHYesterdaySell.action'
26
27# リクエストヘッダーを設定
28headers = {
29'Accept': 'application/json, text/javascript, */*; q=0.01',
30'Accept-Language': 'en-US,en;q=0.9',
31'Connection': 'keep-alive',
32'Content-Type': 'application/x-www-form-urlencoded; charset=utf-8',
33'Origin': 'https://www.fangdi.com.cn',
34'Referer': 'https://www.fangdi.com.cn/old_house/old_house.html',
35'Sec-Fetch-Dest': 'empty',
36'Sec-Fetch-Mode': 'cors',
37'Sec-Fetch-Site': 'same-origin',
38'User-Agent': 'Mozilla/5.0 (X11; Linux) x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/134.0.0.0 Safari/537.36',
39'X-Requested-With': 'XMLHttpRequest',
40'sec-ch-ua': '"Not:A-Brand";v="24", "Chromium";v="134"', 'sec-ch-ua-mobile': '?0',
41'sec-ch-ua-platform': '"Linux"'
42}
43
44# セッションオブジェクトを使用してPOSTリクエストを送信します
45response = session.post(api_url, headers=headers, data="")
46response.raise_for_status()
47
48# JSONレスポンスを解析します
49data = response.json()
50sell_count = data.get('sellcount')
51
52sell_countがNoneでない場合:
53# Gaugeメトリックを設定しますvalue
54sell_count_gauge.set(sell_count)
55# Prometheus形式でメトリクスデータを生成
56metrics_data = generate_latest(registry).decode('utf-8')
57return metrics_data, 200, {'Content-Type': 'text/plain; version=0.0.4; charset=utf-8'}
58else:
59return "取引数量情報が見つかりません", 500
60except requests.RequestException as e:
61return f"リクエストエラー: {e}", 500
62except ValueError:
63return "レスポンスJSONデータを解析できません", 500
64
65if __name__ == '__main__':
66app.run(host='0.0.0.0', port=8000)

上記のプログラムは非常にシンプルです。Cookieにアクセスした後、ブラウザをシミュレートしてページ上の対象データを取得します。エンドポイントURLに注意してください。 https://www.fangdi.com.cn/oldhouse/getSHYesterdaySell.action。このURLは将来変更される可能性があります。相手側がページを再設計したらどうなるでしょうか?

もし変更された場合は、ブラウザのデバッグツールを使用して変更箇所を見つけてください。初心者は「どうしてこんなにヘッダーが多いのか分かるの?」と疑問に思うかもしれません。ブラウザでcurlとしてコピーし、AIにRequestsライブラリに必要な形式に変換させましょう。AIはこのような作業に適しており、間違いも少なく、非常に効率的です。

上記のプログラムについてわからないことがあれば、AIに説明を求めることができます。結局のところ、ツールを使って問題を解決する能力が優れていることが成功の鍵です。

2. Prometheusをデプロイしてデータを自動収集する

上記のコードで既にメトリクスが生成されています。Prometheusをローカルコンピュータにデプロイする方法については、オンラインで多数のチュートリアルが公開されているので、ここでは詳しく説明しません。

上記のプログラム(収集クライアント)もローカルにデプロイされています。私は管理にはsupervisordを使用します。

 1➜ ershoufang sudo supervisorctl status shanghai
 2[sudo] 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設定
 3グローバル:
 4scrape_interval: 30m # スクレイピング間隔を15秒ごとに設定します。デフォルトは1分ごとです。
 5evaluation_interval: 15s # ルールを15秒ごとに評価します。デフォルトは1分ごとです。
 6# scrape_timeout はグローバルのデフォルト(10秒)に設定されています。
 7
 8#Alertmanager の設定
 9alerting:
10alertmanagers:
11- static_configs:
12- targets:
13# - alertmanager:9093
14
15# ルールを一度読み込み、グローバルの 'evaluation_interval' に従って定期的に評価します。
16rule_files:
17# - "first_rules.yml"
18# - "second_rules.yml"
19
20# スクレイピングするエンドポイントを1つだけ含むスクレイピング設定:
21# ここでは Prometheus 自身です。
22scrape_configs:
23# この設定からスクレイピングされるすべての時系列データには、ジョブ名がラベル `job=<job_name>` として追加されます。
24- job_name: "prometheus"
25
26# metrics_path のデフォルトは '/metrics'
27# scheme のデフォルトは 'http'
28
29static_configs:
30- target: ["localhost:9090"]
31
32- job_name: 'shanghai_second_hand_house'
33scrape_interval: 1h
34static_configs:
35- target: ['localhost:8000']

最後に追加する必要があるのは、shanghai_second_hand_house ジョブです。スクレイピング間隔を1時間に設定し、1時間に1回データを収集します。これは頻度が高すぎます。公共秩序を乱した罪で起訴され、5日間の拘留を受けるのは得策ではありません。 公共資源を無駄にせず、法を遵守する市民になりましょう。過剰なデータを収集した後にシステムをシャットダウンすると、誰もが迷惑を被ることになります。ご理解ください。

4. 結果の確認

ブラウザで http://localhost:9090 にアクセスしてください。スクリーンショットは以下のとおりです。

shanghai_house

グラフ表示に切り替え、積み上げグラフモードを使用してください。その他の設定については、上記のスクリーンショットをご覧ください。

結果には、同じ日に同じ値のサンプルポイントが複数含まれる場合があります。データは1時間ごとに収集されるため、これは大きな問題ではありません。1日の取引量が確認できれば十分です。

最近、平日は約800個が販売され、週末は1,400個と大幅に増加していることがわかります。昨年の取引量は概ね400~600個程度でしたが、正確な値は覚えていないため、データを保存しておくことにしました。

データ保持設定は3年(ストレージ保持期間3年)に設定しました。設定方法がわからないので、入力するのも面倒です。

もちろん、Prometheusに保存する代わりに、WeChatやメールアドレスに直接情報を送信することもできます。個人的には、この方法の方が自分に合っていると思っています。

ご質問がございましたら、WeChat公式アカウントをフォローしてメッセージを残してください。また、上記のインターフェースには取引エリアと合計取引価格も含まれているため、平均価格を計算できます。プログラムをカスタマイズすることで、複数の指標を提供できます。

最終更新日: Saturday, August 30, 2025

このシリーズの投稿:

翻訳: