一、爬取分类图片 并分类保存本地的写法。
1、用scrapy 爬取图片的思想。我们一定要找到图片的下载地址即src,第二我们还要找到图片分类标题作为我们的文件夹的名字。
(1)首先我们在spider文件夹中,找到我们的文件名
sucai = SucaiItem()
sucai['img_url'] = [img_url] # 图片的下载地址,即src,
print(sucai['img_url'][0])
sucai['img_path'] = response.meta['img_path'] # 图片的保存路径名字,即图片的文件夹名字
yield sucai
(2)我们在 pipelines 中重写我们的方法。
from scrapy.http import Request
from scrapy.pipelines.images import ImagesPipeline
class SucaiPipeline(ImagesPipeline): # 这里是继承了我们的父类 ImagesPipeline
def get_media_requests(self, item, info):
# 从item中获取要下载图片的url,根据url构造Request()对象,并返回该对象
image_url = item['image_url'][0] # 从item中获取我们的 图片地址 image_url,并取出来. 因为在我们的文件中这个列表.
yield Request(image_url, meta={'item': item}) # 因为 yield出的 item是一个字典,我们要取出出来 并yield出去
def file_path(self, request, response=None, info=None):
# 用来自定义图片的下载路径
item = request.meta['item'] # 请求并取出item的
img_path = item['img_path'] # 取出item字典中的 文件夹的文字 作为我们的储存路径.
url = item['image_url'][0].split('/')[-1] # 取出截取 图片的名字
path = img_path + '/' + url # 拼接路径
return path # 返回
def item_completed(self, results, item, info):
print(results)
return item
(3)settings 中的配置,有两个地方要改,第一个是 ITEM_PIPELINES,第二是我们配置保存 我们图片的路径和图片的url
# See https://doc.scrapy.org/en/latest/topics/item-pipeline.html
ITEM_PIPELINES = {
'scrapy.pipelines.images.ImagesPipeline': None, # 这是执行父类 ImagesPipeline
'SuCai.pipelines.SucaiPipeline': 300, # 这是执行我们自定义的 Pipeline
}
IMAGES_STORE = 'imgs' # 这是我们总文件夹的的名字,翻译 图像存储器
IMAGE_URL_FIRLD = 'img_url' # 这是我们图片的下载地址
(4)运行一下,我们的的图片就保存好了
二、将图片保存到mongodb中。
将图片保存到mongodb中的写法跟保存数据的写法差不多。
import pymongo
class SaveMongoPipeline(object):
def process_item(self, item, spider):
# 参数1 {'zmmc': item['zmmc']}: 用于查询表中是否已经存在zmmc对应的documents文档。
# 参数3 True: 更新(True)还是插入(False, insert_one())
# 参数2 要保存或者更新的数据
self.db['sucai'].update_one({'image_url': item['image_url']}, {'$set': dict(item)}, True)
def open_spider(self, spider):
self.client = pymongo.MongoClient('localhost')
self.db = self.client['sucai']