orangain flavor

じっくりコトコト煮込んだみかん2。知らないことを知りたい。

「Pythonクローリング&スクレイピング」という本を書きました

2016-12-23更新: 電子書籍書籍版の情報を更新しました。電子書籍版も好評発売中です!

Pythonを使ってクローリング・スクレイピングを行い、データを収集・活用する方法を解説した書籍です。 Pythonの基本から、サードパーティライブラリを使ったスクレイピング、様々なサイトからのデータ収集・活用、フレームワークScrapyの使い方、クローラーの運用までを扱っています。

クローリング・スクレイピングPython

Pythonは言語自体の書きやすさ、ライブラリが充実していること、データ解析との親和性が高いことなどから、クローリング・スクレイピングに向いている言語です。 Pythonの初歩から解説しているので、何らかの言語の経験があればPythonの経験がない方でも読み進められる内容になっています。

また、クローリング・スクレイピングフレームワークScrapyの存在も大きいです。 本書ではScrapyに1つの章を割いて解説しています。日本語でScrapyの使い方をここまで詳しく解説した書籍は初めてではないかと思います。

ちなみに全編Python 3による解説です。Python 3.4で追加されたasyncioによる非同期I/Oの説明もあります。

章の構成

第1章「クローリング・スクレイピングとは何か」では、まずPythonを使わずにUnixコマンドだけで簡単にクローリング・スクレイピングを行います。 Unixコマンドを使うと、Pythonスクリプトを書くほどでないデータ処理が簡単にできるので知っておいて損はないと思います。

第2章「Pythonではじめるクローリング・スクレイピングでは、Pythonの標準ライブラリのみでクローリング・スクレイピングを行います。Pythonを使うと柔軟にスクレイピングできることを体感します。

第3章「強力なライブラリの活用」では、便利なサードパーティライブラリを使ってクローリング・スクレイピングを行います。 Requests、Beautiful Soup、lxmlなどの定番ライブラリを使うことで、標準ライブラリだけでは難しい処理が簡単にできるようになります。

第4章「実用のためのメソッド」では、実際のWebサイトを対象としてクローリング・スクレイピングを行う際に相手のWebサイトに迷惑をかけないための注意点を解説します。

第5章「クローリング・スクレイピングの実践とデータの活用」では実際に様々なWebサイトからデータを収集・活用します。 第5章は1番長く、書籍全体の1/4を占めています。 データセットAPIを使ったデータ収集、CSV/Excelファイルからの時系列データの取得、オープンデータの収集、Webページへのログイン、JavaScriptを使ったページへの対応などのトピックがあります。 データ活用の面では、日本語の自然言語処理、グラフによる可視化、RSSフィードの生成、地図による可視化、BigQueryによる解析などを扱っています。

第6章「フレームワーク Scrapy」では、強力なクローリング・スクレイピングフレームワークのScrapyを使って、効率のよいクローラーを簡単に作成します。 第6章も第5章に次ぐ長さで、ScrapyによるSpiderの作成方法からScrapyの設定やMiddlewareによる拡張方法まで幅広く解説しています。 Elasticsearchを使った検索サイトの作成やOpenCVによる顔画像の抽出などのデータ活用も解説します。

第7章「クローラーの継続的な運用・管理」では、クローラーを継続的に運用していくためのノウハウを解説します。 クラウド上でのサーバーでの運用や、メッセージキューを使ったクローリングとスクレイピングの分離などのトピックがあります。 マルチスレッド・マルチプロセス・非同期I/Oを活用したクローリングの高速化についても紹介します。

出版にあたって

最初にお話を頂いた時はちょっと驚きましたが、書いていたらクローリング・スクレイピングの話は意外と自分に合っていると感じました。 面倒な作業を自動化したり、使いづらいUIを再構成したりするために、クローラーを作成することがよくあったからです。

最初は数百ページも書けるか不安もありましたが、実際に書いてみると書きたいことが多くあり、ページ数を減らすのに苦労したなどいくつかの事情で丸2年もかかってしまいました。ただ、遅くなったお陰でScrapyやその他Python 2のみ対応だったライブラリがPython 3に対応して、わかりやすくなった面もあります。

クローリング・スクレイピングは泥臭い作業ですが、アイデア次第でいろいろな応用が考えられ、プログラミングの楽しさを手軽に味わえる分野だと思います。 ご興味ありましたらお買い求めいただけると幸いです。

目次

第1章 クローリング・スクレイピングとは何か
    1.1.  本書が取り扱う領域
        1.1.1.  クローリングとスクレイピング
        1.1.2.  クローリング・スクレイピングとPython
        1.1.3.  本書が対象とするプラットフォーム
        1.1.4.  本書の構成
    1.2.  Wgetによるクローリング
        1.2.1.  Wgetとは
        1.2.2.  Wgetの使い方
        1.2.3.  実際のサイトのクローリング
    1.3.  Unixコマンドによるスクレイピング
        1.3.1.  Unixコマンドの基礎知識
        1.3.2.  テキスト処理に役立つUnixコマンド
        1.3.3.  正規表現
    1.4.  gihyo.jpのスクレイピング
        1.4.1.  電子書籍の総数を取得する
        [column]   正規表現における欲張り型のマッチ
        1.4.2.  書籍名の一覧を取得する
    1.5.  まとめ
