首先说说我的思路:
1,存图片时我想存在本地
2,存图片时我想保存图片原有的名字,(以后好方便查询)
首先 看看官方 API
import scrapy
from scrapy.pipelines.images import ImagesPipeline
from scrapy.exceptions import DropItem
class MyImagesPipeline(ImagesPipeline):
def get_media_requests(self, item, info):
for image_url in item['image_urls']:
yield scrapy.Request(image_url)
def item_completed(self, results, item, info):
image_paths = [x['path'] for ok, x in results if ok]
if not image_paths:
raise DropItem("Item contains no images")
item['image_paths'] = image_paths
return item
下面是我的改进,我则是想保存图片原有名字
import scrapy
class ImagedownloadPipeline(object):
def process_item(self, item, spider):
return item
class Imagedown(ImagesPipeline):
def file_path(self, request, response=None, info=None):
item = request.meta["item"]
filename = item["img_name"].replace("/","-")+".jpg"#这里我想说明一下 我保存的图片名字 中有'/'个人感觉不协调,就用'-'代替。了注意加上后缀'.jpg' 不然保存不成功哦
return filename
def get_media_requests(self, item, info):
'''
#如果item[urls]里里面是列表,用下面
urls= item['urls']
for url in urls:
yield scrapy.Request(url,meta={"item",item})
'''
# 如果item[urls]里里面是一个图片地址,用这下面的
yield scrapy.Request(item['img_urls'], meta={"item": item})##切记这里的meta 传的时候 是一个字典
在setting.py 中加入
BOT_NAME = 'imagedownload'
IMAGES_STORE = "e:/pics"#(注意这里表示你图片保存的地址)
ITEM_PIPELINES = {'imagedownload.pipelines.Imagedown': 300}
到此scrapy 里面的主要设置已经介绍完毕,希望对你们有所帮助,
网友评论