たくろぐ!

仕事はエンジニア、心はアーティスト

スクレイピング・ハッキング・ラボを読みました

スクレイピング・ハッキング・ラボの要約

著者

齊藤貴義さん

www.geek.sc

高校で理数科、大学で弁論(ディベート)部、その他さまざまな分野に一定の造詣があります。

特にアニメや映画の趣向がSF、ホラー寄りだったり、この本を執筆されているくらいなのでITにも知見があって、私自身、共通点が多かったです。

本の要約

第1章 スクレイピングの基礎

スクレイピングとは、Web上のリソース(Webページのみならず、画像やPDF等Web上のすべてのリソースが対象)から情報を取得することです。

検索エンジンアルゴリズムに必要とされるサイトのクローリングでも使われていたり、自動化することで手作業が減って業務効率化が図れます。

デメリットとしては、アクセス頻度によってはDoS攻撃と認識されて最悪の場合、不正アクセス禁止法違反、偽計業務妨害などの罪に問われることもあります。

Pythonスクレイピングを行うメリットはBeautiful Soupというライブラリを利用できるのはもちろん、応用的な利用にもPythonで用意されている豊富なライブラリで対応できることです。

本書では自然言語解析ライブラリ、数値解析ライブラリ、データ可視化ライブラリ、静的サイトジェネレータ等が利用されています。

第2章 Pythonの導入

ここではPythonの導入として、各種OSディストリや、Google Colaboratory、Anaconda(科学計算のディストリ)等でのPythonのインストール方法について書かれています。

基本的にハンズオンのため、詳細は割愛します。

第3章 Pythonの環境構築

Jupyter Notebookを利用したPython実行環境についてがメインです。

また次章以降でスクレイピングを実施するにあたって、各ブラウザのディベロッパーツールの使い方を説明しています。

第4章 Python3の基礎

簡単なPythonの文法を説明しています。

型、条件分岐、繰り返し、関数、ファイルの入出力等、スクレイピングを行うにあたっての最低限レベルとなっています。

Python2と3の違い
数値

Python2: 数値にはint型とlong型が存在する。

Python3: int型のみ。

数値の除算

Python2: 整数型を返す。

Python3: 浮動小数点型(float)を返す。

コレクション

以下の4つがある。

  • リスト
  • タプル
  • セット
  • 辞書
リスト

配列、Arrayと同じ。

要素の追加はappend()、削除はremove()。

Rubyならpush、delete。

生成は[]。

タプル

要素がイミュータブルなリスト。

RubyでいうところのArray.new().map(&:freeze).freeze

生成は()。

セット

集合ともいう。

要素の重複を認めず、順序も保証されないArray。

要素の追加はadd()、削除はremove()。

生成は{}。

辞書

dictionary型。

RubyでいうところのHash。

要素の追加はdict["key_name"] = value、削除はdel dict["key_name"]もしくはdict.pop("key_name")。

タプル型への変換はitems()。

生成は{:}。

第5章 Beautiful Soupでスクレイピングする

本章で実際にスクレイピングを実施します。

標準出力に出力する、CSVファイルに出力する方法が書いてあります。

第6章 スクレイピングのテクニックと考慮すべき点

ここでは取得元データ別(画像やPDF)の取得方法について書かれています。

その他、セキュリティ面で重要なプロキシやTorを利用したIPの秘匿化についても触れられています。

(余談ですが、技術的にはTorだけでは完全秘匿化はできない認識で、VPNとの併用で完全秘匿化ができます。)

第7章 PythonからSeleniumブラウザーを操作する

ここではブラウザ操作自動化を利用してスクレイピングを行う方法が書かれています。

(私はWebプログラマーなのでRuby製のSeleniumのラッパーライブラリを利用したことがあります。)

Selenium(Appium)はUIテストによく使われるブラウザ実行環境で、テストコードを書くことで自動でブラウザが起動し、あらゆるブラウザ上での操作を自動化してくれます。

ヘッドレスブラウザ(画面を利用しない)を利用すれば、結果のみ出力したり、自動化することもできるため用途に応じて使い分けるのもいいと思います。

(ヘッドレスとはいえ、スナップショット機能はあります。)

第8章 Scrapyを使って、はてな匿名ダイアリーをクローリングする

簡易的なスクレイピングにはBeautiful Soup、本格的なもの(複雑な処理や膨大なデータ処理?)にはScrapyを利用するそうです。

第9章 MeCabとWord2Vecによる自然言語解析

自然言語解析とは文章を形態素(名詞や形容詞、助詞等)に分けて、文章を構造化、視覚化することです。

MeCabはその日本語対応のライブラリで、Word2Vecはテキストを解析して、単語の意味をベクトル化する手法です。

MeCabで前後で一緒によく使われる単語(コーパス)を収集してそれをWord2Vecでニューラルネットワーク学習モデルにするという使い方がされています。

Word2Vecはちょっとわかりづらいですが、コーパスの関連度を数値化することで関連性を可視化するのに役立ちます。

第10章 Pandasによる解析とMatplotlibによる可視化

Pandasは数値解析ライブラリで、スクレイピングした数値を図表や時系列分析することができます。

それをグラフなど可視化するためのライブラリがMatplotlibとなります。

本書では折れ線グラフや、散布図が表現されています。

第11章 スクレイピング結果を自動通知する

ここではスクレイピングの枠を出て、より効果的にWebから取得したデータを保持したり、利用したりするかについて焦点がおかれています。

例えばスマホにプッシュ通知をしたり、Slackのwebhookを利用してSlackに通知したり、Google SpreadSheetに転記する方法についてハンズオンで取り組んでいます。

第12章 スマートフォンスクレイピング

必要になったらまとめます。

第13章 Raspberry Piにポータブル・スクレイピング・ハッキング・ラボを構築する

必要になったらまとめます。

読んだ感想

内容はとてもわかりやすく、幅広いトピックに触れているためスクレイピングの導入としておすすめです。

本書で必要最低限の技術を得たら、スクレイピングへの興味も増して目的をもってスクレイピングすることができると思います。

私個人としては簡単なスクレイピングChromeのWeb Scraperを使うのが一番楽かな~と思うので、スクレイピングを行う明確な目的があるならこちらを利用することも検討するといいと思います。

(本書の要約ではないですが、私はWeb ScraperとGASを使ってWantedlyのアナリティクスをSpredSheetに出力した経験があるので多少知見はあります。)

目的が機械学習やNumPyを利用した数値解析であれば、Python導入・利用への足掛かりとして本書がとてもいいきっかけになると思います。

今回は要約と言いつつ、自分のアウトプット重視で網羅的に紹介できなかったのでこのエントリーを読んで少しでも興味があれば購入して読んでみることをお勧めいたします。