第2章 Pythonではじめるクローリング・スクレイピング
    2.1.  Pythonを使うメリット
        2.1.1.  言語自体の特性
        2.1.2.  強力なサードパーティライブラリの存在
        2.1.3.  スクレイピング後の処理との親和性
    2.2.  Pythonのインストールと実行
        2.2.1.  Python 2とPython 3
        2.2.2.  パッケージマネージャーによるPython 3のインストール
        2.2.3.  仮想環境(venv)の使用
        2.2.4.  インタラクティブシェルの使用
    2.3.  Pythonの基礎知識
        2.3.1.  スクリプトファイルの実行と構成
        2.3.2.  基本的なデータ構造
        2.3.3.  制御構造と関数・クラス定義
        2.3.4.  組み込み関数
        2.3.5.  モジュール
    2.4.  Webページを取得する
        2.4.1.  urllibによるWebページの取得
        2.4.2.  文字コードの扱い
    2.5.  Webページからデータを抜き出す
        2.5.1.  正規表現によるスクレイピング
        [column]   search() と match()
        2.5.2.  XML(RSS)のスクレイピング
    2.6.  データを保存する
        2.6.1.  CSV形式での保存
        2.6.2.  JSON形式での保存
        2.6.3.  データベース(SQLite 3)への保存
    2.7.  Pythonによるスクレイピングの流れ
    2.8.  まとめ
第3章 強力なライブラリの活用
    3.1.  ライブラリのインストール
        3.1.1.  pipによるインストール
    3.2.  Webページを簡単に取得する
    3.3.  HTMLのスクレイピング
        3.3.1.  XPathとCSSセレクター
        3.3.2.  lxmlによるスクレイピング
        3.3.3.  Beautiful Soupによるスクレイピング
        [column]   pyqueryによるスクレイピング
    3.4.  RSSのスクレイピング
    3.5.  データベースに保存する
        3.5.1.  MySQLへのデータの保存
        [column]   Python Database API 2.0
        3.5.2.  MongoDBへのデータの保存
    3.6.  クローラーとURL
        3.6.1.  URLの基礎知識
        3.6.2.  パーマリンクとリンク構造のパターン
        3.6.3.  再実行を考慮したデータの設計
    3.7.  Pythonによるクローラーの作成
        3.7.1.  一覧ページからパーマリンク一覧を抜き出す
        3.7.2.  詳細ページからスクレイピングする
        3.7.3.  詳細ページをクロールする
        3.7.4.  スクレイピングしたデータを保存する
    3.8.  まとめ
第4章 実用のためのメソッド
    4.1.  クローラーの分類
        4.1.1.  状態を持つかどうかによる分類
        4.1.2.  JavaScriptを解釈するかどうかによる分類
        4.1.3.  不特定多数のサイトを対象とするかどうかによる分類
    4.2.  クローラー作成にあたっての注意
        4.2.1.  著作権と利用規約
        4.2.2.  robots.txtによるクローラーへの指示
        4.2.3.  XMLサイトマップ
        4.2.4.  クロール先の負荷
        4.2.5.  連絡先の明示
        4.2.6.  ステータスコードとエラー処理
    4.3.  繰り返しの実行を前提とした設計
        4.3.1.  更新されたデータだけを取得する
        [column]   プロキシサーバーでのキャッシュ
    4.4.  クロール先の変化に対応する
        4.4.1.  変化を検知する
        4.4.2.  変化を通知する
    4.5.  まとめ
第5章 クローリング・スクレイピングの実践とデータの活用
    5.1.  データセットの取得と活用
        5.1.1.  Wikipediaのデータセットのダウンロード
        5.1.2.  自然言語処理技術を用いた頻出単語の抽出
    5.2.  APIによるデータの収集と活用
        5.2.1.  Twitterからのデータの収集
        5.2.2.  Amazonの商品情報の収集
        5.2.3.  YouTubeからの動画情報の収集
    5.3.  時系列データの収集と活用
        5.3.1.  為替などの時系列データの収集
        5.3.2.  CSV/Excelファイルの読み込み
        5.3.3.  グラフによる可視化
        [column]   pandasとmatplotlib
        [column]   科学技術計算やデータ分析のための便利なツール: IPython・Jupyter・Anaconda
    5.4.  オープンデータの収集と活用
        5.4.1.  オープンデータとは
        5.4.2.  PDFからのデータの抽出
        5.4.3.  Linked Open Dataからのデータの収集
        [column]   オープンデータとシビックテック
    5.5.  Webページの自動操作
        5.5.1.  自動操作の実現方法
        5.5.2.  Amazon.co.jpの注文履歴を取得する
    5.6.  JavaScriptを使ったページのスクレイピング
        5.6.1.  JavaScriptを使ったページヘの対応方法
        5.6.2.  noteのおすすめコンテンツを取得する
        5.6.3.  RSSフィードを生成する
    5.7.  取得したデータの活用
        5.7.1.  地図による可視化
        [column] JSONに対してクエリを実行するjqコマンド
        5.7.2.  BigQueryによる解析
    5.8.  まとめ
