ニュースデータが必要なアプリ開発で困っていませんか?
ニュースアプリやメディア監視ツール、トレンド分析システムを作りたいと思ったとき、「どうやってニュース記事のデータを取得するか」で悩んだことはありませんか?Webスクレイピングは法的リスクもあり、メンテナンスも大変です。
NewsAPIを使えば、世界中の主要メディアのニュース記事を合法的かつ簡単に取得できます。キーワード検索、日付範囲指定、言語フィルタリングなど、柔軟な条件で記事を取得可能です。
この記事では、NewsAPIの基本から実装まで、実際にコードを動かしながら理解できるように解説します。
NewsAPIとは?ニュース記事取得のための専用API
NewsAPIは、世界中のニュースソースから記事データを取得できるREST APIです。開発者向けに設計されており、JSONフォーマットでニュース記事の情報を返します。
主な特徴
- 豊富なニュースソース:150,000以上のニュースサイトやブログから記事を収集
- 過去記事の検索:最大5年前までの記事を遡って検索可能(プランによる)
- 柔軟なフィルタリング:キーワード、言語、日付範囲、ドメインなどで絞り込み
- 構造化データ:タイトル、本文、公開日時、画像URL、著者情報などをJSON形式で取得
どんな場面で使える?
- ニュースアグリゲーションアプリの開発
- 特定トピックのメディア監視ツール
- トレンド分析やセンチメント分析のデータソース
- 企業の評判モニタリングシステム
- 自動ニュース配信ボットの作成
料金プランの選び方:無料で始められる?
NewsAPIには複数の料金プランがあり、まずは無料の開発者プランから始められます。
無料プラン(Developer)の特徴
- 料金:無料
- 用途:開発・テスト専用(商用利用不可)
- 記事取得の遅延:24時間(リアルタイムではない)
- 検索可能期間:最大1ヶ月前まで
- リクエスト制限:1日100リクエストまで
プロトタイプ開発や技術検証には十分な内容です。ただし、24時間の遅延があるため、リアルタイム性が必要なアプリには向きません。
商用プランが必要な場合
実際にサービスをリリースする際は、Business以上のプランが必要です:
- Business(月額$449):リアルタイム取得、5年前までの記事検索、月間250,000リクエスト
- Advanced(月額$1,749):月間2,000,000リクエストまで拡張
- Enterprise:無制限リクエスト、カスタムサポート(要問い合わせ)
最新の料金情報は公式の料金ページで確認してください。
APIキーを取得してすぐ使える状態にする
NewsAPIを使うには、まずAPIキーを取得する必要があります。無料プランでも数分で取得できます。
取得手順
- NewsAPI公式サイトにアクセス
- 「Get API Key」ボタンをクリック
- 必要情報を入力してアカウント登録
- 名前
- メールアドレス
- 使用目的(個人プロジェクト、商用など)
- 登録完了後、ダッシュボードでAPIキーを確認
APIキーはabcd1234efgh5678ijkl9012mnop3456のような形式の文字列です。このキーは外部に公開しないように注意してください。
2つのエンドポイントの使い分け:everythingとtop-headlines
NewsAPIには主に2つのエンドポイントがあり、用途によって使い分けます。
/v2/everything:詳細な条件で過去記事を検索
キーワードや日付範囲を指定して、全てのニュースソースから記事を検索するエンドポイントです。
主要なパラメータ:
q:検索キーワード(AND、OR、NOTで複合検索可能)from、to:日付範囲指定(ISO 8601形式)language:言語フィルタ(ja、en、es等)sortBy:ソート順(relevancy、popularity、publishedAt)pageSize:1回のリクエストで取得する記事数(最大100)domains:特定ドメインに限定(例:bbc.co.uk)
使用例:「過去1ヶ月間のAI関連ニュースを日本語で取得」「特定企業名を含む記事を人気順に取得」など。
/v2/top-headlines:最新のトップニュースを取得
特定の国やカテゴリから、今話題のトップニュースを取得するエンドポイントです。
主要なパラメータ:
country:国コード(us、jp、gb等)category:カテゴリ(business、technology、sports等)sources:特定ニュースソースに限定q:キーワード検索
使用例:「アメリカのテクノロジーニュースのヘッドライン」「日本のビジネスニュースTOP10」など。
Pythonでの実装:実際に動くコード例
Pythonのrequestsライブラリを使って、NewsAPIから記事を取得してみましょう。
基本的な実装例
import requests
import json
from datetime import datetime, timedelta
# APIキーを設定
API_KEY = "YOUR_API_KEY" # 取得したAPIキーに置き換え
BASE_URL = "https://newsapi.org/v2/everything"
# 検索パラメータ設定
params = {
"q": "(AI OR 人工知能) AND 日本", # キーワード検索
"from": "2024-12-01T00:00:00", # 開始日時
"to": "2024-12-10T23:59:59", # 終了日時
"language": "jp", # 日本語記事のみ
"sortBy": "relevancy", # 関連性順
"pageSize": 10, # 取得件数
"apiKey": API_KEY
}
# APIリクエスト実行
response = requests.get(BASE_URL, params=params)
# レスポンス処理
if response.status_code == 200:
data = response.json()
articles = data.get("articles", [])
print(f"取得した記事数: {len(articles)}")
print(f"総記事数: {data.get('totalResults', 0)}\n")
for i, article in enumerate(articles, 1):
print(f"{i}. {article['title']}")
print(f" ソース: {article['source']['name']}")
print(f" 公開日: {article['publishedAt']}")
print(f" URL: {article['url']}\n")
else:
print(f"エラー: {response.status_code}")
print(response.json())エラーハンドリングを含む実用的な実装
import requests
from typing import Dict, List, Optional
class NewsAPIClient:
def __init__(self, api_key: str):
self.api_key = api_key
self.base_url = "https://newsapi.org/v2"
def search_articles(
self,
keyword: str,
from_date: Optional[str] = None,
to_date: Optional[str] = None,
language: str = "en",
sort_by: str = "relevancy",
page_size: int = 10
) -> Optional[List[Dict]]:
"""
記事を検索して取得
Args:
keyword: 検索キーワード
from_date: 開始日時(ISO 8601形式)
to_date: 終了日時(ISO 8601形式)
language: 言語コード
sort_by: ソート順
page_size: 取得件数
Returns:
記事のリスト、エラー時はNone
"""
endpoint = f"{self.base_url}/everything"
params = {
"q": keyword,
"language": language,
"sortBy": sort_by,
"pageSize": page_size,
"apiKey": self.api_key
}
if from_date:
params["from"] = from_date
if to_date:
params["to"] = to_date
try:
response = requests.get(endpoint, params=params, timeout=10)
response.raise_for_status()
data = response.json()
if data.get("status") == "ok":
return data.get("articles", [])
else:
print(f"APIエラー: {data.get('message', '不明なエラー')}")
return None
except requests.exceptions.RequestException as e:
print(f"リクエストエラー: {e}")
return None
# 使用例
client = NewsAPIClient(api_key="YOUR_API_KEY")
articles = client.search_articles(
keyword="Python programming",
from_date="2024-12-01",
language="en",
page_size=5
)
if articles:
for article in articles:
print(f"{article['title']} - {article['source']['name']}")レスポンスデータの構造を理解する
NewsAPIから返されるJSONレスポンスの構造を把握しておくと、データの扱いが簡単になります。
基本的なレスポンス形式
{
"status": "ok",
"totalResults": 2338,
"articles": [
{
"source": {
"id": "wired",
"name": "Wired"
},
"author": "Will Knight",
"title": "Amazon Is Building a Mega AI Supercomputer",
"description": "記事の概要...",
"url": "https://www.wired.com/story/...",
"urlToImage": "https://media.wired.com/photos/...",
"publishedAt": "2024-12-03T18:13:31Z",
"content": "記事本文の一部..."
}
]
}各フィールドの説明
status:リクエストの成否(”ok”または”error”)totalResults:検索条件に一致する記事の総数articles:記事データの配列source:記事の発行元情報(idとname)author:著者名title:記事タイトルdescription:記事の概要url:記事の元URLurlToImage:関連画像のURLpublishedAt:公開日時(ISO 8601形式)content:記事本文の一部(約200文字まで)
注意点として、contentフィールドは記事の全文ではなく、冒頭部分のみです。全文が必要な場合はurlから記事ページにアクセスする必要があります。
実践的な活用例:トレンド分析ツールを作る
NewsAPIを使った実用的な例として、特定キーワードの出現頻度を分析するシンプルなツールを作ってみましょう。
import requests
from collections import Counter
from datetime import datetime, timedelta
def analyze_keyword_trends(api_key: str, keyword: str, days: int = 7):
"""
指定キーワードの過去N日間のトレンドを分析
"""
# 日付範囲を計算
to_date = datetime.now()
from_date = to_date - timedelta(days=days)
params = {
"q": keyword,
"from": from_date.strftime("%Y-%m-%dT00:00:00"),
"to": to_date.strftime("%Y-%m-%dT23:59:59"),
"language": "en",
"sortBy": "publishedAt",
"pageSize": 100,
"apiKey": api_key
}
response = requests.get("https://newsapi.org/v2/everything", params=params)
if response.status_code == 200:
articles = response.json().get("articles", [])
# ソース別記事数をカウント
sources = Counter([a["source"]["name"] for a in articles])
# 日別記事数を集計
dates = Counter([a["publishedAt"][:10] for a in articles])
print(f"\n=== {keyword} のトレンド分析(過去{days}日間) ===")
print(f"総記事数: {len(articles)}\n")
print("【主要ニュースソース TOP5】")
for source, count in sources.most_common(5):
print(f" {source}: {count}記事")
print("\n【日別記事数】")
for date in sorted(dates.keys()):
print(f" {date}: {dates[date]}記事")
else:
print(f"エラー: {response.status_code}")
# 使用例
analyze_keyword_trends(
api_key="YOUR_API_KEY",
keyword="artificial intelligence",
days=7
)よくあるエラーと対処法
401 Unauthorized:APIキーが無効
APIキーが正しく設定されていない、または無効なキーを使っている場合に発生します。
- APIキーをコピー&ペーストし直す
- ダッシュボードで新しいキーを生成する
- 環境変数からキーを読み込む場合、変数名を確認
426 Upgrade Required:無料プランの制限
無料プランでは利用できない機能(リアルタイムデータ、古い記事など)にアクセスしようとした場合に発生します。
- 検索日付範囲を1ヶ月以内に制限する
- 有料プランへのアップグレードを検討する
429 Too Many Requests:リクエスト制限超過
1日のリクエスト上限(無料プランは100回)を超えた場合に発生します。
- リクエスト回数をカウントして制限内に収める
- キャッシュ機構を実装してAPIコールを減らす
- 有料プランで上限を拡張する
NewsAPI よくある質問
❓ NewsAPIは完全無料で使えますか?商用利用は可能ですか?
無料の開発者プランは開発・テスト専用で商用利用は不可です。24時間の遅延があり、1日100リクエストまでです。商用利用にはBusiness以上のプラン(月額$449〜)が必要で、リアルタイム取得や過去5年間の記事検索が可能になります。
❓ NewsAPIで取得できる記事本文は全文ですか?
いいえ、contentフィールドには記事本文の冒頭約200文字のみが含まれます。全文が必要な場合は、レスポンスに含まれるurlフィールドから元の記事ページにアクセスする必要があります。タイトル、概要、画像URL、公開日時などは完全なデータが取得できます。
❓ 他のニュースAPI(RSSフィード等)との違いは何ですか?
NewsAPIは150,000以上のソースを統一したJSON形式で提供し、キーワード検索・日付範囲指定・言語フィルタなど柔軟な条件で記事を取得できます。RSSフィードは個別ソースごとに異なる形式で処理が煩雑ですが、NewsAPIは一つのエンドポイントで横断検索が可能です。
❓ リクエスト制限を超えた場合はどうなりますか?
429エラー(Too Many Requests)が返され、それ以降のリクエストは翌日までブロックされます。対策として、リクエストカウンターの実装、キャッシュ機構による再利用、pageSizeを最大100にして取得回数を減らす工夫が有効です。継続的に上限を超える場合は有料プランへのアップグレードを検討してください。
NewsAPIをさらに活用する関連記事
NewsAPIを使ったアプリケーション開発をさらに深めるために、以下の関連記事もご覧ください。
外部API活用とデータ処理
- Spotify APIの使い方ガイド|JavaScriptでアーティストデータを取得する方法 – 他のAPIとの実装パターンの比較に
- Faker.js (Faker.ts)って便利やで。テストデータ生成の実践活用法 – APIテスト時のモックデータ生成に活用
まとめ:NewsAPIで効率的にニュースデータを活用
NewsAPIを使えば、複雑なWebスクレイピングを実装することなく、簡単にニュース記事データを取得できます。無料プランでもプロトタイプ開発には十分な機能が揃っており、Pythonの基本的な知識があればすぐに実装可能です。
キーワード検索、日付範囲指定、言語フィルタリングなどの柔軟な機能を活用して、ニュースアプリやメディア分析ツールの開発に役立ててください。商用利用する際は、適切なプランにアップグレードすることを忘れずに。
