关于Scrapy图片批量下载的用法及详细代码详解,scrapy图片重命名、放入不同文件夹。

本文介绍了一个使用Scrapy框架从百度下载图片,通过Xinxuqiu Pipeline重命名,并将图片存入招财猫数据库的案例。同时,利用Redis实现缓存管理和图片名去重。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

话不多说,直接上来。 项目代码如下

一、创建项目

scrapy startproject ImagesRename

# 下面写的创建爬虫的 自己写一个 ,自己写自己的需求, 我这里随便写一下。
cd ImagesRename
scrapy genspider baidu baidu.com

二、编写item

import scrapy

class ImagesrenameItem(scrapy.Item):
    imgurl = scrapy.Field()
    imgname = scrapy.Field()

三、spiders目录下创建蜘蛛文件:编写相应蜘蛛.

# -*- coding: utf-8 -*-
"""
 招财猫需求, 请求图片地址,下载存入 OSS 数据库。
 数据库  及 oss 对应库  为招财猫数据库;

  -- 2021-10-25

"""
import re
import scrapy
from redis import Redis
from xinxuqiu.items import Imag
from xinxuqiu.pipelines import XinxuqiuPipeline

class ZhaocaimaoSpider(scrapy.Spider):
    name = 'demo'
    # 这个位置随便写的,主要是我的需求是查询数据库。 根据个人需求写,有请求首页的写请求首页
    start_urls = ['https://www.baidu.com/']
    # 查询mysql 数据库
    select_db = XinxuqiuPipeline()
    # 缓存
    redis_db = Redis(host='127.0.0.1', port=6379, db=1)
	# 这个位置是重构setting里面的东西,看不懂的可以不管,我这里是spider多,每个单独设计
    custom_settings = {
        'DOWNLOAD_DELAY': 0.1,
        'CONCURRENT_REQUESTS': 32,
        'DOWNLOADER_MIDDLEWARES': {
           'xinxuqiu.middlewares.RandomUserAgentMiddlware': 300,
           'xinxuqiu.middlewares.ProxyMiddleware': 200,
        },
        'ITEM_PIPELINES': {
            'xinxuqiu.pipelines.ImagespiderPipeline': 300,
            'xinxuqiu.pipelines.XinxuqiuPipeline': 350,
        }
    }

    def parse(self, response):
    	# 我的需求是查询数据库,用url在下载.,自己的需求根据自己定。
    	# 可以从网页提取图片url
        count, rows = self.select_db.select_db()
        if count:
            for sku_images in rows:
                if ',' in sku_images[0]:
                    data_list = sku_images[0].split(',')
                    # print(data_list)
                    for data in data_list:
                        # print(data)
                        name = re.search('images/(.*)\?', data).group(1) if data else None
                        if name and self.redis_db.sadd('img_name', name):
                            item = Imag()
                            item['name'] = name
                            item['imgurl'] = data
                            yield item

                else:
                    sku_image = sku_images[0].replace('marking_text', 'marking_text_20')
                    name = re.search('images/(.*)\?', sku_image).group(1) if sku_image else None
                    if name and self.redis_db.sadd('img_name', name):
                        item = Imag()
                        item['name'] = name
                        item['imgurl'] = sku_image
                        yield item

四、编写pipeline

import re
from scrapy.pipelines.images import ImagesPipeline
from scrapy import Request


class ImagespiderPipeline(ImagesPipeline):

    def get_media_requests(self, item, info):
        # 每一张图片地址下载,若传过来的是一个集合则需循环然后在yield 
        yield Request(item['imgurl'],meta={'name': item['name']})

    # 重命名,若不重写这函数,图片名为哈希,就是一串乱七八糟的名字
    def file_path(self, request, response=None, info=None):

        # 提取url前面名称作为图片名。  这个位置可以自己设置
        image_guid = request.url.split('/')[-1]
        # 接收上面meta传递过来的图片名称。
        name = request.meta['name']
        # 过滤windows字符串,不经过这么一个步骤,你会发现有乱码或无法下载
        name = re.sub(r'[?\\*|“<>:/]', '', name)
        # 分文件夹存储的关键:{0}对应着name;{1}对应着image_guid
        # 前面是文件名称, 后面的是图片名称,这里是个路径的写法
        # filename = u'{0}/{1}'.format(name, image_guid)  根据自己需求来判断。 
        filename = u'{0}'.format(name)  # 我这里只用了图片名称
        return filename

五、设置

# setting 里面把这个设置进去
ITEM_PIPELINES = {
   'xinxuqiu.pipelines.ImagespiderPipeline': 300,
}

# 设置图片存储目录
# 路径自己随便设置, 这个位置是写在 setting 里面的
IMAGES_STORE = 'E:\demo'

六、运行

scrapy crawl demo
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值