Scrapyでサイトをクロールし、ElasticSearchでサイトの概要を把握する (2)

Vol1の続き。


今回はScrapyでクロールし、その結果をElasticSearchにインデックスするところまで。

Scrapyのプロジェクトを作成

$ scrapy startproject scrapy_tutorial

ElasticSearchとの連携設定

$ cat scrapy_tutorial/settings.py
ITEM_PIPELINES = {
    'scrapyelasticsearch.scrapyelasticsearch.ElasticSearchPipeline': 500
}

ELASTICSEARCH_SERVERS = ['localhost']
ELASTICSEARCH_INDEX = 'scrapy'
ELASTICSEARCH_INDEX_DATE_FORMAT = '%Y'
ELASTICSEARCH_TYPE = 'items'
ELASTICSEARCH_UNIQ_KEY = 'url'  # Custom uniqe key


実はそんなに接続設定は多くなかったりする。
気にしないといけないのは、インデックスのフォーマットぐらい。
今回は、年ごとにインデックスを作っていく前提でインデックス名を設定した
(例えば、scrapy-2017, scrapy-2018.....)

Scrapyのコーディング

今回は、CrawlSpiderを使ってクローラを作成。
Python初めてだし、日本語の情報も少なく、細かい設定しようとするとはまって結構時間かかりました。

#基本的にはLinkExtractorのコールバックでElasticSearchへ送るITEMを作成
#それ以外は割愛・・
def parse_items(self, response):
....
       return item


#items.py には下記属性を定義
#pathには、urlのディレクトリパスを第二階層まで格納→各階層ごとのページボリュームを計算したかったため
    url = scrapy.Field()
    host = scrapy.Field()
    path = scrapy.Field()
    referer = scrapy.Field()
    title = scrapy.Field()
    description = scrapy.Field()
    word_count = scrapy.Field()
    status = scrapy.Field()

scrapyを実行して、elasticsearchにインデックスされるか確認

$ scrapy crawl myspider
$ curl -XGET 'localhost:9200/scrapy-2017/_search'
#クロールされたページ情報が表示されれば成功