素人がPythonでWebスクレイピングを実装する3

よこのじ(@yokonoji_work)です。

素人がPythonでWebスクレイピングを実装する」の第3回です。第2回記事では、スクレイピングとは何か、利用用途、スクレイピングの注意点について書きました。今回はスクレイピングするためのPythonライブラリの調査を行いました。

Pythonライブラリ

urllib.request

urllib.requestはPython標準のライブラリで、指定されたURLからHTTPページにアクセスするために必要な機能を持っています。

urllib.request — URL を開くための拡張可能なライブラリ

requests

こちらもHTTPページにアクセスするためのライブラリです。上記のPythonドキュメントにて、より高水準の HTTP クライアントインターフェイスとして紹介されていて、Pythonスクレイピングの分野では定番となっています。

Requests: HTTP for Humans™

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

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に特化したスクレイピングでは良い働きをしてくれそうです。

feedparser 5.2.1

Selenium

Seleniumはブラウザを自動化するためのプログラムです。Pythonバインディングされており、Pythonでも扱うことができます。ブラウザ操作の自動化において、Seleniumは定番のものです。

Selenium HQ

selenium 3.141.0

ブラウザの自動化とは、通常手動で行うフォームへの入力やボタンクリックのようなブラウザの操作をプログラムから実行するものです。HTML要素から操作対象を指定することができます。

この自動化は、Webサイトの動作テストやブラウザでの定型的な作業の自動化(並列処理も可能)に利用できます。

スクレイピングにおいては、次のような場合に利用されたりします。

  • JavaScriptによる動的なWebサイトのスクレイピング
  • Cookieやログインが必要なWebサイトのスクレイピング

Splinter

Selenium同様、ブラウザ操作を自動化するためのライブラリです。シンプルで使いやすい特徴があるようですが、日本語で情報を探すのが難しいため、SeleniumではなくSplinterを選ぶ理由は特にないように思います。

Splinterドキュメント

Scrapy

Scrapyは、Webサイトをクロールするためのフレームワークです。元々Webスクレイピングのために設計されたものですが、データマイニングや情報処理、アーカイブなどの幅広い利用が可能です。

Scrapy 1.5 documentation

python-scraping-scrapy

このように実行エンジンを中心に各処理が行われます。詳しくはドキュメントのアーキテクチャの概要をご確認ください。

  1. まずEngineがスタートURLを取得し、スケジューラにそのURLを持つRequestオブジェクトを渡す
  2. Engineがスケジューラに次のURLを聞く
  3. スケジューラが次のURLを返し、EngineがそれをDownloaderに渡す
  4. Downloaderがページのデータを取得し、ResponseオブジェクトをEngineに返す
  5. EngineがResponseを受け取り、それをSpiderに渡す
  6. Spiderがページのデータを解析し、データが入ったItemオブジェクトと次にスクレイピングするURLを持つResponseオブジェクトをEngineに返す
  7. Engineがそれらを受け取り、ItemオブジェクトをItem Pipelineに、Requestオブジェクトをスケジューラにそれぞれ渡す
  8. ステップ2から7をキューがなくなるまで繰り返す

Pythonでスクレイピング – Scrapy入門最初の2歩目

おすすめのライブラリ組み合わせ

定番のライブラリを組み合わせるのが良さそうです。

requestsBeautiful Soup

ブラウザ操作が必要となるスクレイピングにおいては、Seleniumを利用するのが良さそうですね。

requestsを使用すると、日本語の場合に文字化けが起こることがあるそうです。
Pythonのrequestsモジュールでの文字コード対策

これは、Beautiful Soupの文字コード自動判別の機能により回避することができます。requestsとBeautiful Soupの組み合わせであればこのような不具合も防げますし、情報が多いこともありますのでこの2つのライブラリでスクレイピングの実装を行いたいと思います。

 

Scrapyはフレームワークとして、これ一つでスクレイピングを実装できるものですが、情報があまり多くないことと、スクレイピングの仕組みを学ぶという意味も今回のシリーズにはありますので不採用としました。

 

手元に本を持っておくというのは、やはり使い勝手が良いですよ。

素人がPythonでWebスクレイピングを実装する1
素人がPythonでWebスクレイピングを実装する2
素人がPythonでWebスクレイピングを実装する4
素人がPythonでWebスクレイピングを実装する5
素人がPythonでWebスクレイピングを実装する6
素人がPythonでWebスクレイピングを実装する7
素人がPythonでWebスクレイピングを実装する8