在settings.py
中有一个ITEM_PIPELINES的选项,把它的注释去掉增加下载图片的代码:
ITEM_PIPELINES = {
'articlespider.pipelines.ArticlespiderPipeline': 300,
'scrapy.pipelines.images.ImagesPipeline': 1, #这个是scrapy自带的图片下载pipelines
}
IMAGES_URLS_FIELD = "front_image_url"
project_dir = os.path.abspath(os.path.dirname(__file__))
IMAGES_STORE = os.path.join(project_dir, 'images')
上面的代码启用了下载图片piplines,并定义了存储地址及想要存储的图片地址。
在settings.py同级目录下建立文件夹images
用来保存图片。当运行爬虫时,图片就会自动下载图片并保存到本地。
如果想要得到存储的图片路径的话,需要自定义pipelines。
在pipelines.py
中,引入from scrapy.pipelines.images import ImagesPipeline
,自定义的pipeline需要对自带的ImagesPipeline进行重载,代码如下:
class ArticleimagePipeline(ImagesPipeline):
def item_completed(self, results, item, info):
pass
在pass
处定义一个断点,并进行调试:
在调试结果里,可以发现
results
结果为一个tuple
,第一个值是否图片获得成功第二个值为一个字典,保存图片路径path
等信息。完成代码如下:
class ArticleimagePipeline(ImagesPipeline):
def item_completed(self, results, item, info):
for ok, value in results:
image_path = value['path']
item["front_image_path"] = image_path
return item
上面代码得到image_path保存到item["front_image_path"]
中并返回,这时会根据pipelines的顺序进行下一个pipelines进行处理。通过断点调试可以得到想要的结果。