【python】脱スマホ病!自分専用アプリを作ってみよう(コード付)



【python】脱スマホ病!自分専用アプリを作ってみよう(コード付)

コロナウイルスによるステイホームで、人生で一番長くスマホやタブレットを見ている方も多いのではないでしょうか。

また子供を持つ親なら「 YouTube ばかり見ないで欲しい」なんて思われた方も少なくないと思います(私もそのひとりです)。

そこで今回は、自分の気になる項目だけを抜粋してリスト表示できるウェブアプリを作成してみました。

レシピとしてご紹介しますので、 スマホ病で困っている方やプログラミングに興味ある方は参考にしてみてください。

プログラミング言語  Python
Web フレームワーク  Django

完成イメージ

目次
  1. 【python】脱スマホ病!自分専用アプリを作ってみよう(コード付)
  2. 自分専用アプリの効果
  3. 準備
  4. XMLから情報を入手し、表示させるまで
  5. DjangoにXML処理機能を追加
  6. XML以外からデータ取得
  7. まとめ

【python】脱スマホ病!自分専用アプリを作ってみよう(コード付)

自分専用アプリの効果

image

何を始めるにもモチベーションは大事ですよね。今回自分専用アプリで情報一覧ページを作ることによって、上図・上側の流れから下側の流れに変わる予定です。

従来はアプリを開いて、そして気になるチャンネルを開いたり、通知内容を開いて詳細ページを確認していたと思います。そのページ移動の間に広告だったりちょっと気になる内容のタイトルがあったりして、非常に横道に逸れやすい環境。また画面を切り替える毎に異なる情報が表示されて、「まだ他にも面白い情報あるかな?」と気になってやめられないのが現状でしょう。

その結果スマホを閲覧する時間が長くなり、また時間を決めてやめたとしても先ほど見ていた画面の内容が気になってまた開きたくなる、そしてまた気になる情報が脳に残る、この繰り返しによって スマホが手放せないというのが現状ではないでしょうか。

こうした従来の環境も上図・下側のように画面遷移の量を少なくすれば余計な情報に触れにくく、本来自分が欲しいと思う情報をスマートに入手・管理することが可能。 スマホを閉じるときも一応気になる項目はチェックした、と自分の中で区切りも着きますので、スマホへの依存性が低くなりました(私の場合)。

情報化社会への適応、という言葉はよく耳にしますが、具体的な話といえば商用モデルばかりですよね。ちょっとしたプログラミングの知識と時間があれば「スマホ病」から自分や家族を守ることもできると思いますので、ご興味ある方は本レシピを参考いただければ幸いです。

冒頭の見本レベルの内容までご紹介すると長くなりますので、本稿では基本的な内容だけご紹介させていただきます。コードは GitHub に上げていますので、ご興味ある方はご自身で解読&テストしてみてください。

準備

image

  • 気になるニュースや YouTube チャンネルのリストアップ
  • Pythonフレームワーク Diango の実行環境

一昔前までは RSS リーダーを使えば気になる情報はキャッチできていましたが、現在はブログやニュースだけでなく YouTube や Twitter、 Instagram などチェックしたい項目は非常に多岐にわたると思います。

そうした様々なプラットフォーム上の情報をキャッチするためには、プログラミング処理が欠かせません。 なるべくシンプルに済ませられないか検討しましたが、 Web フレームワークを使った処理が妥当と判断しました。

今回は Python の Django を使いますが Ruby on Rails や PHP のフレームワークなどでも同じような処理は可能と思います。

本気で自分専用の情報一覧サイトを作成公開しようと考えている方は、下記記事も合わせて参考にすると作成できると思いますよ。

DjangoでWebサービスをリリースする手順

XMLから情報を入手し、表示させるまで

いきなり Django に入るのではなく、一旦ブログやニュースフィードのデータを処理する所から確認していきます。

image

https://github.com/oshimamasara/blog-feeder

XML、少し特殊感のあるデータファイルですが、ブログ好きな方であれば一度は目にしたことがあるのではないでしょうか。

XML にはブログやニュースタイトルや記事の URL がたくさん含まれていますので、自分がチェックしたいニュースサイトやブログサイトが XML に対応していれば手っ取り早く”記事リスト”を入手することができます。

