search
LoginSignup
17
Help us understand the problem. What are the problem?

More than 3 years have passed since last update.

posted at

updated at

Pythonで経済ニュースの情報をWebスクレイピング

 前回PythonでITニュースサイトの見出しをWebスクレイピングという記事で、RequestsとBeautiful Soup、そしてCSSセレクタを使ったスクレイピングを試しました。

 今回はその続編のようなもので、正規表現とPandasを使った方法で基礎的なものを記載します。

他にも似たような記事がありますがコードに誤りがあったり、うまくいかないものもあったため、自分で検証してみました。

正規表現を使う

 正規表現を使えば、CSSでスクレイピング対象物を特定できない場合などに役立ちます。
今回は日経新聞のサイトにある見出しを取得します。

まずrequestsをインストールしておきます。

pip install requests

そして以下プログラムを実行すると見出しが出力されます。
※抽出箇所のHTMLが記事投稿時と違う可能性があるため、その際はブラウザの開発者ツールなどで要確認です。

# requestsと正規表現のモジュールインポート
import requests
import re

# サイトURLを変数に格納
URL = 'https://www.nikkei.com'

# get()メソッドでデータを取得
res = requests.get(URL)

# ステータス確認
res.status_code == requests.codes.ok

# reモジュールのfindall()関数を使い正規表現にマッチした箇所を抽出
subtitles = re.findall(r'<span class="m-miM\d{2}_titleL".*>(.+)</span></a>', res.text)

# for文で出力
for i in subtitles:
    print(i)

するとこのように表示されたと思います。

英離脱合意、近づく崩壊 独首相「30日内に解決策を」
米国防長官、ミサイル発射実験で「中国を抑止」
「スパイダーマン」ファン不在でピンチ
(ストーリー4)
ランチ難民にサブスク弁当 月1万2000円で待ち時間ゼロ
至難の業「お宝株」探し 「1年で株価2倍」10年ぶり少なさ
…

正規表現にマッチした箇所を抽出するには、ブラウザの開発者ツールにて、
<span class=~ タイトル名 ~>のようになっているところを見つけたら、
タイトル名を抜き出すような正規表現を記載すれば、得たい情報を取得できます。

Pandasを使う

データ解析用ライブラリのPandasを使ってWebスクレイピングすることも可能です。
特に表データの抽出に優れています。インストールしておきましょう。

pip install pandas

こちらのYahooニュース:株式ランキングをスクレイピングします。
とりあえず取得してみます。すごく短いコードですね。

# pandasインポート
import pandas as pd

# サイトURLを変数に格納
URL = 'https://info.finance.yahoo.co.jp/ranking/?kd=3&mk=3&tm=d&vl=a'

# pd.read_htmlでHTML内の<table>データを拾う
dfs = pd.read_html(URL)

# 表示
print(dfs[0])

すると以下のように表示されたと思います。

来高  掲示板
0    1  8411  東証1部     (株)みずほフィナンシャルグループ  ...   0.00%    ---  63459300  掲示板
1    2  8306  東証1部  (株)三菱UFJフィナンシャル・グループ  ...  -0.26%   -1.3  32270000  掲示板
2    3  3656  東証1部               KLab(株)  ...  +8.41%    +86  23677000  掲示板
3    4  8604  東証1部         野村ホールディングス(株)  ...  +2.27%     +9  21700100  掲示板
4    5  9434  東証1部             ソフトバンク(株)  ...  +0.80%    +12  20954900  掲示板
…

これだけではいらない情報もあると思います。項目を抽出して取り直してみます。

# coding: UTF-8
# pandasインポート
import pandas as pd

# サイトURLを変数に格納
URL = 'https://info.finance.yahoo.co.jp/ranking/?kd=3&mk=3&tm=d&vl=a'

# pandasで表データ抽出
dfs = pd.read_html(URL)

# 選択した項目のみ表示
dfs[0].columns = ['順位', 'コード', '市場', '名称', '取引値', '前日比', '出来高', '掲示板','Unnamed: 8','Unnamed: 9']
print(dfs[0][['順位','名称', '前日比', '出来高']])

すると先程よりシンプルになりました。

                      名称     前日比     出来高
0      (株)みずほフィナンシャルグループ   154.3   0.00%
1   (株)三菱UFJフィナンシャル・グループ   500.5  -0.26%
2                KLab(株)    1109  +8.41%
3          野村ホールディングス(株)   405.3  +2.27%
4              ソフトバンク(株)    1518  +0.80%
…

Pandasは、CSVやExcelなどのファイルもスクレイピング可能です。また取得した情報をCSVに出力することもできます。

あとはSeleniumを使ったスクレイピング方法などあります。
Seleniumはブラウザ操作をする為のライブラリなので、ログインスタートもできます。
また機会があれば記載したいと思います。

関連記事

PythonでITニュースサイトの見出しをWebスクレイピング

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
What you can do with signing up
17
Help us understand the problem. What are the problem?