知りたい情報を、効率的に収集したい時ってありませんか?例えば、最近のアプリに関する情報を知りたいとか株価の情報を知りたいとか色々あると思います!
それらの情報をブラウザ上から1記事ずつ追っていくのは大変ですよね。そこで、この記事ではPythonのfeedparserというライブラリを使用したスクレイピングを紹介します。
feedparserのインストール
pipコマンドを使用して、以下のコマンドでインストールします。
pip install feedparser
ちなみに、私が実行した環境のversionは以下になります。
- Python: 3.9.3
- pip: 22.2.2
- feedparser: 6.0.10
概要とサンプルコード
今回はGIGAZINE さんのRSSフィードのデータを取得しています。(サーバに過度に負荷をかける等の行為にはお気をつけください。)
「アプリ」というキーワードがタイトルに含まれる、昨日の記事を取得する例になります。さくっとやり方を見たい方は、以下サンプルコードをご覧下さい。
from feedparser import parse
import datetime
# URL定義
URL_LIST = [
'https://gigazine.net/news/rss_2.0/'
]
# 探したいキーワードを入れる
KEYWORD = 'アプリ'
def get_articles_by_scraping():
jtz_datetime_yesterday = datetime.datetime.utcnow() + datetime.timedelta(hours=9) - datetime.timedelta(days=1)
yesterday = jtz_datetime_yesterday.date()
articles = []
for url in URL_LIST:
for entry in parse(url).entries:
if KEYWORD in entry.title and get_date(entry.published_parsed) == yesterday:
published_jtz_datetime = get_datetime(entry.published_parsed)
articles.append({'title': entry.title, 'link': entry.link, 'datetime': published_jtz_datetime.strftime('%Y-%m-%d %H:%M:%S')})
return articles
def get_datetime(parser_date):
utc_datetime = datetime.datetime(
parser_date.tm_year,
parser_date.tm_mon,
parser_date.tm_mday,
parser_date.tm_hour,
parser_date.tm_min,
parser_date.tm_sec
)
jtz_datetime = utc_datetime + datetime.timedelta(hours=9)
return jtz_datetime
def get_date(parser_date):
jtz_datetime = get_datetime(parser_date)
return jtz_datetime.date()
if __name__ == "__main__":
scraping_articles = get_articles_by_scraping()
for article in scraping_articles:
print(article)
コード解説
ライブラリのimport
from feedparser import parse
import datetime
feedparser, 及び日時関連の処理で使用するdatetimeをimportしています。
情報の定義
# URL定義
URL_LIST = [
'https://gigazine.net/news/rss_2.0/'
]
# 探したいキーワードを入れる
KEYWORD = 'アプリ'
スクレイピングに使用するurlとキーワードを定義しています。urlは複数のサイトを含めることを可能な形にしています。
これらは、後のget_articles_by_scraping()
で使用します。
スクレイピングを行う関数
def get_articles_by_scraping():
jtz_datetime_yesterday = datetime.datetime.utcnow() + datetime.timedelta(hours=9) - datetime.timedelta(days=1)
yesterday = jtz_datetime_yesterday.date()
articles = []
for url in URL_LIST:
for entry in parse(url).entries:
if KEYWORD in entry.title and get_date(entry.published_parsed) == yesterday:
print('---type', type(entry))
print(entry)
published_jtz_datetime = get_datetime(entry.published_parsed)
articles.append({'title': entry.title, 'link': entry.link, 'datetime': published_jtz_datetime.strftime('%Y-%m-%d %H:%M:%S')})
title
にKEYWORD
が含まれておりpublished_parsed
が昨日の記事を、リストに入れて返却しています。(title
, link
, datetime
の情報を返却するようにしています。)
for entry in parse(url).entries
箇所で、フィードをparseし記事情報が入っているentries
(リスト)に対してループ処理を行なっています。
また、それぞれのentry
はFeedParserDict
のclassとなっており以下のような要素が含まれています。
print(type(entry))
# <class 'feedparser.util.FeedParserDict'>
print(entry)
# {'title': 'スマホアプリ経由でユーザーの位置情報を追跡する大規模監視ツール「Fog Reveal」をアメリカの地方警察が使用、一体どこまで詳細な追跡が可能なのかがユーザーマニュアルから明らかに',
# 'title_detail': {'type': 'text/plain', 'language': None, 'base': 'https://gigazine.net/news/rss_2.0/', 'value': 'スマホアプリ経由でユーザーの位置情報を追跡する大規模監視ツール「Fog Reveal」をアメリカの地方警察が使用、一体どこまで詳細な追跡が可能なのかがユーザーマニュアルから明らかに'},
# 'links': [{'rel': 'alternate', 'type': 'text/html', 'href': 'https://gigazine.net/news/20220902-cops-use-mass-surveillance-tool-fog-reveal/'}],
# 'link': 'https://gigazine.net/news/20220902-cops-use-mass-surveillance-tool-fog-reveal/',
# 'id': 'https://gigazine.net/news/20220902-cops-use-mass-surveillance-tool-fog-reveal/',
# 'guidislink': False,
# 'summary': '電子フロンティア財団(EFF)の調査から、アメリカの地方警察が市民のスマートフォンにインストールされたアプリから収集されたデータに基づき、令状なしで個々のデバイスを追跡することができてしまう「Fog Reveal」というツールを購入・使用していることが明らかになっています。このFog Revealのユーザーマニュアルが公開されており、一体どの程度詳細に特定の人物を追跡できるかが判明しました。<p><b><a href="https://gigazine.net/news/20220902-cops-use-mass-surveillance-tool-fog-reveal/">続きを読む...</a></b></p>',
# 'summary_detail': {'type': 'text/html', 'language': None, 'base': 'https://gigazine.net/news/rss_2.0/', 'value': '電子フロンティア財団(EFF)の調査から、アメリカの地方警察が市民のスマートフォンにインストールされたアプリから収集されたデータに基づき、令状なしで個々のデバイスを追跡することができてしまう「Fog Reveal」というツールを購入・使用していることが明らかになっています。このFog Revealのユーザーマニュアルが公開されており、一体どの程度詳細に特定の人物を追跡できるかが判明しました。<p><b><a href="https://gigazine.net/news/20220902-cops-use-mass-surveillance-tool-fog-reveal/">続きを読む...</a></b></p>'},
# 'published': 'Fri, 02 Sep 2022 16:00:00 +0900',
# 'published_parsed': time.struct_time(tm_year=2022, tm_mon=9, tm_mday=2, tm_hour=7, tm_min=0, tm_sec=0, tm_wday=4, tm_yday=245, tm_isdst=0),
# 'tags': [{'term': 'ソフトウェア, セキュリティ,', 'scheme': None, 'label': None}],
# 'updated': '2022-09-02T16:00:00+09:00',
# 'updated_parsed': time.struct_time(tm_year=2022, tm_mon=9, tm_mday=2, tm_hour=7, tm_min=0, tm_sec=0, tm_wday=4, tm_yday=245, tm_isdst=0)}
全てのサイトが、完全に同じ項目でフィードを配信している訳ではないことにご注意ください。
datetime処理
def get_datetime(parser_date):
utc_datetime = datetime.datetime(
parser_date.tm_year,
parser_date.tm_mon,
parser_date.tm_mday,
parser_date.tm_hour,
parser_date.tm_min,
parser_date.tm_sec
)
jtz_datetime = utc_datetime + datetime.timedelta(hours=9)
return jtz_datetime
def get_date(parser_date):
jtz_datetime = get_datetime(parser_date)
return jtz_datetime.date()
それぞれpublished_parsed
を受け取ること前提で処理を記載しています。(以下がデータ例)
'published_parsed': time.struct_time(tm_year=2022, tm_mon=9, tm_mday=2, tm_hour=7, tm_min=0, tm_sec=0, tm_wday=4, tm_yday=245, tm_isdst=0),
get_datetime(parser_date)
, get_date(parser_date)
では、それぞれ日本時間のdatetime, dateを返却しています。
実行箇所
if __name__ == "__main__":
scraping_articles = get_articles_by_scraping()
for article in scraping_articles:
print(article)
スクレイピングで取得した結果を出力しています。以下が、2022/9/3に取得した結果です。
{'title': 'スマホアプリ経由でユーザーの位置情報を追跡する大規模監視ツール「Fog Reveal」をアメリカの地方警察が使用、一体どこまで詳細な追跡が可能なのかがユーザーマニュアルから明らかに', 'link': 'https://gigazine.net/news/20220902-cops-use-mass-surveillance-tool-fog-reveal/', 'datetime': '2022-09-02 16:00:00'}
{'title': 'TikTokのAndroid向けアプリに「1タップでアカウントが乗っ取られる脆弱性」があったという報告', 'link': 'https://gigazine.net/news/20220902-tiktok-android-vulnerability/', 'datetime': '2022-09-02 07:00:00'}
title
に「アプリ」が含まれる、昨日(2022/09/02)の記事が出力されていますね!
まとめ
feedparserを用いたスクレイピングの方法を紹介しました。
サイトによって項目の差分はありますので、この記事を参考にしつつ対応して頂ければと思います!
また、もっとスクレイピングやPythonに関して学びたいという方は、現役エンジニアから学んでみてはいかがでしょうか?
テックアカデミー無料体験にてお金を掛けずに始めることができますので、是非気軽に試してみてください!
コメント