第6章 フレームワーク Scrapy
    6.1.  Scrapyの概要
        6.1.1.  Scrapyのインストール
        6.1.2.  Spiderの実行
    6.2.  Spiderの作成と実行
        6.2.1.  Scrapyプロジェクトの開始
        6.2.2.  Itemの作成
        6.2.3.  Spiderの作成
        6.2.4.  Scrapy Shellによるインタラクティブなスクレイピング
        [column]   ScrapyのスクレイピングAPIの特徴
        6.2.5.  作成したSpiderの実行
        [column]   FTPサーバーやAmazon S3などにデータを保存する
    6.3.  実践的なクローリング
        6.3.1.  クローリングでリンクをたどる
        6.3.2.  XMLサイトマップを使ったクローリング
    6.4.  抜き出したデータの処理
        6.4.1.  Item Pipelineの概要
        6.4.2.  データの検証
        6.4.3.  MongoDBへのデータの保存
        6.4.4.  MySQLへのデータの保存
    6.5.  Scrapyの設定
        6.5.1.  設定の方法
        6.5.2.  クロール先に迷惑をかけないための設定項目
        6.5.3.  並行処理に関する設定項目
        6.5.4.  HTTPリクエストに関する設定項目
        6.5.5.  HTTPキャッシュの設定項目
        6.5.6.  エラー処理に関する設定
        6.5.7.  プロキシを使用する
    6.6.  Scrapyの拡張
        6.6.1.  ダウンロード処理を拡張する
        6.6.2.  Spiderの挙動を拡張する
        [column]   ScrapyでJavaScriptを使ったページに対応する:Splash
    6.7.  クローリングによるデータの収集と活用
        6.7.1.  レストラン情報の収集
        6.7.2.  不特定多数のWebサイトのクローリング
        6.7.3.  Elasticsearchによる全文検索
    6.8.  画像の収集と活用
        6.8.1.  Flickrからの画像の収集
        6.8.2.  OpenCVによる顔画像の抽出
        [column]   UbuntuでのOpenCV 3のビルド
    6.9.  まとめ
第7章 クローラーの継続的な運用・管理
    7.1.  クローラーをサーバーで動かす
        7.1.1.  仮想サーバーの立ち上げ
        [column]   Windowsから公開鍵認証を使ってSSH接続する
        [column]   AWS利用におけるセキュリティの注意点
        [column]   Windowsでサーバーにファイルを転送する
        7.1.2.  サーバーへのデプロイ
    7.2.  クローラーの定期的な実行
        7.2.1.  Cronの設定
        7.2.2.  エラーの通知
    7.3.  クローリングとスクレイピングの分離
        7.3.1.  メッセージキューRQの使い方
        [column]   Redisのデータの永続化に関する設定
        7.3.2.  メッセージキューによる連携
        [column]   ScrapyからRQにジョブを投入する
        7.3.3.  メッセージキューの運用
    7.4.  クローリングの高速化・非同期化
        7.4.1.  マルチスレッド化・マルチプロセス化
        7.4.2.  非同期I/Oを使った効率的なクローリング
        [column]   Python 3.4でasyncioを使う
        [column]   複数のマシンによる分散クローリング
    7.5.  クラウドを活用する
        7.5.1.  クラウドを使うメリット
        7.5.2.  AWSのSDKを使う
        7.5.3.  クラウドストレージを使う
    7.6.  まとめ
        [column]   外部サービスを活用したスクレイピング
Appendix Vagrantによる開発環境の構築
    A.1.  VirtualBoxとVagrant
        A.1.1.  VirtualBoxとは
        A.1.2.  Vagrantとは
    A.2.  CPUの仮想化支援機能を有効にする
        A.2.1.  Windows 10の場合
        A.2.2.  Windows 7の場合
        A.2.3.  ファームウェアの設定で仮想化支援機能を有効にする
    A.3.  VirtualBoxのインストール
    A.4.  Vagrantのインストール
    A.5.  仮想マシンを起動する
    A.6.  ゲストOSにSSH接続する
        A.6.1.  Tera Termのインストール
        A.6.2.  Tera TermでゲストOSにSSH接続する
    A.7.  Linuxの基本操作
        A.7.1.  ソフトウェアをインストールする
    A.8.  Vagrantで仮想マシンを操作するコマンド
        A.8.1.  仮想マシンを起動する(vagrant up)
        A.8.2.  仮想マシンを終了・再起動する(vagrant halt/reload)
        A.8.3.  仮想マシンを削除する(vagrant destroy)
        A.8.4.  仮想マシンの状態を表示する(vagrant status)
        A.8.5.  仮想マシンにSSH接続する(vagrant ssh)
        A.8.6.  仮想マシンをエクスポートする(vagrant package)

電子書籍版の発売日は未確定ですが、電子書籍版も発売予定です。 電子書籍版もPDF/EPUB版Kindle版共に紙版と同時発売です。

関連

orangain.hatenablog.com