pythonクローリング・スクレイピング入門の一冊は?感想とメモ【ライブラリ活用】

※本サイトはプロモーションが含まれています

Pythonクローリング&スクレイピング ―データ収集・解析のための実践開発ガイド」という本が入門に役立ちます。

Pythonクローリング&スクレイピングの概要

Pythonクローリング&スクレイピングの概要は以下の通り。

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

引用元:Pythonクローリング&スクレイピング

 

Pythonクローリング&スクレイピングの内容

Pythonクローリング&スクレイピングの内容は以下の通り

  • 1.クローリング・スクレイピングとは何か
  • 2.Pythonではじめるクローリング・スクレイピング
  • 3.強力なライブラリの活用
  • 4.実用のためのメソッド
  • 5.クローリング・スクレイピングの実践とデータの活用
  • 6.フレームワーク Scrapy
  • 7.クローラーの継続的な運用・管理

 

Pythonクローリング&スクレイピングはこんな人にオススメ

Pythonクローリング&スクレイピングはこんな人にオススメです!

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

 

python自体の話も10~20ページほどありますが、基本的には、

  • プログラミングはある程度できる(入門書レベルは問題ない)人
  • pythonをいきなり触っても問題ない人
  • ライブラリとか、DBの利用方法が分かる人

に向けて書かれています。

※プログラミング初心者向きではないということです

 

そんな前提条件をクリアした中で、

  • クローリングを試してみたい
  • スクレイピングを試してみたい
  • 実用的な形で運用してみたい

というニーズ答える本になっています。

周辺知識(NoSQLへの保存とか)まで扱っています。

400ページにかなり濃い情報が詰まっています。

 

Pythonクローリング&スクレイピング各章のメモ

各章のメモです。

Pythonクローリング&スクレイピング【第1章まとめ】

クローリングとはクローラーを使ってデータを収集することです。

Webクローラーは「スパイダー」「ボット」などと呼ばれる、ウェブページ上の情報を取得するプログラム。

Googleなどの検索エンジンもここに含まれる。

 

一方で、混同されがちですが「スクレイピング」はWebページから必要な情報を抜き出す作業です。

 

第1章では、そんな2つの動作をコマンドラインから実行しています。

具体的には

  • Unixコマンドの「wget」でクローリング
  • Unixコマンドの「grep, sed(awk)」等でスクレイピング

を行っています。

 

この章は、こうすれば出来るよー、という提示と、用語の説明などをしているだけなので、特に自分で試さなくても良いと思います。

 

Pythonクローリング&スクレイピング【第2章まとめ】

第2章では、クローリング・スクレイピングにPythonを使うべき理由が述べられています。

サードパーティーのスクレピングライブラリが優秀である点、またスクレイピング後の処理(分析)も強い点が主な理由です。

 

クローリングに関しては、取得したHTTPレスポンスのヘッダーからエンコーディングを見て、どれでデコードするかを判断する、という話が最初に載っています。

 

スクレイピングに関しては以下の2つの手法があげられています

  • 正規表現
  • XMLパーサー

XMLパーサーでHTML文書をパースするのは現実的にはできないので注意(閉じタグがなかったり、文法が不正確だったりする)。

逆に言うと、レンダーは賢いということですね。

 

ちなみにr’…’というraw文字列(そのまま扱う=生物として扱う)を使うと正規表現は便利です。

※バックスラッシュがエスケープ文字として解釈されないので

 

2章の最後では、クローリングしたデータをどのように保存するかという方法が3種類示されています

  1. CSV形式(TSV形式)で保存
  2. JSON形式で保存
  3. DBへ保存

 

ちなみに、標準ではSQLiteへの保存が可能です。

サーバとしてではなくアプリケーションに組み込んで利用される軽量のRDBですが、ファイルへの書き込みが遅い(ボトルネックになる)という問題があります。

 

Pythonクローリング&スクレイピング【第3章まとめ】

第3章「強力なライブラリの活用」についてです。

 

スクレイピングのためのライブラリ紹介

PythonのパッケージリポジトリはPyPI(Python Package Index)。

※Node.jsにおけるnpmのようなもの

 

ライブラリのインストールにはpipが良い

※easy_installはアンインストールが出来ないなどの弱点があるため、使われていない

 

スクレイピングに使うライブラリとしてはCSSセレクターを学習するのが良いようです。

  • XPath:細かな条件を指定可能(複雑)
  • CSSセレクター:細かな指定は出来ない。1つだけ習得ならこちらが良い(簡単)

Beautiful SoupなどのサードパーティではXPathをサポートしていないことを考えると、余計にCSSセレクターを勉強するほうが良さそうです。

 

ブラウザでCSSセレクターを取得するには開発者向けツールから、右クリックしてCopy -> Copy selectorでOK。

※XPathならCopy XPath

 

DBへの保存

DBへの保存では、MySQLへの保存、MongoDBへの保存が紹介されています。

MongoDBとはNoSQLの一種です。

  • ドキュメント型
  • オープンソース
  • 1つのDBは複数のコレクションを持つ
  • 1つのコレクションは複数のドキュメントを持つ
  • ドキュメントはBSON(JSONのバイナリ版形式)で扱われる
  • DBへの書き込み速度が早い

 

ちなみにDB格納時には、プライマリーキーはサロゲートキー(自動生成されるキー)を使うほうが良い。

※URLは変更しうる(リダイレクトなどされるる)

 

クローラーの作成

クローラーの作成です

サンプルが本に載っているので、それを見ればOK(コレが本当に役立ちますね…)

