Fresopiya
場所にもお金にも時間にも、何にも縛られない自由な状態になったら一体人間は何をしてどこに向かうのか。 まずはとにかく自由を目指すエンジニアのブログです。

哲学とプログラミングとブログがメインになるかと。
Python

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

どうも、とがみんです。

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

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

今回目指すもの

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

scrapyの詳細

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

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

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

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

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

>引用:Architecture overview|scrapy

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

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

  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_DELAY 1つのページをダウンロードしてから、次のページをダウンロードするまでの間隔。
DEPTH_LIMIT クロールできる最大の深さ。
ROBOTSTXT_OBEY robots.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)