Scrapyを使ったスクレイピング
どうもおはこんばんにちは。マタキチです。
週末に久しぶりに中学の友人に会いました。久しぶりにあった彼はいい匂いがして、深い懐で、しっかりした格好で、気高くて、さりげない気遣いもできて、話も面白くて、2件目のバーなんかもさりげないエスコート・・・気づいたらここは?・・・あれ?久しぶりにそんな・・・的な展開もなく普通に2件はしごして朝までパズルゲームしてました。知ってますか?パネルデポンってゲーム。すごいハマって全クリしてました。そんな今日この頃です。
pythonでスクレイピングを勉強しているので忘備録的に記述していきます。
間違いなどありましたらご指摘いただけたら幸いです。
Scrapyとは
Scrapyはクローリングとスクレイピングを行うフレームワークです。なぜこのフレームワークを使用するのかというと、実はデータを丸ごとダウンロードするロジックを組むのはなかなか手間です。これがもし複数サイトある場合はかなりの部分が記述が同じになります。そこで、フレームワークを導入して無駄な記述を避けようというのがScrapyなのです。基本的な処理はScrapyが面倒見てくれるのでスクレイピングに集中できますね。
Scrapyのインストール
インストールにはサイトからとコマンドからがあります。それぞれ下記になります。サイトの場合は右上の「pip install scrapy」をクリックしてください。
Scrapyサイト
https://scrapy.org/
コンソールからダウンロードする場合は以下のコマンドをどうぞ!
$pip3 install Scrapy
Scrapyの使い方
Scrapyをインストールするとscrapyコマンドが使用できます。まずはscrapy_listというプロジェクトを作成してみましょう。
$ scrapy startproject scrapy_list
ファイルの中身をtreeで見てみるとこんな感じです。
$ tree
.
├── scrapy.cfg --設定ファイル
└── scrapy_list --これ以下がPythonモジュール
├── __init__.py
├── __pycache__
├── items.py --アイテム定義ファイル
├── middlewares.py --ミドルウェアファイル
├── pipelines.py --パイプラインファイル
├── settings.py --設定ファイル
└── spiders
├── __init__.py
└── __pycache__
Spiderクラスを作成する
Spiderとは蜘蛛のことですが、ScrapyではSpiderクラスを継承したサブクラスを作成します。
Spiderのサブクラスはspidersディレクトリーの中に作る決まりです。今回はpractice.pyというサブクラスをscrapy/spiders/practice.pyという階層で作成しましょう。
practice.pyの内容は次のようにします。
import scrapy
class ScrapySpider(scrapy.Spider):
name = 'practice'
start_urls = [ 'https://www.aozora.gr.jp/index_pages/person148.html' ]
def parse(self , response):
title = response.css( 'title' )
print( title.extract())
今回はサイトから一括ダウンロードのプログラムです。このようにnameプロパティにはSpiderの名前を、start_urlリストには取得対象のURLの一覧を指定します。parse()メソッドにはデータを取得したあとに行う本文の解析処理を記述。css()メソッドを使うことで、そこに含まれる複数の要素をリスト型で取り出すことができます。
コマンドラインから実行
このプログラムをコンソールで起動します。
$ scrapy crawl practice --nolog
['<title>作家別作品リスト:夏目 漱石</title>']
なお上記の「--nolog」を記述しないで実行すると、より詳細な動作ログが表示されます。もしタイトルがうまく表示されない場合はこのタグを外して実行してみる。
まとめ
Scrapyを使うとより手軽にスクレイピングができるフレームワークです。インストール後、spidersのディレクトリの下にプロジェクトを作成してコンソールから「scrapy crawl」で実行する。cronと組み合わせたり、もっと作り込んだものを作ってみよう。