忘れないようにメモっとく

機械学習とかプログラミングとか。

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に一括で画像をダウンロードできる。