まず XML ファイルの処理の仕方はいくつかありますが、今回は比較的簡単に処理を手伝ってくれる Python ライブラリの「feedparser」を選択。 Django にXML ファイルの処理を実装する前に、 XML ファイルの処理工程を先に確認してみましょう。 Google Colaboratory で XML ファイルのデータを扱ってみたいと思います。

XML を処理するコード(Google Colaboratory)

image

上図のコードを今見る

!pip install feedparser

import feedparser
NewsFeed = feedparser.parse("https://knowledge.sakura.ad.jp/rss/")

NewsFeed

まず上図は Python & feedparser で XML ファイルを読み込んだ様子。 XML 内のデータが、 JSON 形式(辞書型)に変わったことが確認できます。

image

上図のコードを今見る

NewsFeed.keys()

len(NewsFeed['entries'])

NewsFeed['entries'][2].keys()

print(NewsFeed['entries'][2]['title'])
print(NewsFeed['entries'][2]['link'])
print(NewsFeed['entries'][2]['updated'])

そして xml ファイルから取得できた内容を順番に確認している様子が、上図になります。

まず最初にどこに今回欲しい記事のタイトルや URL が存在するかということを確認していきました。辞書型のデータを確認するステップとしてはまずはキーリストを把握しておきたいですよね。 キーリストは下記のコードで確認可能。

NewsFeed.keys()

(結果)
dict_keys(['feed', 'entries', 'bozo', 'headers', 'href', 'status', 'encoding', 'version', 'namespaces'])

この結果と XML 全体のデータを見ますと、entries という項目に今回欲しい記事のタイトルやリンクが存在することが確認できます。

そして試しにどれぐらいの量の記事が存在するかを下記コードで確認。

len(NewsFeed['entries'])

(結果)
15

すると 15 記事分の内容が含まれていることが確認できます。試しに 3番目の記事データを下記コードで確認。

NewsFeed['entries'][2].keys() 

(結果)
dict_keys(['id', 'title', 'title_detail', 'links', 'link', 'updated', 'updated_parsed', 'summary', 'summary_detail', 'authors', 'author', 'author_detail'])

そして下記コードで3番目の記事のタイトルと URL 日付を取得してみます。

print(NewsFeed['entries'][2]['title'])
print(NewsFeed['entries'][2]['link'])
print(NewsFeed['entries'][2]['updated'])

(結果)
ビデオ会議上の発言を音声認識で自動的にテキスト化してみよう
https://knowledge.sakura.ad.jp/24077/
2020-05-26T11:00:57+09:00

はいこれで Python で XML データを処理&入手できたことが確認できます。

ただこれだけでは、今回の目標である情報一覧ページ に対して情報が少ないので下記のようにループ文で欲しい量だけ XML からデータを抽出。

image

上図のコードを今見る

import feedparser

title_array = []
link_array = []
date_array = []

i = 0
while i < 3:
    feed_url = feedparser.parse("https://knowledge.sakura.ad.jp/rss/")
    title_array.append(feed_url['entries'][i]['title'])
    link_array.append(feed_url['entries'][i]['link'])
    date_array.append(feed_url['entries'][i]['updated'])
    i+=1

print(title_array)
print(link_array)
print(date_array)

今回は 3つだけの記事タイトルですが、状況に応じて 5つや 6つなど好みで量を変更すればいいでしょう。 またこの今のループ処理を”無限ループ”で定期的に周回すれば、常に新しい情報を入手することができます。

DjangoにXML処理機能を追加

image

Djangoで XML を処理する流れ(データベースなし)

まずは Django の views.py の部分で、先ほどの XML 処理を実行してみます。

URL の設定は事前に済ませておくものとして、下図のように XML データの処理を views.py に記述。

image

上図のコードを今見る

def myfeed(request):
    #return HttpResponse("あれ... トップにもどる " )
    title_array = []
    link_array = []
    date_array = []

    i = 0
    while i < 3:
        feed_url = feedparser.parse("https://engineer.dena.com/index.xml")
        title_array.append(feed_url['entries'][i]['title'])
        link_array.append(feed_url['entries'][i]['link'])
        date_array.append(feed_url['entries'][i]['published'])
        i+=1

    data_list = zip(title_array, link_array, date_array)
    context = {'data_list':data_list}
    template = 'myfeed/feed.html'
    return render(request, template, context)

