前回、ヌードボールペンの機能を実装しました。↓
今回は3つ目となる最後の機能「オオタニサンHR速報WEBスクレイピング機能」を実装したいと思います。
これについてもTwitterにて構想と結果を報告したところ、見事に、気持ちいほどのノンリアクションでしたのでクソ機能ということにはなります。。
ただし、M5StickCの核であるesp32の無線モジュールの恩恵を余すことなく、見事に性能を100%引き出せるような機能である事は違いないので、一見無駄に見えても実はM5StickCを使いこなせなければ実現できない、開発するにはハイレベルな知識と技術かつハイソサエティな人格も要求される機能なのですよフハハハハハ!!
。。
戯言はこの位にしておいて、まず仕組みから簡単にまとめようかと思います。
オオタニサンのHR更新情報をWEBから自動で受信する
WEBスクレイピング
M5StickCにはESP32が搭載されているので、他デバイスとWIFIやBluetoothでの無線通信が可能です。自信をAPに出来るのはもちろん、直接WEBに接続(他のAPを通じて)も可能です。
WEBスクレイピングというのは、WEBサイトから特定の条件に該当する内容だけを受信させる機能です。
主な例は、指定したWEBサイトからHTML文を走査し、<title>タグだけの全て受信する、等ですね。そうすれば主要ニュースのタイトルだけを羅列した情報を受け取る事ができます。
このように、自分の好みに合わせてWEBサイトから特定の情報のみを受信する事ができるんです。
仕組み
他のWIFI APに接続させて、ヤフーニュースからスポーツ情報をアクセスさせるプログラムを作ります。
micropythonには、webサーバーやAPポイント、他のAPに接続など無線通信に関するライブラリが一通り揃っていますので、これらを使えば簡単に出来ます。
ただし、ビューティフルソープ?だっけ?が使えないので、html文からタグを指定してのデータ受信が出来ません。
したがって、今回はオオタニサンのHR更新についての情報だけを知る事ができれば良しとします。
html文の一覧に「大谷」「〇〇号」を含む文は調べる事が出来るので、それがあれば”大谷ホームラン更新!”みたいな表示が出るようにしたいと思います。
ではプログラムを実装していきます。
プログラム実装
micropython
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 |
from m5stack import * import urequests import network from m5ui import * from uiflow import * i = 0 def buttonA_pressFor(): lcd.clear(lcd.BLACK) print("WIFI") global i wlan = network.WLAN(network.STA_IF) wlan.active(True) if not wlan.isconnected(): print('connecting to network...') wlan.connect('', '') while not wlan.isconnected(): pass print('network config:', wlan.ifconfig()) yahooHeadLineResponse = urequests.get('https://news.yahoo.co.jp/rss/topics/sports.xml') yahooHeadLine = yahooHeadLineResponse.text while(i < 100): if "大谷" and str(i) + "号" in yahooHeadLine: lcd.clear(lcd.BLACK) print("大谷" + str(i) + "号!") M5TextBox(24, 124, "Otanisan Hits!", lcd.FONT_Default, 0xFFFFFF, rotate=270) M5TextBox(40, 124, str(i) + "th Home Run!", lcd.FONT_Default, 0xFFFFFF, rotate=270) i = i + 1 i = 0 btnA.pressFor(0.8, buttonA_pressFor) |
初めに必要なライブラリをインポートしています。
ボタンA長押しの関数内で、M5StickCを指定のアクセスポイントに接続~WEBスクレイピングもどきを実行しています。
wlan.connect(”, ”)は接続先のAPの情報で、第一引数にSSID,第二引数にpassを記述しておきます。
接続が完了すればprint(‘network config:’, wlan.ifconfig()) で、通知がでます。
yahooHeadLineResponse = urequests.get(‘https://news.yahoo.co.jp/rss/topics/sports.xml’) で、ニュースのデータを受信し、yahooHeadLine = yahooHeadLineResponse.text でxmlからtextデータに変更しています。
続くループで、受信したニュースのtextデータ内に「大谷」「号」のAND検索をかけています。該当する文字列があればHRを更新したと想定できるので、M5TextBox()でM5StickCに更新されたと表示させます。
該当する文字列が無ければ、何もおきません(-_-;)ここはなにか表示させたほうがいいかもですね。
ちなみに、ループをiで回していますが、これはオオタニサンが1日に3発打ったりするので、一番数の多いHR数を表示させるためです。かなり強引ですが。。
動作確認
では、動作確認をしてみます。
オオタニサンがHRを更新していれば、ヤフーニュースに反映しているはずですので、Aの長押しで↓のような表示がでるはずです。
次回は、時計、ヌードボールペン、オオタニサンHR速報WEBスクレイピング、この3つの機能を1つにまとめて完成させたいと思います。