広報は外部に開かれた窓なので、内部にとっては情報を収集する役割も担っています。学校マネジメントにとってはこの「情報収集」は重要な広報の役割なのです。特に文部科学省の補助金の動きや他大学の動きは常にアンテナを張っておきたいものです。しかし、忙しい広報担当者にとっては細かなニュースまでチェックできません。

そこでできるだけお金をかけずに自動的にニュースをチェックできないかとGKB事務局では考えました。

RSSの利用はサイトにアクセスしてコンテンツを直接読むスクレーピングのようにサイトに負荷をかけることがありません。

今話題のchatGPTプログラミングを使ってプログラムを作ってみました。Pythonプログラミングの初心者が作ることを想定しました。

まず「RSSを受信して、そこからあるキーワードを含むものだけを抽出するプログラムを書けますか」と依頼してみました。chatGPTは月20ドルのchatGPTプラスを使っています。ModelはDefault (GPT-3.5)です。

chatGPT

はい、可能です。以下は、Pythonを使用してRSSフィードから指定されたキーワードを含むアイテムを抽出する例です。

pythonCopy codeimport feedparser

# RSSフィードのURLと検索キーワードを指定
feed_url = "https://example.com/rss"
search_keyword = "キーワード"

# RSSフィードを取得し、アイテムを検索する
feed = feedparser.parse(feed_url)
matched_items = [item for item in feed.entries if search_keyword in item.title or search_keyword in item.summary]

# 抽出されたアイテムを表示する
for item in matched_items:
    print("タイトル:", item.title)
    print("リンク:", item.link)
    print("概要:", item.summary)
    print("--------")

このプログラムでは、feedparserライブラリを使用してRSSフィードを解析し、指定されたキーワードを含むアイテムをフィルタリングしています。matched_itemsリストにフィルタリングされたアイテムが格納され、forループを使用してそれらを表示しています。

このプログラムを実行する前に、feedparserライブラリをインストールする必要があります。以下のコマンドを使用してインストールできます。

Copy codepip install feedparser

また、feed_urlsearch_keyword変数を、実際のRSSフィードのURLと検索するキーワードに置き換える必要があります。
——-
質問:上記プログラムの「リンク」の部分にURLリンクを入れるにはどうすればいいですか。

ChatGPT
RSSフィードのアイテムには通常、linkという属性があり、それにアイテムのURLが含まれています。プログラムの中でitem.linkを表示することで、アイテムのURLを表示することができます。
ただし、リンクをクリックしても何も起こらない場合があるかもしれません。これは、フィード提供者がlink属性にフィード内の相対URLを使用している場合があるためです。この場合、相対URLをフルURLに変換する必要があります。
以下は、urljoin関数を使用して相対URLをフルURLに変換する方法の例です。

pythonCopy codeimport feedparser
from urllib.parse import urljoin

# RSSフィードのURLと検索キーワードを指定
feed_url = "https://example.com/rss"
search_keyword = "キーワード"

# RSSフィードを取得し、アイテムを検索する
feed = feedparser.parse(feed_url)
matched_items = [item for item in feed.entries if search_keyword in item.title or search_keyword in item.summary]

# 抽出されたアイテムを表示する
for item in matched_items:
    print("タイトル:", item.title)
    print("リンク:", urljoin(item.link, feed.feed.link))
    print("概要:", item.summary)
    print("--------")


このプログラムでは、urljoin関数を使用して、item.linkとfeed.feed.linkを結合して相対URLをフルURLに変換しています。こうすることで、クリックしたときに正しいURLにリダイレクトされるようになります。
--------------------------
質問:anacondaで上記プログラムを実行するにはどうすればいいですか

ChatGPT

Anaconda環境で上記のプログラムを実行するには、以下の手順を実行する必要があります。

Anacondaをインストールします。

condaまたはanacondaコマンドを使用して、Python仮想環境を作成します。以下のコマンドを使用すると、myenvという名前の仮想環境を作成できます。

conda create --name myenv python

仮想環境をアクティブにします。

conda activate myenv

feedparserライブラリをインストールします。

conda install feedparser

テキストエディターを開き、上記のプログラムをコピーして、新しいファイルに貼り付けます。

ファイルを保存し、ファイル名をrss_parser.pyなどに変更します。

コマンドプロンプトまたはターミナルを開き、以下のコマンドを入力してプログラムを実行します。

python rss_parser.py

これで、Anaconda環境でRSSフィードからキーワードを抽出するプログラムを実行できます。ただし、プログラム内のRSSフィードのURLと検索キーワードを、実際のフィードのURLとキーワードに置き換える必要があります。

------------------

ここからプログラムをチューニングしていきます。まず複数キーワードが指定できるようにします。
------------------
質問:上記プログラムで複数のキーワードを指定するにはどうすればいいですか

ChatGPT

