よこのじ(@yokonoji_work)です。
「素人がPythonでWebスクレイピングを実装する」の第3回です。第2回記事では、スクレイピングとは何か、利用用途、スクレイピングの注意点について書きました。今回はスクレイピングするためのPythonライブラリの調査を行いました。
Pythonライブラリ
urllib.request
urllib.requestはPython標準のライブラリで、指定されたURLからHTTPページにアクセスするために必要な機能を持っています。
urllib.request — URL を開くための拡張可能なライブラリ
requests
こちらもHTTPページにアクセスするためのライブラリです。上記のPythonドキュメントにて、より高水準の HTTP クライアントインターフェイスとして紹介されていて、Pythonスクレイピングの分野では定番となっています。
html.parser
html.parserはPython標準のライブラリで、HTMLやXMLをパースするためのライブラリです。HTMLの構造を解析して、必要な情報を抽出することができます。
html.parser— HTML および XHTML のシンプルなパーサー
lxml
こちらもHTMLやXMLをパースするためのライブラリです。C言語のライブラリであるlibxml2とlibxsltのPythonバインディング(C言語の処理をPythonに橋渡しするもの)です。C言語による処理のため高速であることが特徴とされています。
lxml – XML and HTML with Python
Beautiful Soup
HTMLやXML、RSSをパースするためのライブラリです。パース処理にhtml.parser、lxml、html5libを指定できるようになっています。パースを行うために最も利用されている定番ライブラリです。
また、Beautiful Soupは取得したHTML文書を自動でutf-8に変換して返してくれます。文字のエンコーディングについて特に考えなくても良いのが、同系統の他のライブラリと比べたときの強みのようです。
Beautiful Soup 4.2.0 Doc. 日本語訳 (2013-11-19最終更新)
feedparser
こちらは様々な種類のRSSフィードをパースできるライブラリです。
RSS 0.9x、RSS 1.0、RSS 2.0、CDF、Atom 0.3、Atom 1.0を処理することができ、フォーマットの違いを吸収してくれるため、RSSに特化したスクレイピングでは良い働きをしてくれそうです。
Selenium
Seleniumはブラウザを自動化するためのプログラムです。Pythonバインディングされており、Pythonでも扱うことができます。ブラウザ操作の自動化において、Seleniumは定番のものです。
ブラウザの自動化とは、通常手動で行うフォームへの入力やボタンクリックのようなブラウザの操作をプログラムから実行するものです。HTML要素から操作対象を指定することができます。
この自動化は、Webサイトの動作テストやブラウザでの定型的な作業の自動化(並列処理も可能)に利用できます。
スクレイピングにおいては、次のような場合に利用されたりします。
- JavaScriptによる動的なWebサイトのスクレイピング
- Cookieやログインが必要なWebサイトのスクレイピング
Splinter
Selenium同様、ブラウザ操作を自動化するためのライブラリです。シンプルで使いやすい特徴があるようですが、日本語で情報を探すのが難しいため、SeleniumではなくSplinterを選ぶ理由は特にないように思います。
Scrapy
Scrapyは、Webサイトをクロールするためのフレームワークです。元々Webスクレイピングのために設計されたものですが、データマイニングや情報処理、アーカイブなどの幅広い利用が可能です。
このように実行エンジンを中心に各処理が行われます。詳しくはドキュメントのアーキテクチャの概要をご確認ください。
- まずEngineがスタートURLを取得し、スケジューラにそのURLを持つRequestオブジェクトを渡す
- Engineがスケジューラに次のURLを聞く
- スケジューラが次のURLを返し、EngineがそれをDownloaderに渡す
- Downloaderがページのデータを取得し、ResponseオブジェクトをEngineに返す
- EngineがResponseを受け取り、それをSpiderに渡す
- Spiderがページのデータを解析し、データが入ったItemオブジェクトと次にスクレイピングするURLを持つResponseオブジェクトをEngineに返す
- Engineがそれらを受け取り、ItemオブジェクトをItem Pipelineに、Requestオブジェクトをスケジューラにそれぞれ渡す
- ステップ2から7をキューがなくなるまで繰り返す
おすすめのライブラリ組み合わせ
定番のライブラリを組み合わせるのが良さそうです。
requests+Beautiful Soup
ブラウザ操作が必要となるスクレイピングにおいては、Seleniumを利用するのが良さそうですね。
requestsを使用すると、日本語の場合に文字化けが起こることがあるそうです。
Pythonのrequestsモジュールでの文字コード対策
これは、Beautiful Soupの文字コード自動判別の機能により回避することができます。requestsとBeautiful Soupの組み合わせであればこのような不具合も防げますし、情報が多いこともありますのでこの2つのライブラリでスクレイピングの実装を行いたいと思います。
Scrapyはフレームワークとして、これ一つでスクレイピングを実装できるものですが、情報があまり多くないことと、スクレイピングの仕組みを学ぶという意味も今回のシリーズにはありますので不採用としました。
- PythonとかScrapyとか使ってクローリングやスクレイピングするノウハウを公開してみる!
- Python, Scrapyの使い方(Webクローリング、スクレイピング)
- Pythonを用いたWebスクレイピングの開発ノウハウ〜スポーツデータの場合(野球風味)
手元に本を持っておくというのは、やはり使い勝手が良いですよ。
[itemlink post_id=”630″]
素人がPythonでWebスクレイピングを実装する1
素人がPythonでWebスクレイピングを実装する2
素人がPythonでWebスクレイピングを実装する4
素人がPythonでWebスクレイピングを実装する5
素人がPythonでWebスクレイピングを実装する6
素人がPythonでWebスクレイピングを実装する7
素人がPythonでWebスクレイピングを実装する8
[toggle title=”参考サイト”]
[/toggle]