基本的には

  • 対象ページの構造を事前に知っておく
  • データを取得する
  • 空白文字を消したり整形する
  • DBに格納する

という流れ。

 

Pythonクローリング&スクレイピング【第4章まとめ】

第4章は「実用のためのメソッド」です。

状態を保つ場合

状態を持つ(ステートフル)なクローラーを作る場合は、HTTP上で状態を保持する必要があります。

  • Cookieを使う。Requestsで、Sessionオブジェクトを使う
  • HTTPヘッダにRefererを使う。1つ前に閲覧したページのURLをサーバーに送る

 

JavaScriptを解釈する場合

JavaScriptを解釈する場合には、Seleniumというプログラムからブラウザを自動操縦するツールを使うのが良いです。

ヘッドレスブラウザーも操作可能です(GUI、画面がないブラウザ)。

代表的なヘッドレスブラウザーはPhantomJSです。

 

迷惑をかけないクローラーの作り方

迷惑をかけないクローラーを作りましょう、というお話。

クローラー作成者が知っておくべき法律は3つあります。

  1. 複製権:収集したWebページを保存する権利
  2. 翻案権:収集したWebページから新たな著作物を想像する権利
  3. 公衆送信権:収集したWebページをサーバーから公開する権利

 

これらの法律を侵さないようにしましょう。

また、クロール先に負荷をかける事で、業務妨害になることを避けるように。

※1秒に1回のクロールでも、岡崎市立中央図書館へアクセスした、偽計業務執行妨害罪で逮捕されました

 

基本的には

  • クロールの感覚は1秒以上開けること
  • HTTPステータスコードが408,500,502,503,504エラーの場合は、指数関数的にリトライすること(1秒、2秒、4秒、8秒…)

が大事です。

 

Pythonクローリング&スクレイピング【第5章まとめ】

第5章は「実践とデータ活用」です。

 

Wikipediaのデータセットを扱う

Wikipediaのデータセットダウンロードに関しては、以下からダウンロード可能。

Latest(最新)から落とすのが良いでしょう。

Index of /jawiki/

 

Wikiの中は見れば分かるのですが、XMLファイルです。

PythonのWikiextractorというライブラリを使って読み込みのが良いでしょう。

GitHub – attardi/wikiextractor: A tool for extracting plain text from Wikipedia dumps

Module:If empty

 

 

自然減処理技術(MeCab)を使う

自然減処理技術(MeCab)を使う話もありました。

書籍ではMacやUnix用の方法が載っています。

私はWindows環境で構築しているので、こちらのサイトを参考にしました。

PythonとMeCabで形態素解析(on Windows)

 

Web上の新しい単語を取り込むためには、最新のデータセットを扱うようにしましょう。

ここのリンクに色々あります。

情報学研究データリポジトリ ニコニコデータセット

GitHub – neologd/mecab-ipadic-neologd: Neologism dictionary based on the language resources on the Web for mecab-ipadic

 

Webサービスからデータを取得する方法

Webサービスからデータを取得する方法については、各サービスごとのAPIを使う必要があります。

  • Twitter(REST APIとStreaming API)
  • Amazon(Product Advertising API)
  • Youtube(Youtube Data API)

その他、時系列情報を取得する方法などもありましたが、割愛します。

 

オススメなPythonのクローリング・スクレイピング関係のライブラリ

クローリング用

  • urllib:Webページを手軽に取得。HTTPヘッダカスタマイズ、Basic認証など複雑な処理には向いていない
  • http.client:低水準なHTTP通信のAPIを提供するモジュール(人間が使うのには向いていない)

 

スクレイピング用

  • html.parser:標準モジュール。クラス定義、タグに応じた処理が必要なので面倒くさい。サードパーティーを使ったほうが良い
  • re:正規表現使える。この時、match関数ではなくsearch関数をよく使う
  • xml.etree.ElementTree:XMLパースするのに便利。標準ライブラリ。

 

スクレイピング、クローリング関係のライブラリ

  • Requests:人間のためのHTTPというキャッチフレーズの使いやすいライブラリ。HTTPメソッドのPOST, PUT, DELETE, HEAD, OPTIONS相応のものが使える。HTTPヘッダの追加、Basic認証も可能。HTTPKeep-Aliveも可能
  • lxml:C言語のXML処理ライブラリ(libml2,libxslt)のpythonバインディング。C言語拡張であるため、他のライブラリより軽いのが特徴(高速処理可能)。いわゆるパーサー
  • Beautiful Soup:シンプルにデータを取り出せる。
  • pyquery:javascriptライブラリのjQueryと似たインタフェースでスクレイピング出来る
  • XPath(XML Path Language):XML特定要素を指定するための言語
  • CSSセレクター:CSSで装飾する要素を指定するための表記方法
  • feedparser:ElementTreeより簡単にRSSフィードからスクレイピング可能(バージョン、仕様の違いを気にせずに使用可能)

 

MySQL関連のライブラリ

MySQL関連のライブラリはこちら

  • mysqlclient:MySQLのクライアントライブラリ「libmysqlclient」を使ったC拡張ライブラリ
  • MySQL Connector/Python:
  • PyMySQL

 

その他のライブラリ

その他のライブラリで使えそうなものをまとめました。

  • Voluptuous:スキーマ(ルールの集合)を簡単に定義できる

 

以上。

クローリングとスクレイピングの概要を知れて良い本です。

評価が高いため、2019年に増補改訂版が出ています。

間違えずに、増補改訂版を買うようにしてくださいね

コメントはお気軽にどうぞ