プログラミング

【Python】scrapyによるWebスクレイピングの方法

どうも、とがみんです。

Googleのクローラーってどのようにしてデータを集めているんだろか、どのようにしてWeb上からデータを集めれば良いのか、と考えたことはあるでしょうか。

この記事では、スクレイピング用のフレームワークであるscrapyを用いて、Web上のデータをクロールし、スクレイピングする方法について紹介していきます。

今回目指すもの

今回目指すのは、以下写真のブログ「Fresopiya」のブログをクロールし、全てのブログの記事の「更新日時」、「記事タイトル」、「記事URL」を取得するプログラムを書いていきます。

scrapyの詳細

まず、「scrapy」について紹介します。

「scrapy」はクローリング、スクレイピングするためのPythonのフレームワークです。

クローリングとは、プログラムがインターネット上のリンクを辿ってWebサイトを巡回し、データを収集する行為のことで、

スクレイピングとは、収集したデータから、必要な情報を抜き出す行為のことです。

以下の図は「Scrapy」の概要についてです。「scrapy」を構成する要素やデータのフローを示しています。

>引用:Architecture overview|scrapy

主要コンポーネント役割
ENGINEコンポーネント間のデータのフローの制御。
特定のアクションが発生したら、イベントを発生させる。
SCHEDULEREngineから受け取ったリクエストをエンキューする。
DOWNLOADERダウンロードの処理。
SPIDERS取得したいURLや抽出したい部分を記述し、ダウンロードしたコンテンツをスクレイピングして、Itemを作成。
ITEM PIPELINESSPIDERSによって抽出されたアイテムの出力処理

上の図のフローについてです。

  1. Engineは、Spiderからクロールする最初のリクエストを取得します。
  2. Engineは、Schedulerにスケジュールし、Schedulerに、次のリクエストを要求します。
  3. Schedulerは、次のリクエストをEnginに返します。
  4. EnginはSchedulerから受け取ったリクエストをDownloaderに送信します。
  5. ページのダウンロードが完了すると、それをEnginに返します。
  6. EnginはDownloaderからのレスポンスを受け取り、Spiderに送信します。
  7. Spiderはレスポンスを処理し、収集したデータとつぎのリクエストをEngineに返します。
  8. Engineは処理されたアイテムをItem Pipelineに渡し、処理が完了したことをSchedulerに伝え、次のリクエストを要求します。

これらのプロセスは、Schedulerに溜まっているクロールをするリクエストがなくなるまで繰り返されます。

「scrapy」の仕組みはこんな感じです。

実装方法

次に実装方法について紹介していきます。

ライブラリのインストール

ターミナルで以下のコマンドを実行し、scrapyをインストールします。

$ pip install scrapy

プロジェクトの作成

以下のように$ scrapy startproject プロジェクト名をターミナルで実行すると、現在いるディレクトリに新しくフォルダが作成されます。

$ scrapy startproject fresopiya

以下はプロジェクト名をfresopiyaとした時に作成されたファイルです。

Itemsの作成

Items.pyにサンプルのクラスが記述されているので、以下のように収集したい項目をコードに書きます。

ブログ記事のURL、タイトル、公開日を格納するクラスを作成します。

Spiderの実装

spidersディレクトリに移動し、spiderファイルを作成します。

scrapy genspider スパイダー名 クロール対象ドメインコマンドを打ち作成します。

scrapy genspider scrapy_fresopiya fresopiya.com

作成したファイルを以下のように変更します。

start_urlsに指定したURLからクロールがスタートします。

response.css(‘article.post-list-item’)は、下図の赤枠で囲っているタグの情報を抜き出しています。classpost-list-itemのarticleタグごとにfor文の中身が実行されます。

itemの各キーの値に取得したデータを格納していきます。

yieldについては以下の記事を参考に。

>python の yield。サクッと理解するには return と比較

Setting

設定についてです。settings.pyというファイルがあるので、そこに各種設定をしていきます。

設定概要
DOWNLOAD_DELAY1つのページをダウンロードしてから、次のページをダウンロードするまでの間隔。
DEPTH_LIMITクロールできる最大の深さ。
ROBOTSTXT_OBEYrobots.txtポリシーを尊重するかどうか。

設定項目は他にもあります。

>設定|Scrapy

>robots.txtとは

プログラムの実行

ターミナルにて、scrapy_fresopiya.pyのファイルがあるディレクトリまで移動し、以下のコマンドを実行します。

scrapy runspider scrapy_fresopiya.py -o fresopiyaitems.csv

上記のコマンド実行すると、サイトをクロールし取得したデータをCSVファイルとして出力してくれます。fresopiyaitems.csvというファイルが生成されます。

これで、このブログの全ての記事の「更新日時」、「記事タイトル」、「記事URL」が取得できました。

まとめ

スクレイピング用のフレームワークである「scrapy」を用いて、Web上のデータをクロール、スクレイピングする方法について紹介しました。

実際にクローラーを作ってみることで、Googleのクローラーがどのようにして、データを収集しているのかのイメージがつくのではないでしょうか。

また、データの収集するにあたって、強力なツールになると思うので、是非試してみてください!

参考文献

>Scrapy入門① とりあえずクローラーを作って実行し、Webサイトからデータを取得してみるとこまで

>Architecture overview|scrapy

>Scrapy

>10分で理解する Scrapy

>Python, Scrapyの使い方(Webクローリング、スクレイピング)

>Scrapy入門(1)