書籍概要

Pythonクローリング&スクレイピング
―データ収集・解析のための実践開発ガイド―

著者
発売日
更新日

概要

Pythonによるクローリング・スクレイピングの入門から実践までを解説した書籍です。基本的なクローリングやAPIを活用したデータ収集,HTMLやXMLの解析から,データ取得後の分析や機械学習前の処理まで解説。データの収集・解析,活用がしっかりと基本から学べます。Webサービスの開発やデータサイエンスや機械学習分野で実用したい人はもちろん,基礎から解説しているのでPython初心者でもつまずかずに学習できます。多数のライブラリ,強力なフレームワークを活用して高効率に開発できます。

こんな方におすすめ

  • 業務や学術研究でクローラーを作りたい人
  • Pythonの一歩先の活用方法に興味のある人

サンプル

目次

1. クローリング・スクレイピングとは何か

  • 1. 本書が取り扱う領域
  • 2. Wgetによるクローリング
  • 3. Unixコマンドによるスクレイピング
  • 4. gihyo.jpのスクレイピング
  • 5. まとめ

2. Pythonではじめるクローリング・スクレイピング

  • 1. Pythonを使うメリット
  • 2. Pythonのインストールと実行
  • 3. Pythonの基礎知識
  • 4. Webページを取得する
  • 5. Webページからデータを抜き出す
  • 6. データを保存する
  • 7. Pythonによるスクレイピングの流れ
  • 8. まとめ

3. 強力なライブラリの活用

  • 1. ライブラリのインストール
  • 2. Webページを簡単に取得する
  • 3. HTMLのスクレイピング
  • 4. RSSのスクレイピング
  • 5. データベースに保存する
  • 6. クローラーとURL
  • 7. Pythonによるクローラーの作成
  • 8. まとめ

4. 実用のためのメソッド

  • 1. クローラーの分類
  • 2. クローラー作成にあたっての注意
  • 3. 繰り返しの実行を前提とした設計
  • 4. クロール先の変化に対応する
  • 5. まとめ

5. クローリング・スクレイピングの実践とデータの活用

  • 1. データセットの取得と活用
  • 2. APIによるデータの収集と活用
  • 3. 時系列データの収集と活用
  • 4. オープンデータの収集と活用
  • 5. Webページの自動操作
  • 6. JavaScriptを使ったページのスクレイピング
  • 7. 取得したデータの活用
  • 8. まとめ

6. フレームワーク Scrapy

  • 1. Scrapyの概要
  • 2. Spiderの作成と実行
  • 3. 実践的なクローリング
  • 4. 抜き出したデータの処理
  • 5. Scrapyの設定
  • 6. Scrapyの拡張
  • 7. クローリングによるデータの収集と活用
  • 8. 画像の収集と活用
  • 9. まとめ

7. クローラーの継続的な運用・管理

  • 1. クローラーをサーバーで動かす
  • 2. クローラーの定期的な実行
  • 3. クローリングとスクレイピングの分離
  • 4. クローリングの高速化・非同期化
  • 5. クラウドを活用する
  • 6. まとめ

サポート

ダウンロード

(2017年1月18日更新)

サンプルファイルのダウンロード

本書のサンプルファイルをご利用いただけます。
サンプルファイルの利用方法についてはzipファイル内のREADME.txtを参照してください。

ダウンロード
sample_codes.zip

補足情報

(2017年1月18日更新)

Webサイトの変更等により動作しなくなった箇所の修正情報を一部掲載します。

P.192, 5.6.1 JavaScriptを使ったページへの対応方法

PhantomJS 1.9.8を使用した場合,リスト5.25(P.201)とリスト5.26(P.203)のスクリプトが正常に動作しなくなっています。
最新のPhantomJS 2.1.1を使用すると改善します。

OS XではHomebrewで最新版(2016-12-06時点で2.1.1)がインストールされます。
古いバージョンを使用中の場合は`brew upgrade phantomjs`で最新版をインストールできます。

Ubuntuではインストール手順で`1.9.8`となっている箇所をすべて`2.1.1`に置き換えて実行すると2.1.1をインストールできます。


