折りたたみを展開する

おぼえ書き、まとめ、発表など

スクレイピングのおぼえ書き

スクレイピングとは

スクレイピングとは、Webなどのから情報を習得する一連の作業だ。Webサイトなので、htmlの形でWebから取ってきたデータを加工・整形してデータ分析に持ってくる。

日々、更新していく情報を一定時間間隔で習得したり、様々なサイトを巡回していくクローリングという作業とセットになって説明されることが多い。色々な書籍も、英語だけではなく日本語で出版されていて、以下のような本が売れているようだ。

よっしゃ勉強しよ

流行のスクレイピング・クローリングを勉強しようと思っていた。だが、本を読むのが面倒なので*1、まずは導入ということでブログ等を参考にしてやってみた。今回はスクレイピングだけである。python3を使った。

参考にしたサイト・記事は以下

qiita.com

qiita.com

yoshiyah.hatenablog.jp

ドキュメントもみた

kondou.com - Beautiful Soup 4.2.0 Doc. 日本語訳 (2013-11-19最終更新)

pandasによるhtml形式の表の習得

今回は、webにある表の取得を目指す。なぜなら簡単だからである。pandasを使えば簡単にできる。便利な時代になったものである。 例として、日本の首都である群馬県のHPを用いる。HPのあるページには、以下のような表がある。群馬県の情報公開に係る基本計画である。

f:id:Rlan:20170621132123p:plain

このような表の取得であれば、4行のコードで data frame 形式に落とせる*2

import pandas as pd
url = 'http://www.pref.gunma.jp/07/c0110008.html'
kihon = pd.io.html.read_html(url)
kihon[0]

f:id:Rlan:20170621135610p:plain

後に行うことだが、data frameからExcelに書き出す事もできる*3

公正取引委員会審決一覧

これで終わるのもなんなので、ある程度まとめて情報を取得、加工、Excelに書き出す工程をしてみよう。最近はオープンデータ化の流れもあり、大体がExcel形式になっていて、探すのに苦労した。皮肉なものだ。適当な官公庁のサイトを探していたら、公正取引委員会審決一覧が偶然見つかったのでこれを取得しようかと思う。サイトの構造は以下のようになっている。

審決一覧:公正取引委員会

サイトでは審決一覧があり、年度毎にリンクがあり、リンク先でhtml形式の表で審決がまとめられている。いちいちリンク先のurlを集めるのも手間なので、このまとめの親ページからリンク先を取得してデータをとる。リンク一覧の部分はclassでまとめられているので利用する。

Beautiful Soup4

Beautiful Soupを用いて、取得したhtmlドキュメントから、リンク一覧を取得する。

import urllib.request
import bs4

url = 'http://www.jftc.go.jp/shinketsu/itiran/index.html'
soup = bs4.BeautifulSoup(urllib.request.urlopen(url).read())
link_list = []
shiketu = soup.find( class_='norcor') 
for link in shiketu.find_all('a'):
    Link = link.get('href')
    link_list.append(Link)
    
link_list = ['http://www.jftc.go.jp'+str(e) for e in link_list]

urlはstr形で、 link_list というlistに入れる。なぜか、 'http://www.jftc.go.jp' がついていなかったので自分で付けた。どうにかする方法を知りたい。

次は、さっきのようにpandasで表を取得していく。1つ1つを処理するのも面倒なので、 merge でまとめてdata frame形式にする。

first = True
for url in link_list:
    new = pd.io.html.read_html(url)
    if(not first): latter[0] = pd.merge(latter[0], new[0])
    first = False
    latter = new

不必要な動作だが、 わかりやすい様に matome にdata frameを入れておく。

mate = latter[0]

f:id:Rlan:20170621134605p:plain

これで一覧することができた。使う予定はこの後も先も無いが、Excelで書き出しておく。

writer = pd.ExcelWriter('matome.xlsx')
matome.to_excel(writer,'merge')
writer.save()

めでたしめでたし。

f:id:Rlan:20170621134819p:plain

*1:実は、一般的には書籍の購入にはお金がかかる

*2:import文と最後の表示を除いて、2行目と3行目をまとめれば1行でできると考えることもできる

*3:何もdata frame形式やpandasに限った話では無いが