1

新しいNexus ファクトリー イメージがリリースされるたびに、Pushbullet チャネルに更新をプッシュするために使用しているスクリプトを作成しました。そのページの最初の 11 台のデバイスごとに個別のチャネルが存在し、かなり複雑なスクリプトを使用して更新を監視しています。完全なセットアップはこちら(具体的にはこのスクリプト) ですが、以下にスクリプトを簡単に要約します。私の質問は次のとおりです。複数の障害点が発生しやすいため、これは明らかに正しい方法ではありません。これを行うためのより良い方法は何でしょうか? 私は Python に固執することを好みますが、他の言語がよりシンプルで優れている場合は、他の言語にもオープンです。

(この質問は、私が今夜 apache 2.4 の設定を更新したという事実によって促されました。それによりurlwatch、 によって監視されているローカル ファイルの出力がわずかに変更されたようです。そのため、11 チャンネルすべてに誤った更新がプッシュされました。)

基本的なスクリプト機能 (一部の重要でない部分は含まれていません):

  • 完全なモデル名に関連付けられた各デバイスのコードネームのディクショナリを作成します
  • リクエストを使用して既存の Nexus Factory イメージ ページを取得する
  • ソースコードからbs4オブジェクトを作る
  • ディクショナリ (ループ) 内の 11 個のデバイスのそれぞれについて、次の手順を実行します。
    • デバイスのパブリック Web ディレクトリでページを開く/作成する
    • bs4 を使用してフィルター処理された、そのページにソースを書き込みます。str(soup.select("h2#" + dev + " ~ table")[0])
    • ページで呼び出しurlwatchて更新を確認し、出力を一時ファイルに保存します
    • If temp file size is > 0 then the page has changed, so push update to the appropriate channel
    • Remove webpage and temp file

A thought that I had while typing this question: Would a possible solution be to save each current version string (for example: 5.1.0 (LMY47I)) as a pickled variable, then if urlwatch detects a difference it would compare the new version string to the pickled one and only push if they're different? I would throw regex matching in as well to ensure that the new format matches the old format and just has updated data, but could this at least be a good temporary measure to try to prevent future false alarms?

4

1 に答える 1

0

スクレイピングは本質的に脆弱ですが、ソース形式を変更しなければ、この場合は非常に簡単です。Web ページをデータ構造に解析する必要があります。これにはbs4を使用しても問題ありません。最終結果は python 辞書になるはずです:

{
 'mantaray': {
     '4.2.2 (JDQ39)': {'link': 'https://...'},
     '4.3 (JWR66Y)': {'link': 'https://...'},
 },
 ...
}

この構造を で保存しますjson.dumps。ページを解析するたびに、同様のデータ構造を生成し、ディスク上にあるデータ構造と比較できます (完了後に保存されたものを毎回更新します)。

あとは、データ構造を比較するだけです。すべてのモデルを反復して、ページの現在のバージョンにある各バージョンが以前のバージョンに存在することを確認できます。そうでない場合は、新しいバージョンがあります。

また、解析を自分で行う代わりに、https://www.kimonolabs.com/を使用して、使いやすい API を生成することもできます。

于 2015-05-12T17:05:31.267 に答える