NewsAPIで世界中のニュース記事を取得する実装ガイド!APIキー取得からPythonコード例まで

目次

ニュースデータが必要なアプリ開発で困っていませんか?

ニュースアプリやメディア監視ツール、トレンド分析システムを作りたいと思ったとき、「どうやってニュース記事のデータを取得するか」で悩んだことはありませんか?Webスクレイピングは法的リスクもあり、メンテナンスも大変です。

NewsAPIを使えば、世界中の主要メディアのニュース記事を合法的かつ簡単に取得できます。キーワード検索、日付範囲指定、言語フィルタリングなど、柔軟な条件で記事を取得可能です。

この記事では、NewsAPIの基本から実装まで、実際にコードを動かしながら理解できるように解説します。

NewsAPIとは?ニュース記事取得のための専用API

NewsAPIは、世界中のニュースソースから記事データを取得できるREST APIです。開発者向けに設計されており、JSONフォーマットでニュース記事の情報を返します。

あわせて読みたい
News API – Search News and Blog Articles on the Web Get JSON search results for global news articles in real-time with our free News API.

主な特徴

  • 豊富なニュースソース: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キーを取得する必要があります。無料プランでも数分で取得できます。

取得手順

  1. NewsAPI公式サイトにアクセス
  2. 「Get API Key」ボタンをクリック
  3. 必要情報を入力してアカウント登録
    • 名前
    • メールアドレス
    • 使用目的(個人プロジェクト、商用など)
  4. 登録完了後、ダッシュボードでAPIキーを確認

APIキーはabcd1234efgh5678ijkl9012mnop3456のような形式の文字列です。このキーは外部に公開しないように注意してください。

2つのエンドポイントの使い分け:everythingとtop-headlines

NewsAPIには主に2つのエンドポイントがあり、用途によって使い分けます。

/v2/everything:詳細な条件で過去記事を検索

キーワードや日付範囲を指定して、全てのニュースソースから記事を検索するエンドポイントです。

主要なパラメータ

  • q:検索キーワード(AND、OR、NOTで複合検索可能)
  • fromto:日付範囲指定(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:記事の元URL
  • urlToImage:関連画像のURL
  • publishedAt:公開日時(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活用とデータ処理

まとめ:NewsAPIで効率的にニュースデータを活用

NewsAPIを使えば、複雑なWebスクレイピングを実装することなく、簡単にニュース記事データを取得できます。無料プランでもプロトタイプ開発には十分な機能が揃っており、Pythonの基本的な知識があればすぐに実装可能です。

キーワード検索、日付範囲指定、言語フィルタリングなどの柔軟な機能を活用して、ニュースアプリやメディア分析ツールの開発に役立ててください。商用利用する際は、適切なプランにアップグレードすることを忘れずに。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!
目次