pythonでスクレイピング&画像一括ダウンロード
Scrapyでwebスクレイピングするとき、ページ上の画像を一括でダウンロードして、ローカルに全部保存する。
Downloading Item Images — Scrapy 0.21.0 documentation
わけあってこのページからハンター文字を一括ダウンロードすることになった。
ハンター文字
scrapyの使い方はこちら
scrapyには、ImagesPipelineというクラスがあって、ちょこっと設定するだけで画像のダウンロードができる。
まずは、setting.pyに、ITEM_PIPELINESとIMAGES_STOREを追加する。
ITEM_PIPELINESはパイプラインを有効にするもので、IMAGES_STOREは画像の保存先を指定する。
BOT_NAME = 'hunter' SPIDER_MODULES = ['hunter.spiders'] NEWSPIDER_MODULE = 'hunter.spiders' ITEM_PIPELINES = {'scrapy.contrib.pipeline.images.ImagesPipeline': 1} IMAGES_STORE = './imagestore'
次に、item.pyを編集。パイプラインが有効になっているときは、image_urlsとimagesの変数が予約語みたいになる。
from scrapy.item import Item, Field class HunterItem(Item): image_urls = Field() images = Field()
画像の取得だけなら、これでOK。Itemクラスのオブジェクトのitem['image_urls']に画像URLを追加していくだけで、自動的に画像がダウンロードされていく。
spiderディレクトリに、スクレイピングの記述をする。
FooSpider.py
from scrapy.spider import BaseSpider from scrapy.selector import HtmlXPathSelector from scrapy.http.request import Request from hunter.items import HunterItem class FooSpider(BaseSpider): name = "hoge" allowed_domains = ["hoge.org"] start_urls = ["http://www.geocities.jp/little_gate/01-06-01.htm"] def parse(self, response): hxs = HtmlXPathSelector(response) item = HunterItem() image_urls = hxs.select('//img/@src').extract() item['image_urls'] = ['http://www.geocities.jp/little_gate/'+x for x in image_urls] return item
これで設定完了。コマンド実行すると、./imagestore/fullに一括で画像をダウンロードできる。