俺のOneNote

俺のOneNote

データ分析が仕事な人のOneNote愛とか、分析小話とか。

pandasだけでWEBスクレイピングする

一般的にスクレイピングを使用とすると、requestsでHTMLなりjsonなりを拾ってくるのが一般的かと思われます。

Python, Requestsの使い方 | note.nkmk.me

ただ、tableタグで構造化されている場合、pandasだけでデータを拾ってこれるので大変お手軽です。

例えばwikiでオリンピックの各国メダル数をみると、HTMLのテーブル形式に整理されています。

f:id:kopaprin:20200430141023p:plain


f:id:kopaprin:20200430141141p:plain

以下、URLを指定してpandas.read_htmlするだけです。

import pandas as pd
df_list = pd.read_html("https://ja.wikipedia.org/wiki/%E8%BF%91%E4%BB%A3%E3%82%AA%E3%83%AA%E3%83%B3%E3%83%94%E3%83%83%E3%82%AF%E3%81%A7%E3%81%AE%E5%9B%BD%E3%83%BB%E5%9C%B0%E5%9F%9F%E5%88%A5%E3%83%A1%E3%83%80%E3%83%AB%E7%B7%8F%E7%8D%B2%E5%BE%97%E6%95%B0%E4%B8%80%E8%A6%A7")

戻り値はlistです。

print(type(df_list))
>>> <class 'list'>

自分が欲しい要素を確認して完了です。

df_list[0].head()
>>>
国・地域    夏季参加回数  金 銀 銅 合計  冬季参加回数  金.1.1.1  合計.1   参加回数    金.2.2.2  総数
0  アフガニスタン (AFG) 14 0  0  2  2  0  0  0  0  0  14 0  0  2  2
1  アルジェリア (ALG)    13 5  4  8  17 3  0  0  0  0  16 5  4  8  17
2  アルゼンチン (ARG)    24 21 25 28 74 19 0  0  0  0  43 21 25 28 74
3  アルメニア (ARM)   6  2  6  6  14 7  0  0  0  0  13 2  6  6  14
4  オーストララシア (ANZ) [ANZ]    2  3  4  5  12 0  0  0  0  0  2  3  4  5  12

BeautifulSoupセレクタ等の知識も不要で、HTMLから正規表現で抽出する必要もなく、便利です。
クローリングする場合にも、もしtableタグの内容であればpandas経由すると簡単にテーブルデータ化できることが多々あります。