$ wget  
https://bitbucket.org/ariya/phantomjs/downloads/phantomjs-2.1.1-linux-x86_64.tar.bz2
$ tar xvf phantomjs-2.1.1-linux-x86_64.tar.bz2 # bz2ファイルを解凍する
$ sudo cp phantomjs-2.1.1-linux-x86_64/bin/phantomjs /usr/local/bin/ #  
PATHの通ったところにバイナリをコピーする
$ sudo apt-get install -y libfontconfig1 fonts-migmix

バージョンを確認すると2.1.1となります。


$ phantomjs --version
2.1.1

P.198, 5.6.2 noteのおすすめコンテンツを取得する

ページ読み込みのタイミングによっては,リスト5.24(P.198),リスト5.25(P.201),リスト5.26(P.203)のスクリプトが失敗することがあります。

この場合,`driver.get()`の後,
`driver.find_elements_by_css_selector()`または
`driver.execute_script()`の前に`time.sleep(2)`でスリープを入れると成功します。

P.200の解説にあるように,通常のWebページでは`driver.get()`の実行時にonloadイベントの発生時点までブロックされます。一方,noteのようにSingle Page Applicationの場合,onloadイベント以降もAjaxによる通信が継続していることがあります。このため,スリープを入れてAjaxの通信が完了するのを待ちます。

本来はAjaxの通信が完了するまで待つべきですが,そのような待ち方を指定できないので,ここでは仮に2秒としています。


    print('Navigating...', file=sys.stderr)
    driver.get('https://note.mu/')  # noteのトップページを開く。
    assert 'note' in driver.title  # タイトルに'note'が含まれていることを確認する。
    time.sleep(2)  # 2秒間待つ。 ← この行を追加

リスト5.24(get_note_content.py)では,ファイル冒頭に`import time`も追加してください。

サンプルファイルは修正済みです。

P.228, 6.1.2 Spiderの実行

ScrapingHub社のブログの構造の変更により,リスト6.1の`myspider.py`は投稿を1件も取得できなくなっています。

ScrapyのWebサイトに掲載されているサンプルコードも変更されています。 新しいサンプルコードにコメントを追加すると以下のようになります。(サンプルファイルに`6-1/myspider_mod.py`として同梱)



import scrapy


class BlogSpider(scrapy.Spider):
     name = 'blogspider'  # Spiderの名前。
     # クロールを開始するURLのリスト。
     start_urls = ['https://blog.scrapinghub.com']

     def parse(self, response):
         """
         ページから投稿のタイトルをすべて抜き出し,ベージャーをたどる。
         """

         # ページから投稿のタイトルをすべて抜き出す。
         for title in response.css('h2.entry-title'):
             yield {'title': title.css('a ::text').extract_first()}

         # ページャーの次のページへのリンクを取得し,次のページがあれば 
たどる。
         # 次のページもparse()メソッドで処理する。
         next_page = response.css('div.prev-post > a  
::attr(href)').extract_first()
         if next_page:
             yield scrapy.Request(response.urljoin(next_page),  
callback=self.parse)

このSpiderは「一覧のみパターン」のSpiderで,まずブログのトップページから投稿のタイトルをすべて抜き出します。
続いてページ下部にある「OLDER POST」というリンクをたどって,次のページを取得します。
そこからも同様に投稿のタイトルをすべて抜き出し,さらに次のページへと再帰的に繰り返します。
後のページまでたどって「OLDER POST」というリンクがなくなったら終了です。

リンクをたどる流れを図で表すと次のようになります。

sample.png

実行結果は書籍内のものと変わりません。

正誤表

本書の以下の部分に誤りがありました。ここに訂正するとともに,ご迷惑をおかけしたことを深くお詫び申し上げます。

(2017年1月18日更新)

目次 「A.1.2 Vagrantとは」の対応ページ(第2刷以降修正済み)

362
361

P.68 表3.1「直下のテキストが"概要"というテキストであるh2要素」のXPath(第2刷以降修正済み)

//h2[text()="概要")]
//h2[text()="概要"]

2つ目の「)」が不要です。

P.140 脚注番号21のURL(第2刷以降修正済み)

https://dev.twitter.com/overview/api/twitter-libraries
https://dev.twitter.com/resources/twitter-libraries

商品一覧