前回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はブラウザ操作をする為のライブラリなので、ログインスタートもできます。
また機会があれば記載したいと思います。