昔、スタバの店舗情報をスクレイピングするスクリプトを書いたのだけど、無線LANカラムを追加してほしいとかいう話があったり、前にRubyで書いてたスクリプトは全部正規表現でごり押ししててなんかそれだとコードの見通しが悪すぎたので、今回Pythonでスクレイピングの練習の意味も含めて書き直してみた。
GitHub - YukiSakamoto/Starbucks_Japan
PythonでスクレイピングするときにはよくBeautifulSoup4というライブラリが使われるらしくて、僕もはじめはそれを使っていたのだけど、BeaurifulSoupはファイルが大きくなるとすぐに重くなるらしく、またタグのネストが深くなると、引っ張ってきたい要素にアクセスするための手順も面倒になってくるらしいため(これは本当にそう思った)より高速なlxmlというライブラリを使うことにした。
使い方はネット上に転がっているのだけど、これを使えば、ネストの中にあるタグでもルートから一気にクラス名などと合わせて引くことができて大変使いやすい。
table = root.xpath('//table[@class="table"]/tbody/tr') #xpathはタグのツリーを移動するもの。//で始まるとルートから一気に検索する for row in table: has_lan_service = row.xpath('./td[@class="wirelessHotspot txtAC"]/text()') #xpathの引数が./で始まると今見ているノードから下を検索する。
こういう感じでwebサイトのhtmlをちょっと見ればより直感的にこれの方が探せると思う。なにより[@class="XXX"]とか[@div="YYY"]みたいに、[@]で付随する要素をしぼれるのが良い。
まぁそういう感じで作ってみたので、夜遅くまでやっているスタバを探してる人とか使ってくれるとうれしいですね。
僕は最近はスタバにはほとんど行かないのだけど。