「Pythonクローリング&スクレイピング ―データ収集・解析のための実践開発ガイド」という本が入門に役立ちます。
目次
Pythonクローリング&スクレイピングの概要
Pythonクローリング&スクレイピングの概要は以下の通り。
Pythonによるクローリング・スクレイピングの入門から実践までを解説した書籍です。基本的なクローリングやAPIを活用したデータ収集,HTMLやXMLの解析から,データ取得後の分析や機械学習前の処理まで解説。データの収集・解析,活用がしっかりと基本から学べます。Webサービスの開発やデータサイエンスや機械学習分野で実用したい人はもちろん,基礎から解説しているので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種類示されています
- CSV形式(TSV形式)で保存
- JSON形式で保存
- 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つあります。
- 複製権:収集したWebページを保存する権利
- 翻案権:収集したWebページから新たな著作物を想像する権利
- 公衆送信権:収集したWebページをサーバーから公開する権利
これらの法律を侵さないようにしましょう。
また、クロール先に負荷をかける事で、業務妨害になることを避けるように。
※1秒に1回のクロールでも、岡崎市立中央図書館へアクセスした、偽計業務執行妨害罪で逮捕されました
基本的には
- クロールの感覚は1秒以上開けること
- HTTPステータスコードが408,500,502,503,504エラーの場合は、指数関数的にリトライすること(1秒、2秒、4秒、8秒…)
が大事です。
Pythonクローリング&スクレイピング【第5章まとめ】
第5章は「実践とデータ活用」です。
Wikipediaのデータセットを扱う
Wikipediaのデータセットダウンロードに関しては、以下からダウンロード可能。
Latest(最新)から落とすのが良いでしょう。
Wikiの中は見れば分かるのですが、XMLファイルです。
PythonのWikiextractorというライブラリを使って読み込みのが良いでしょう。
GitHub – attardi/wikiextractor: A tool for extracting plain text from Wikipedia dumps
自然減処理技術(MeCab)を使う
自然減処理技術(MeCab)を使う話もありました。
書籍ではMacやUnix用の方法が載っています。
私はWindows環境で構築しているので、こちらのサイトを参考にしました。
PythonとMeCabで形態素解析(on Windows)
Web上の新しい単語を取り込むためには、最新のデータセットを扱うようにしましょう。
ここのリンクに色々あります。
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年に増補改訂版が出ています。
間違えずに、増補改訂版を買うようにしてくださいね