そして XML から取得したタイトルや URL をテンプレートに引き渡すように処理を実行。

image

上図のコードを今見る

{% for data in data_list %}
  {{data.0}}
  <br>
  {{data.1}}
  <br>
  {{data.2}}
  <hr>
{% endfor %}

ここでのテンプレートのループ処理は少しわかりにくいかもしれませんが、 data.0data.1data.2 は views.py の 163行目 zip() 関数とリンク。 zip() 内の順番が 0、 1、 2 に割り当てられています。

これで一旦 XML から記事のタイトルや URL を取得して、 Web 上に表示できていますが、テキストリンクなどがセットされていませんのでちょっと❌ですよね(上図)。

テンプレートの処理を少し変更すると下図のように見やすい形となります。

http://localhost:8000/myfeed/myfeed2/

またこの処理内容を応用して XML の URL を複数にして処理することも可能。

http://localhost:8000/myfeed/myfeed3/

たくさんの XML のデータを一度に処理できることは分かりますが、ちょっとページが表示されるまでに時間がかかりますよね。今回 11 の XMLファイルを読み込み、結果表示するまでに 35秒ほどかかっています。

この問題については XML から取得するデータを言ったデータベースに保存して、ウェブページにアクセスがあった時だけデータベースからタイトルは URL を取得する方法が無難そう。 データベースの説明までして行くと文量的に厳しくなりますので、今回の XML データの処理はここまでとさせていただきます。

XML以外からデータ取得

image

「気になる Web サイトは XML を発行していない」「 YouTube の好きなチャンネルの最新情報が欲しい」「あの人のツイート情報も入手しておきたい」など XML 以外から欲しい情報も多々あると思います。

今回は XML 以外と YouTube の最新情報の取得サンプルをご紹介させていただきます。

XMLなしの場合

XML 以外から WEB 上のデータを取得する便利な方法としては、 「Web スクレイピング」があります。 Wix や Wantedly のブログサイトのタイトルを収集してみましたので、ご興味ある方は wantedly.pywix.py をチェックしてみてください。

基本的には HTML 上のタグやクラス名を参考に必要なデータを抽出しています。そして抽出したデータをデータベース(Postgres)に保存し、2回目のデータ抽出時はデータを上書き保存するようなセットとしました。

YouTubeからデータ取得

お気に入りの YouTube チャンネル の最新動画を入手する時は ”YouTube DATA API” が便利。 YouTube DATA API が初めてという方はこちらの「【データサイエンス】YouTubeのAPIを使ってYouTube内のデータを収集してみよう」という記事を参考にしてみてください。

そして YouTube DATA API を使って特定のチャンネルの最新情報を入手できたら、 XML、 Web スクレイピング同様にデータベースに一旦保存(実際のコード)。

後は Django の Views の部分で保存されている YouTube のタイトルや URL を適切に処理すれば、気になるチャンネルの一覧を表示することができます。

実際に公開しているサンプルが こちら になります。

このプログラムをベースに、英語部分に翻訳機能をつけたり、もっと YouTube 情報をリストアップすると、より使いやすく なりそうですね。

本稿でご紹介した内容のプログラムを動かす様子

AIエンジニアに必要なスキルが身に付く

CodeCampの無料体験はこちら

まとめ

今回の RSS の RSS フィードページ、実は ひとつ前の記事でご紹介した20 以上のテック系ブログ記事を、「どうすれば毎日チェックできる?」と考えた末に出来上がったもの。

"日々進化し続け、溢れる続ける情報をいかにうまく処理するか" というのも、これからの時代には必要となってくるスキルかもしれません。

「プログラミングとかデータベースができたらかっこいいな」と思いつつ、なかなか前に進めていない方、 進んでいる実感がわかない方は、一度 CodeCamp の無料体験レッスンを受けてみませんか? きっと新しい発見があると思いますよ。

関連記事

オシママサラ
この記事を書いた人
オシママサラ
\ 無料体験開催中!/自分のペースで確実に習得!
オンライン・プログラミングレッスンNo.1のCodeCamp