News APIとは、Newsに特化したAPIサービスです。
News APIは非常に柔軟で強力なツールで、世界中の様々なメディアからニュースデータを取得できます。
News APIでできる10のこと
- 最新ニュースの取得: 世界中の最新ニュースをリアルタイムで取得できます。
- 特定のキーワードに基づくニュース検索: 特定のトピックやキーワードに関連するニュースを検索できます。
- 特定のソースからのニュース取得: 特定のニュースソースや出版物からニュースを取得できます。
- カテゴリ別のニュース取得: 政治、ビジネス、エンターテイメントなど特定のカテゴリに属するニュースを取得できます。
- 地域別のニュース取得: 特定の国や地域に関連するニュースを取得できます。
- 言語別のニュース取得: 様々な言語で書かれたニュースを取得できます。
- 過去のニュースの検索: 特定の期間に公開されたニュースを検索できます。
- トレンドトピックの追跡: 人気や関心の高いトピックに関するニュースを取得できます。
- 大量のニュースデータの分析: データ分析や研究目的で大量のニュースデータを取得し利用できます。
- カスタムフィードの作成: ユーザーの興味や必要に応じたカスタマイズされたニュースフィードを作成できます。
これらをPythonを使って自動取得できます。
最新ニュースの取得
まずは最新ニュースの取得を行ってみましょう。
NEWSAPIを利用するには、まずrequests
モジュールを使ってAPIリクエストを行います。
以下のサンプルコードは、NEWSAPIを使用して最新ニュースを取得する方法を示しています。
まず、requests
モジュールが必要です。
もしインストールされていない場合は、次のコマンドでインストールできます。
pip install requests
公式サイトからAPIキーを取得し、次のコードでまずは日本の最新ニュースを取得してみましょう。
import requests # NEWSAPIのAPIキーを設定 api_key = "YOUR_API_KEY" # NEWSAPIのエンドポイントURL url = "https://newsapi.org/v2/top-headlines" # リクエストパラメータの設定 params = { 'apiKey': api_key, 'country': 'jp', # 例として日本のニュースを取得 } # APIリクエストを実行 response = requests.get(url, params=params) # レスポンスのステータスコードをチェック if response.status_code == 200: # レスポンスデータをJSON形式で取得 news_data = response.json() # 最新ニュースのタイトルを表示 for article in news_data['articles']: print(article['title']) else: print("Error:", response.status_code)
country
パラメータを変更することで、他の国のニュースも取得できます。
また、他のパラメータを追加することで、より具体的なニュースの絞り込みが可能です。
主なパラメータを把握しておきましょう。
主なパラメータ
- キーワード (q): 特定のキーワードやフレーズを含むニュースを検索するために使用します。例えば、特定の人物名、組織名、イベント名などです。
- ソース (sources): 特定のニュースソースからの記事を取得したい場合に使用します。利用可能なソースのリストはNEWSAPIのウェブサイトで確認できます。
- カテゴリ (category): 特定のカテゴリのニュースを絞り込むために使用します。例えば、ビジネス、エンターテインメント、健康、科学、スポーツなどです。
- 言語 (language): 特定の言語で書かれたニュースを取得するために使用します。言語はISO 639-1コードで指定します。
- 日付 (from, to): 特定の日付範囲内のニュースを取得するために使用します。日付はYYYY-MM-DD形式で指定します。
実行結果が表示されない?
実行結果が何も表示されない場合、いくつかの可能性が考えられます。
以下に、一般的な原因とその対処方法を示します:
- APIキーの問題:
- APIキーが正しくない、または期限切れである可能性があります。APIキーを再確認し、必要に応じてNEWSAPIに再度登録して新しいキーを取得してください。
- リクエストのパラメータ:
- 指定したパラメータ(特に
sources
やq
)が正しいかどうか確認してください。例えば、sources
で指定したニュースソースがNEWSAPIで利用可能か、またq
で指定したキーワードが適切かどうかです。
- 指定したパラメータ(特に
- NEWSAPIの制限:
- NEWSAPIの無料プランでは、利用できるソースやリクエストの頻度に制限がある場合があります。特に特定のソースは有料プランでのみ利用できる可能性があります。
- ニュースの不在:
- 指定した条件(特にソースとキーワード)に該当するニュースが存在しない場合、結果が空になることがあります。
- ネットワークの問題:
- ネットワーク接続に問題がある場合、APIへのリクエストが失敗している可能性があります。
- コードのエラー:
- コードに誤りがないか確認してください。特にリクエストのURL、パラメータの構文、レスポンスの処理方法などです。
特定のニュースソースから情報を取得
News APIは様々な報道機関からニュースを取得できます。
具体的にどのソースがあるのか?
かなりの数があるので、Pythonでリストを取得してみます。
import requests api_key = 'あなたのAPIキー' url = 'https://newsapi.org/v2/top-headlines/sources?country=us&apiKey=' + api_key response = requests.get(url) data = response.json() # ここでデータを扱います。例えば、ソースのリストを表示するなど。 print(data)
このコードは、News APIからアメリカのニュースソースのリストを取得し、それをJSON形式で表示します。
同様の方法で、日本のソースのリストも取得できます(URL内のcountry=us
をcountry=jp
に変更してください)。
DFで表示する
JSON形式だとどうにもみにくいので、Pandasのデータフレームに変換して、より見やすくしたいと思います。
import requests import pandas as pd api_key = 'あなたのAPIキー' url = 'https://newsapi.org/v2/top-headlines/sources?country=us&apiKey=' + api_key response = requests.get(url) data = response.json() # ニュースソースのリストをデータフレームに変換 sources = data['sources'] df = pd.DataFrame(sources) print(df)
例えばこの中だと金融系に強いの以下になります。
- Bloomberg: 金融市場や経済に関するニュースで非常に高い評価を受けています。
- Business Insider: 経済、金融、ビジネス関連のニュースで知られています。
- Fortune: ビジネスと金融の世界に関する深い洞察を提供することで知られています。
- Reuters: 世界的に有名なニュース機関で、ビジネスや金融のニュースも広くカバーしています。
- The Wall Street Journal: 金融とビジネスの報道で非常に高い評価を受けている老舗のニュースソースです。
これらのソースは、特に金融に関連するニュースで力を入れていることで知られています。他に質問があれば、お気軽にどうぞ。
CNNから最新ニュースを取得
CNNから最新のニュースを取得するために、News APIを使用する際には、News APIの無料プランの制限に注意する必要があります。
特に、無料プランでは1日に100回のリクエストに制限されているため、リクエストの数を節約する工夫が必要です。
以下に、CNNから最新のニュースのタイトルを取得し、その数を制限するサンプルコードを示します。
このコードでは、取得するニュースの数を5件に制限していますが、必要に応じてこの数を調整してください。
import requests import pandas as pd api_key = 'あなたのAPIキー' url = f"https://newsapi.org/v2/top-headlines?sources=cnn&pageSize=5&apiKey={api_key}" response = requests.get(url) data = response.json() # ニュースのタイトルのみをデータフレームに変換 articles = data['articles'] df = pd.DataFrame(articles)[['title']] print(df)
取得したニュースのタイトルにリンクを付ける
import requests import pandas as pd api_key = 'あなたのAPIキー' # ニュースソースを変えるにはアドレス内のソースをさきほど取得したリストから選択して変更 url = f"https://newsapi.org/v2/top-headlines?sources=cnn&pageSize=5&apiKey={api_key}" response = requests.get(url) data = response.json() # ニュースのタイトルとURLをデータフレームに変換 articles = data['articles'] df = pd.DataFrame(articles)[['title', 'url']] print(df)
一部のニュースサイトでは、APIを介してリンクされた記事へのアクセスに制限を設けている場合があります。
これはAPIの問題ではなく、リンク先のサイトのポリシーに関連するものかもしれません。
例えばCNNもログインしているかどうかでリンク先に飛べるかどうか変わるようです。
また、データフレームで格納している場合、環境によってはリンクが途中で途切れている可能性もあります。
その場合は後述します「表示が途切れる場合」を参照し、データフレームの文字数制限を調整してください。
ニュースからタイトルを取得し日本語で出力
では次にBloombergからトップ5タイトルを取得し、日本語に翻訳して出力してみましょう。
以下のステップになります。
- ニュースタイトルの取得: Bloombergからニュースタイトルを取得します。
- 翻訳: 取得したタイトルを日本語に翻訳します。
Pythonで翻訳を行うためには、googletrans
ライブラリが一般的に使用されます。
まず、googletrans
ライブラリをインストールしてください。
pip install googletrans==4.0.0-rc1
では実際に取得して、翻訳まで進めていきます。
import requests import pandas as pd from googletrans import Translator api_key = 'あなたのAPIキー' url = f"https://newsapi.org/v2/top-headlines?sources=bloomberg&pageSize=5&apiKey={api_key}" response = requests.get(url) data = response.json() # ニュースのタイトルを取得 articles = data['articles'] titles = [article['title'] for article in articles] # 翻訳オブジェクトの作成 translator = Translator() translated_titles = [translator.translate(title, dest='ja').text for title in titles] # 結果をデータフレームに変換 df = pd.DataFrame({'Original Title': titles, 'Translated Title': translated_titles}) print(df)
英語での出力のあとに、日本語での出力に対応できていますね。
0 Elon Musk’s xAI Startup Seeks to Raise $1 Bill… 1 Robots Make Good Junior Analysts 2 LinkedIn Co-Founder Reid Hoffman Donates $2500… 3 Haslam Family Fights Buffett’s Berkshire Over … 4 Trafigura Staff Tried to Hide Nickel ‘Red Flag… Translated Title 0 Elon MuskのXaiスタートアップは、10億ドルの株式を調達しようとしています 1 ロボットは良いジュニアアナリストになります 2 LinkedInの共同設立者であるReid Hoffmanは、Nikki Haleyに250… 3 ハスラムファミリーファイトバフェットのバークシャーはパイロットトラベルセンターのステークセー… 4 Trafiguraのスタッフはニッケルの「赤い旗」を隠そうとした、メッセージが示す
複数のニュースソースから同時に取得してDF表示
金融系に強いBloomberg、Business Insider、Fortune、Reuters、The Wall Street Journalの5つのソースから同時にトップ5タイトルを取得し、それらを日本語に翻訳してデータフレームで出力してみましょう。
複数のソースのニュースを同時に見れるので情報の整理に役立ちます。
import requests import pandas as pd from googletrans import Translator api_key = 'あなたのAPIキー' sources = ['bloomberg', 'business-insider', 'fortune', 'reuters', 'the-wall-street-journal'] translator = Translator() all_articles = [] for source in sources: url = f"https://newsapi.org/v2/top-headlines?sources={source}&pageSize=5&apiKey={api_key}" response = requests.get(url) data = response.json() articles = data['articles'] for article in articles: title = article['title'] translated_title = translator.translate(title, dest='ja').text all_articles.append({'Source': source, 'Original Title': title, 'Translated Title': translated_title}) df = pd.DataFrame(all_articles) print(df)
表示が途切れる場合
Pandasデータフレームでは、デフォルトで長い文字列が途中で途切れて表示されることがあります。
これを防ぐために、Pandasの表示オプションを調整することができます。
特に、display.max_colwidth
オプションを大きな値に設定することで、列の幅を増やし、完全なテキストを表示できます。
import pandas as pd # 最大列幅を設定(例: 1000文字まで表示) pd.set_option('display.max_colwidth', 1000) # 以前のコードを続行... # (データ取得と翻訳のコードは省略) # データフレームの生成と表示 df = pd.DataFrame(all_articles) print(df)
この設定を追加することで、データフレーム内のニュースタイトルが完全に表示されるようになります。
URLリンクをつける
import requests import pandas as pd from googletrans import Translator api_key = 'あなたのAPIキー' sources = ['bloomberg', 'business-insider', 'fortune', 'reuters', 'the-wall-street-journal'] translator = Translator() all_articles = [] # Pandasの列幅表示設定 pd.set_option('display.max_colwidth', 1000) for source in sources: url = f"https://newsapi.org/v2/top-headlines?sources={source}&pageSize=5&apiKey={api_key}" response = requests.get(url) data = response.json() articles = data['articles'] for article in articles: title = article['title'] url = article['url'] translated_title = translator.translate(title, dest='ja').text all_articles.append({'Source': source, 'Original Title': title, 'Translated Title': translated_title, 'URL': url}) df = pd.DataFrame(all_articles) print(df)
このコードは、各ニュース記事のタイトル、日本語に翻訳されたタイトル、および記事へのリンク(URL)をデータフレームに表示します。
【コピペOK】マーケットレポートのサポート
複数の金融系ニュースソースから同時にタイトルを取得できました。
これらをハイパーリンクにまとめてHTML形式で出力します。
以下は、Bloomberg、Business Insider、Fortune、Reuters、The Wall Street Journalの各ソースからトップ5のニュースタイトルを取得し、それらを日本語に翻訳し、タイトルにハイパーリンクを設定してHTML形式で出力するためのコード。
import requests import pandas as pd from googletrans import Translator def make_clickable(val): return f'<a href="{val}">{val}</a>' api_key = 'あなたのAPIキー' sources = ['bloomberg', 'business-insider', 'fortune', 'reuters', 'the-wall-street-journal'] translator = Translator() all_articles = [] # Pandasの列幅表示設定 pd.set_option('display.max_colwidth', 1000) for source in sources: url = f"https://newsapi.org/v2/top-headlines?sources={source}&pageSize=5&apiKey={api_key}" response = requests.get(url) data = response.json() articles = data['articles'] for article in articles: title = article['title'] url = article['url'] translated_title = translator.translate(title, dest='ja').text all_articles.append({'Source': source, 'Original Title': title, 'Translated Title': translated_title, 'URL': url}) df = pd.DataFrame(all_articles) # URL列をハイパーリンクに変換 df['URL'] = df['URL'].apply(make_clickable) # HTML形式でデータフレームを表示 html = df.to_html(escape=False) print(html)
執筆時点での実行結果をHTMLで表示するとこのようになりました。
リンクをすべて新しいタブで開きたい場合。
import requests import pandas as pd from googletrans import Translator def make_clickable(title, url): return f'<a href="{url}" target="_blank">{title}</a>' api_key = 'あなたのAPIキー' sources = ['bloomberg', 'business-insider', 'fortune', 'reuters', 'the-wall-street-journal'] translator = Translator() all_articles = [] # Pandasの列幅表示設定 pd.set_option('display.max_colwidth', 1000) for source in sources: url = f"https://newsapi.org/v2/top-headlines?sources={source}&pageSize=5&apiKey={api_key}" response = requests.get(url) data = response.json() articles = data['articles'] for article in articles: title = article['title'] article_url = article['url'] translated_title = translator.translate(title, dest='ja').text clickable_title = make_clickable(title, article_url) all_articles.append({'Source': source, 'Original Title': clickable_title, 'Translated Title': translated_title}) df = pd.DataFrame(all_articles) # HTML形式でデータフレームを表示 html = df.to_html(escape=False) print(html)
Pythonで実装可能なプログラムのアイディア
News APIを使ってどんなプログラムが考えられるのか?
アイディアを10個ピックアップしてみたので、チェックしていきましょう。
投資やトレードのファンダ面で役立たせてください。
- トレンドニュースのダイジェスト作成: 最新のトレンドニュースを自動で収集し、要約してダイジェストを作成する。
- 特定トピックのニュースアラート: 特定のトピックに関するニュースが公開された時に通知するシステム。
- ニュース分析ダッシュボード: さまざまなソースからのニュースを集め、トピックや感情分析を行い、ダッシュボードで表示する。
- 自動ニュースレコメンデーション: ユーザーの興味に基づいてカスタマイズされたニュースを推薦する。
- 言語別ニュース集約: 特定の言語で書かれたニュースを集めて表示する。
- 歴史的ニュースの時系列分析: 過去の特定期間にわたるニュースを分析し、時系列でトレンドやパターンを探る。
- ニュースソースの比較: 同じニューストピックに対する異なるソースの報道の仕方を比較分析する。
- 地域別ニュースの可視化: 地域ごとのニューストピックや関心事を地図上で可視化する。
- ニュースベースの学習素材作成: 特定のトピックに関連するニュースを収集し、教育や研究のための資料として整理する。
- ソーシャルメディアとの統合: ソーシャルメディアにおける話題や反応とニュースコンテンツを結びつけ、影響力の分析を行う。
このようなプログラムアイディアがあります。
当記事のアクセスで需要がありそうだと思ったらプログラムの作成記事も書きたいと思います。