複数のキーワードを指定するには、search_keyword変数にリストを使用することができます。以下は、search_keywordに複数のキーワードを含むリストを指定して、そのうちいずれかのキーワードを含むRSSフィードのアイテムを抽出するプログラムの例です。

pythonCopy codeimport feedparser

# RSSフィードのURLと検索キーワードを指定
feed_url = "https://example.com/rss"
search_keywords = ["キーワード1", "キーワード2", "キーワード3"]

# RSSフィードを取得し、アイテムを検索する
feed = feedparser.parse(feed_url)
matched_items = [item for item in feed.entries if any(keyword in item.title or keyword in item.summary for keyword in search_keywords)]

# 抽出されたアイテムを表示する
for item in matched_items:
    print("タイトル:", item.title)
    print("リンク:", item.link)
    print("概要:", item.summary)
    print("--------")

このプログラムでは、search_keywords変数に複数のキーワードを含むリストを指定しています。any関数を使用して、各アイテムがリスト内のいずれかのキーワードを含むかどうかを確認し、matched_itemsリストに格納されます。

また、ifステートメントの条件式で、any関数を使用することで、複数のキーワードのうちいずれかを含むアイテムをフィルタリングしています。
これで、複数のキーワードを指定してRSSフィードのアイテムを抽出することができます。
---------------------------
質問:複数のRSSサイトを指定する場合はどうすればいいですか

ChatGPT

複数のRSSサイトを指定するには、feed_url変数にRSSフィードのURLを含むリストを指定し、それらのフィードからアイテムを抽出する必要があります。以下は、複数のRSSフィードから指定されたキーワードを含むアイテムを抽出するプログラムの例です。
pythonCopy codeimport feedparser

# RSSフィードのURLと検索キーワードを指定
feed_urls = ["https://example.com/rss1", "https://example.com/rss2", "https://example.com/rss3"]
search_keyword = "キーワード"

# 各RSSフィードからアイテムを取得し、検索キーワードを含むアイテムをフィルタリングする
matched_items = []
for feed_url in feed_urls:
    feed = feedparser.parse(feed_url)
    matched_items += [item for item in feed.entries if search_keyword in item.title or search_keyword in item.summary]

# 抽出されたアイテムを表示する
for item in matched_items:
    print("タイトル:", item.title)
    print("リンク:", item.link)
    print("概要:", item.summary)
    print("--------")

このプログラムでは、feed_urls変数に複数のRSSフィードのURLを含むリストを指定しています。forループを使用して、各RSSフィードからアイテムを取得し、matched_itemsリストにフィルタリングされたアイテムを追加します。

最後に、forループの後にmatched_itemsリストを使用して、抽出されたアイテムを表示しています。

このように、複数のRSSフィードからアイテムを抽出する場合は、各フィードからアイテムを取得して、それらを1つのリストにまとめる必要があります。
--------------------
そしてこれでもかとお願い。
質問:上記のものを一つにまとめることはできますか

ChatGPT

はい、複数のRSSフィードから指定されたキーワードを含むアイテムを抽出し、それらを1つのリストにまとめることができます。以下は、それを行うプログラムの例です。
----------これをrss_parser.pyとしてファイルを作ります-------

pythonCopy codeimport feedparser

# RSSフィードのURLと検索キーワードを指定
feed_urls = ["https://example.com/rss1", "https://example.com/rss2", "https://example.com/rss3"]
search_keyword = "キーワード"

# 各RSSフィードからアイテムを取得し、検索キーワードを含むアイテムをフィルタリングする
matched_items = []
for feed_url in feed_urls:
    feed = feedparser.parse(feed_url)
    matched_items += [item for item in feed.entries if search_keyword in item.title or search_keyword in item.summary]

# 抽出されたアイテムを表示する
for item in matched_items:
    print("タイトル:", item.title)
    print("リンク:", item.link)
    print("概要:", item.summary)
    print("--------")
-----------------ここまで-----------

このプログラムでは、先ほど紹介したものと同じように、feed_urls変数に複数のRSSフィードのURLを含むリストを指定しています。各フィードからアイテムを取得し、matched_itemsリストにフィルタリングされたアイテムを追加しています。

最後に、matched_itemsリストを使用して、抽出されたアイテムを表示しています。

これにより、複数のRSSフィードからアイテムを抽出し、それらを1つのリストにまとめることができます。


>python rss_parser.py で
実際に動きます。

feed_urls = ["https://example.com/rss1", "https://example.com/rss2", "https://example.com/rss3"]
search_keyword = "キーワード"["キーワード1", "キーワード2", "キーワード3"]
はそれぞれ設定してください。

By 山下 研一

学校広報ソーシャルメディア活用勉強会(通称 GKB48) 呼びかけ人・事務局長 株式会社シンクアップ 共同創業者・CMO NPO法人マナビバ 理事長