Pythonでロイター、ブルームバーグ、YahooのRSSから経済関連のニュース情報を抽出する

5月 24, 2023

経済ニュースを発信しているロイター、ブルームバーグ、YahooニュースのRSSから各記事の情報を取得するスクリプトを紹介します。

ロイターから抽出する

ロイターについてはこちらのページにカテゴリーごとのRSS情報が掲載されています。

経済ニュースとしては、以下のRSSから情報を取得すれば十分だと思います。

カテゴリーリンク
トップニュースhttps://assets.wor.jp/rss/rdf/reuters/top.rdf
外国為替https://assets.wor.jp/rss/rdf/reuters/forex.rdf
株式市場https://assets.wor.jp/rss/rdf/reuters/stock.rdf
マクロ経済動向https://assets.wor.jp/rss/rdf/reuters/economy.rdf
ビジネスhttps://assets.wor.jp/rss/rdf/reuters/business.rdf
テクノロジーhttps://assets.wor.jp/rss/rdf/reuters/technology.rdf

実際のコードはこちらです。タイトル、記事リンク、記事テキストを抽出し、print文で表示するようなコードとしています。

各カテゴリーの情報を取得するのにmain関数のurlを使っていますので、ここを書き換えればそれぞれのカテゴリーの記事を抽出できます。

# -*- coding: utf-8 -*-

import requests
from bs4 import BeautifulSoup

def main():
    print('rss上のニュースリストを抽出')
    url = 'https://assets.wor.jp/rss/rdf/reuters/top.rdf'
    html = requests.get(url)
    soup = BeautifulSoup(html.content, "xml")
    # スクレイピング
    for rss in soup.find_all('item'):
        link = rss.find("link").text
        title = rss.title.string
        article = extract_content(link)
        print('タイトル:'+title)
        print('リンク:'+link)
        print('記事内容:')
        print(article)

def extract_content(url):
    # ニュース記事をダウンロードして解析
    response = requests.get(url)
    soup = BeautifulSoup(response.content, "html.parser")

    # 本文を取得して表示
    article_body = soup.find("div", class_="ArticleBodyWrapper").find_all("p")
    article_text = "\n".join([p.text.strip() for p in article_body])
    return article_text

if __name__ == "__main__":
    main()

ブルームバーグから抽出する

ブルームバーグについてもこちらのページにカテゴリーごとのRSS情報が掲載されています。

経済ニュースとしては、以下のリンクから抽出で良いでしょう。

カテゴリーリンク
トップニュースhttps://assets.wor.jp/rss/rdf/bloomberg/top.rdf
海外ニュースhttps://assets.wor.jp/rss/rdf/bloomberg/overseas.rdf
マーケットニュースhttps://assets.wor.jp/rss/rdf/bloomberg/markets.rdf
経済指標https://assets.wor.jp/rss/rdf/bloomberg/economy.rdf

コードはロイター抽出スクリプトのextract_content関数を少し変えただけです。

# -*- coding: utf-8 -*-

import requests
from bs4 import BeautifulSoup

def main():
    print('rss上のニュースリストを抽出')
    url = 'https://assets.wor.jp/rss/rdf/bloomberg/top.rdf'
    html = requests.get(url)
    soup = BeautifulSoup(html.content, "xml")
    # スクレイピング
    for rss in soup.find_all('item'):
        link = rss.find("link").text
        title = rss.title.string
        article = extract_content(link)
        print('タイトル:'+title)
        print('リンク:'+link)
        print('記事内容:')
        print(article)

def extract_content(url):
    # ニュース記事をダウンロードして解析
    response = requests.get(url)
    soup = BeautifulSoup(response.content, "html.parser")

    # 本文を取得して表示
    article_body = soup.find("div", class_="body-copy").find_all("p")
    article_text = "\n".join([p.text.strip() for p in article_body])
    return article_text

if __name__ == "__main__":
    main()

Yahooニュースから抽出する

YahooニュースのRSSはこちらにまとめられています。

経済とITを抽出候補にするのが良さそうです。

カテゴリーリンク
経済https://news.yahoo.co.jp/rss/categories/business.xml
IThttps://news.yahoo.co.jp/rss/categories/it.xml

Yahooニュースの場合は、記事が複数ページにまたがることがあるので、extract_content関数にその処理のためのコードを入れています。

# -*- coding: utf-8 -*-

import requests
from bs4 import BeautifulSoup

def main():
    print('rss上のニュースリストを抽出')
    url = 'https://news.yahoo.co.jp/rss/categories/business.xml'
    html = requests.get(url)
    soup = BeautifulSoup(html.content, "xml")
    # スクレイピング
    for rss in soup.find_all('item'):
        link = rss.find("link").text.replace('?source=rss','')
        title = rss.title.string
        article = extract_content(link)
        print('タイトル:'+title)
        print('リンク:'+link)
        print('記事内容:')
        print(article)

def extract_content(url):
    #ページが複数にまたがる場合は、全ページのデータを取得
    page = '?page='
    num = 2
    # ニュース記事をダウンロードして解析
    res = requests.get(url)
    soup = BeautifulSoup(res.text, 'html.parser')
    article = soup.find('div', class_='article_body')
    # 本文を取得
    text = ""
    for p in article.find_all('p'):
        text += p.get_text()

    # 2ページ目以降の処理
    res_next = requests.get(url+page+str(num))
    while res_next:
        soup = BeautifulSoup(res_next.text, 'html.parser')
        article = soup.find('div', class_='article_body')
        for p in article.find_all('p'):
            text += p.get_text()
        num = num + 1
        res_next = requests.get(url+page+str(num))
    return text

if __name__ == "__main__":
    main()

以上です。