pandasでテーブルタグがあるサイトをスクレイピングする
これはなに?
仕事で使っている某サイトの管理画面で日々のレポートが見れるのですが、CSVダウンロードとか何かしらのダウンロードがなくてサイトを閲覧することしか出来ないところがありました。あちこちスクレイピングを調べていると、pandasでスクレイピングすることが出来るようなので使ってみようかと思いました。
インストール
私の環境ではpython3.6.4を使っています。幾つかインストールする必要があります。
$ pip install pandas lxml html5lib BeautifulSoup4
書いたコード
テーブルタグがありそうなサイトを考えた時、オライリーのことを思い出しました。ここではオライリーの書籍一覧をスクレイピングしてみます。ファイル名はpandas_test.pyという名前でとりあえず書いてみます。
import pandas as pd url = 'https://www.oreilly.co.jp/catalog/' rows = pd.io.html.read_html(url) print(rows[0].head()) print('-----') print(rows[0].head().to_dict(orient='records'))
書いたコードを実行
実行した結果は以下のようになります。
$ python pandas_test.py ISBN Title 価格 発行日 0 4-87311-061-0 Javaネットワークプログラミング 第2版 6264 2001/10/01 1 4-87311-063-7 C++プログラミング入門 新版 3024 2001/11/01 2 4-87311-065-3 サーバ負荷分散技術 3240 2001/12/01 3 4-87311-078-5 NFS & NIS 第2版 5184 2002/04/01 4 4-87311-079-3 不正アクセス調査ガイド 3672 2002/04/01 ----- [{'ISBN': '4-87311-061-0', 'Title': 'Javaネットワークプログラミング 第2版', '価格': 6264, '発行日': '2001/10/01'}, {'ISBN': '4-87311-063-7', 'Title': 'C++プログラミング入門 新版', '価格': 3024, '発行日': '2001/11/01'}, {'ISBN': '4-87311-065-3', 'Title': 'サーバ負荷分散技術', '価格': 3240, '発行日': '2001/12/01'}, {'ISBN': '4-87311-078-5', 'Title': 'NFS & NIS 第2版', '価格': 5184, '発行日': '2002/04/01'}, {'ISBN': '4-87311-079-3', 'Title': '不正アクセス調査ガイド', '価格': 3672, '発行日': '2002/04/01'}]
感想とまとめ
思った以上に簡単に出来たので驚きました。pandasを使うの初めてなのですが、これは便利ですね。.to_dict()
とかto_json()
をやる時に、.to_dict(orient='records')
のようにorient指定するとそのままBigQueryに登録できそうな形式になるのでありがたいです。
もう少しpandasを触ってみようと思います。