![見出し画像](https://assets.st-note.com/production/uploads/images/59890436/rectangle_large_type_2_a166bd86d9aace4ddd7fbfd0dbfb2739.png?width=1200)
Pythonを使ってお気に入りサイトのRSSを取得する①
Webサイトには、新着情報を配信するRSSという仕組みを利用しているところがあります。
これをPythonを使って、取得するということを今日は書いていきます。
なお、ここに正規表現や、ファイル書き込み、更にバッチファイル等と組み合わせれば自動的に新着情報を取得するということも可能です。
RSSリーダーを使っているけど、興味がない記事もわんさか表示されてしまう・・・という私自身の悩みを解決するため、何回かに分けてRSSリーダーを自作してしまえないか・・・?と思いいたったものです。
今日はまず、RSSを取得して記事タイトル・リンク・記事サマリーを取り出してみます。
1. feedparser を用意する
pip installでfeedparserモジュールをインストールします。
pip install feedparser
2. 新着記事を取得したいサイトのRSSのURLを調べる
今回はアイティメディアの新着記事を取得したいと思います。
サイトの最下部にある以下から、RSSを選択すると・・・
以下のページにたどり着きます。
一番上にある、「ITmedia 総合記事一覧」を選択すると・・・
こんなページが表示されると思いますが、欲しいのはアドレスバーにあるURLです。これをコピーします。
3. feedparserでRSSを取得する
まずは、以下のコードを試してみましょう。
変数urlには先ほどコピーしたURLを格納しています。
import feedparser
import pprint
url = "https://rss.itmedia.co.jp/rss/2.0/itmedia_all.xml"
f = feedparser.parse(url)
pprint.pprint(f)
feedperserのparseメソッドで、RSSを取得しています。
pprintはデータを整列させて出力するためのモジュールです。
表示結果は、以下のようになると思います。(長いので中略してます)
{'bozo': False,
'encoding': 'utf-8',
'entries': [{'link': 'https://www.itmedia.co.jp/business/articles/2108/28/news020.html',
'links': [{'href': 'https://www.itmedia.co.jp/business/articles/2108/28/news020.html',
'rel': 'alternate',
'type': 'text/html'}],
'published': 'Sat, 28 Aug 2021 10:00:00 +0900',
'published_parsed': time.struct_time(tm_year=2021, tm_mon=8, tm_mday=28, tm_hour=1, tm_min=0, tm_sec=0, tm_wday=5, tm_yday=240, tm_isdst=0),
'summary': 'スタジオアリスは、全国の0歳から2歳の子どもを持つ親を対象に「子どものお出かけと服装に関する調査」を実施した。秋に出かけたい場所はどこか、子どもの年齢で違うのか、出かけてよかった場所はどこかを聞いた。',
'summary_detail': {'base': 'https://rss.itmedia.co.jp/rss/2.0/itmedia_all.xml',
'language': None,
'type': 'text/html',
'value': 'スタジオアリスは、全国の0歳から2歳の子どもを持つ親を対象に「子どものお出かけと服装に関する調査」を実施した。秋に出かけたい場所はどこか、子どもの年齢で違うのか、出かけてよかった場所はどこかを聞いた。'},
'title': '[ITmedia ビジネスオンライン] 秋に子どもと出かけてよかった場所\u3000'
'3位「室内遊び場」、2位「公園・総合公園」、1位は?',
'title_detail': {'base': 'https://rss.itmedia.co.jp/rss/2.0/itmedia_all.xml',
'language': None,
'type': 'text/plain',
'value': '[ITmedia ビジネスオンライン] '
'秋に子どもと出かけてよかった場所\u3000'
'3位「室内遊び場」、2位「公園・総合公園」、1位は?'}},
{'link': 'https://www.itmedia.co.jp/enterprise/articles/2108/28/news022.html',
'links': [{'href': 'https://www.itmedia.co.jp/enterprise/articles/2108/28/news022.html',
'rel': 'alternate',
'type': 'text/html'}],
'published': 'Sat, 28 Aug 2021 07:00:00 +0900',
'published_parsed': time.struct_time(tm_year=2021, tm_mon=8, tm_mday=27, tm_hour=22, tm_min=0, tm_sec=0, tm_wday=4, tm_yday=239, tm_isdst=0),
'summary': 'Ciscoは、複数の製品に関するセキュリティドバイザリを発行した。今回発表された脆弱性の中には深刻度が緊急(Critical)に分類されるものもあるため注意が必要だ。必要に応じてアップデートを適用してほしい。',
'summary_detail': {'base': 'https://rss.itmedia.co.jp/rss/2.0/itmedia_all.xml',
'language': None,
'type': 'text/html',
'value': 'Ciscoは、複数の製品に関するセキュリティドバイザリを発行した。今回発表された脆弱性の中には深刻度が緊急(Critical)に分類されるものもあるため注意が必要だ。必要に応じてアップデートを適用してほしい。'},
'title': '[ITmedia エンタープライズ] Cisco製品に複数の脆弱性\u3000'
'セキュリティアドバイザリの確認を',
'title_detail': {'base': 'https://rss.itmedia.co.jp/rss/2.0/itmedia_all.xml',
'language': None,
'type': 'text/plain',
'value': '[ITmedia エンタープライズ] '
'Cisco製品に複数の脆弱性\u3000'
'セキュリティアドバイザリの確認を'}},
'etag': '"6f52-5ca947a9ab580-gzip"',
'feed': {'language': 'ja',
'link': 'https://www.itmedia.co.jp/',
'links': [{'href': 'https://www.itmedia.co.jp/',
'rel': 'alternate',
'type': 'text/html'}],
'published': 'Sat, 28 Aug 2021 10:25:00 +0900',
'published_parsed': time.struct_time(tm_year=2021, tm_mon=8, tm_mday=28, tm_hour=1, tm_min=25, tm_sec=0, tm_wday=5, tm_yday=240, tm_isdst=0),
'rights': 'Copyright (c) 2021 ITmedia, Inc. All Rights Reserved.',
'rights_detail': {'base': 'https://rss.itmedia.co.jp/rss/2.0/itmedia_all.xml',
'language': None,
'type': 'text/plain',
'value': 'Copyright (c) 2021 ITmedia, Inc. All '
'Rights Reserved.'},
'subtitle': 'ITmediaブランドのメディアの総合記事一覧です。',
'subtitle_detail': {'base': 'https://rss.itmedia.co.jp/rss/2.0/itmedia_all.xml',
'language': None,
'type': 'text/html',
'value': 'ITmediaブランドのメディアの総合記事一覧です。'},
'title': 'ITmedia 総合記事一覧',
'title_detail': {'base': 'https://rss.itmedia.co.jp/rss/2.0/itmedia_all.xml',
'language': None,
'type': 'text/plain',
'value': 'ITmedia 総合記事一覧'}},
'headers': {'accept-ranges': 'bytes',
'cache-control': 'max-age=1800',
'connection': 'close',
'content-encoding': 'gzip',
'content-length': '9013',
'content-type': 'application/xml',
'date': 'Sat, 28 Aug 2021 01:28:12 GMT',
'etag': '"6f52-5ca947a9ab580-gzip"',
'expires': 'Sat, 28 Aug 2021 01:58:12 GMT',
'last-modified': 'Sat, 28 Aug 2021 01:25:44 GMT',
'server': 'nginx',
'strict-transport-security': 'max-age=31536000',
'vary': 'Accept-Encoding,User-Agent'},
'href': 'https://rss.itmedia.co.jp/rss/2.0/itmedia_all.xml',
'namespaces': {},
'status': 200,
'updated': 'Sat, 28 Aug 2021 01:25:44 GMT',
'updated_parsed': time.struct_time(tm_year=2021, tm_mon=8, tm_mday=28, tm_hour=1, tm_min=25, tm_sec=44, tm_wday=5, tm_yday=240, tm_isdst=0),
'version': 'rss20'}
辞書型で値が返されていて、entriesというキーに対する値として、記事情報が格納されているのが分かります。
4. 取得したデータを理解する
entriesというキーには、リスト型が格納されており、リスト内には更に辞書型で複数の記事情報が格納されています。
リスト型なので、forループ文を使って、一つ一つ記事データ(辞書型)を取り出して、辞書内のキーで、欲しい情報を取得していけばいいわけです。
まずは、forループで一つ記事情報を取り出してみましょう。
import feedparser
import pprint
url = "https://rss.itmedia.co.jp/rss/2.0/itmedia_all.xml"
f = feedparser.parse(url)
for article in f['entries'][0:1]:
pprint.pprint(article)
出力結果を見てみると・・・
{'link': 'https://www.itmedia.co.jp/business/articles/2108/28/news020.html',
'links': [{'href': 'https://www.itmedia.co.jp/business/articles/2108/28/news020.html',
'rel': 'alternate',
'type': 'text/html'}],
'published': 'Sat, 28 Aug 2021 10:00:00 +0900',
'published_parsed': time.struct_time(tm_year=2021, tm_mon=8, tm_mday=28, tm_hour=1, tm_min=0, tm_sec=0, tm_wday=5, tm_yday=240, tm_isdst=0),
'summary': 'スタジオアリスは、全国の0歳から2歳の子どもを持つ親を対象に「子どものお出かけと服装に関する調査」を実施した。秋に出かけたい場所はどこか、子どもの年齢で違うのか、出かけてよかった場所はどこかを聞いた。',
'summary_detail': {'base': 'https://rss.itmedia.co.jp/rss/2.0/itmedia_all.xml',
'language': None,
'type': 'text/html',
'value': 'スタジオアリスは、全国の0歳から2歳の子どもを持つ親を対象に「子どものお出かけと服装に関する調査」を実施した。秋に出かけたい場所はどこか、子どもの年齢で違うのか、出かけてよかった場所はどこかを聞いた。'},
'title': '[ITmedia ビジネスオンライン] 秋に子どもと出かけてよかった場所\u3000'
'3位「室内遊び場」、2位「公園・総合公園」、1位は?',
'title_detail': {'base': 'https://rss.itmedia.co.jp/rss/2.0/itmedia_all.xml',
'language': None,
'type': 'text/plain',
'value': '[ITmedia ビジネスオンライン] 秋に子どもと出かけてよかった場所\u3000'
'3位「室内遊び場」、2位「公園・総合公園」、1位は?'}}
これが辞書型の記事情報です。
タイトルは 'title'、リンクは 'link' 、サマリーは'summary' であることが分かります。これで、あとはキーごとに値を抽出するだけです。
5. タイトル・リンク・サマリーを抽出する
以下のコードで抽出が可能です。
import feedparser
import pprint
url = "https://rss.itmedia.co.jp/rss/2.0/itmedia_all.xml"
f = feedparser.parse(url)
for article in f['entries']:
print(article['title'])
print(article['link'])
print(article['summary'])
print('\n')
実行結果は以下のようになります。(途中でカット)
[ITmedia ビジネスオンライン] 秋に子どもと出かけてよかった場所 3位「室内遊び場」、2位「公園・総合公園」、1位は?
https://www.itmedia.co.jp/business/articles/2108/28/news020.html
スタジオアリスは、全国の0歳から2歳の子どもを持つ親を対象に「子どものお出かけと服装に関する調査」を実施した。秋に出かけたい場所はどこか、子どもの年齢で違うのか、出かけてよかった場所はどこかを聞いた。
[ITmedia ビジネスオンライン] USJ、2年ぶりにハロウィーンイベント開催へ 入場者数の制限で「三密対策」徹底
https://www.itmedia.co.jp/business/articles/2108/28/news011.html
ユニバーサル・スタジオ・ジャパン(USJ)が2年ぶりにハロウィーンイベントを開催すると発表した。
[ITmedia News] ジョニー・アイブっぽくヘッドホンジャックを熱く語る「Pixel 5a(5G)」のCM動画
https://www.itmedia.co.jp/news/articles/2108/28/news030.html
Googleが日米でのみ発売した「Pixel 5a(5G)」の紹介動画を公開した。Appleの元最高デザイン責任者、ジョニー・アイブ氏に似せた語り口で、3.5mmヘッドホンジャックを熱く静かに語る。
[ITmedia ビジネスオンライン] ホリエモンが斬る「ビットコインで大損した人たちを笑えない事情」
https://www.itmedia.co.jp/business/articles/2108/28/news021.html
「日本の義務教育で行われている教育の大半は、意味がない」と語るホリエモン。「ビットコインで大損した例は、笑い話ではない」と話す。
[ITmedia News] Microsoft、「Windows 11」にアップデートできるプロセッサを少し追加 チェックプログラムも再公開へ
https://www.itmedia.co.jp/news/articles/2108/28/news029.html
Microsoftは6月に発表した「Windows 11」にアップデートするための最低要件を見直し、サポートするプロセッサを少し増やした。また、一時的に削除した「PC 正常性チェックアプリ」の改善版を数週間中に再公開する。
次回は、抽出した記事から自分の気になるキーワードを含むものだけを抽出する方法について記載したいと思います。