第6章 Scrapy Tutorial2

はじめに

ここでは、架空のオンライン書店のWebページをスクレイピングし、Scrapyでクローラーを作成します。架空のオンライン書店とはいえ、HTMLの構造は一般的なECサイトなどとは変わらないので、非常によい練習になると思います。

プロジェクトの作成

まずはプロジェクトを作成します。ここではプロジェクトの名前は「sample_books」で、クローラーの名前を「books_spider」としています。今回も前のチュートリアルと同じく「spiders/books_spider.py」だけ使います。

$ scrapy startproject sample_books
$ cd sample_books
$ scrapy genspider books_spider books.toscrape.com/

➜ tree
.
├── sample_books
│   ├── __init__.py
│   ├── items.py
│   ├── middlewares.py
│   ├── pipelines.py
│   ├── settings.py
│   └── spiders
│       ├── __init__.py
│       └── books_spider.py
└── scrapy.cfg

HTML構造の調査とクローラーの設計

スクレイピングする前に、スクレイピングするページのHTML構造を確認します。このようなページであれば、まず「各書籍のURLを取得」→「順に詳細ページをスクレイピング」→「次のページへ移動」→「各書籍のURLを取得」→「詳細ページをスクレイピング」というようなイメージでクローラーを動かせば良いように思います。

Image of Books Crawler

必要な項目のスクレイピング

最初のチュートリアルと同じです。このページのURLを渡して、Scrapy Shellでレスポンスを受け取ります。scrapy shellを起動しているのであれば、fetchでレスポンスを受け取ることができます。

まずは各書籍のページへ移動するためのURLを取得します。このページは第5章ですべての値を取得してるので、取りたい値のXpathは、それを参照すればよいですね。

例えば、「//h3/a/@href」と指定すれば、ページ内の書籍のURLが一覧で取得できます。「//h3/a/@href」だと検索に引っかかるのは、1つの書籍ではなくページ内の書籍のURLです。

このURLのリストをfor-loopで回すことで、各書籍のページへリクエストを送ることができます。

では、各書籍のURLを使ってリクエストを送れるようにコードを書いていきます。

ついでに、Nextページに移動するためのURLを取得するコードを書いてきます。Scrapy Shellで調べます。これは、「//a[text()="next"]/@href」で取得できそうです。

これで次のページへのURLがとれるので、正規化してリクエストを送れるようにします。

これまでの部分をまとめると、このようなparse関数ができているはずです。

次は詳細ページです。これも第5章で取得してるのでそれを参考に書きます。ここまで書くと、「spiders/books_spider.py」は、このようになっているはずです。

クローラーの実行

ではbooks_spiderクローラーを実行します。書籍は全部で1000冊です。1ページ20冊で50ページあるので、合計1000冊分取得できれば問題ありません。

出力されたJSONを確認します。特に問題なくスクレイピングできていると思います。

最終更新

役に立ちましたか?