Python学习Scrapy图片保存二,自定义文件夹、文件名

时间:2024-04-07 10:04:49

和上一个不同,这个要实现自定义文件名,需要编写自己的ImagesPipeline,

items

import scrapy
class RosiItem(scrapy.Item):
    image_urls = scrapy.Field()

spider

import scrapy
from ROSI.items import RosiItem
from urllib import request

class CrawlSpider(scrapy.Spider):
    name = 'ROSI_spider'
    allowed_domains = ['www.meinvtu123.net']
    start_urls = ['https://www.meinvtu123.net/a/56/32064.html']

    def parse(self, response):

        print(response)
        item = RosiItem()
        pic_urls = response.xpath('//div[@class="contenta"]/img/@src').extract()
        print(pic_urls)
        item['image_urls'] = pic_urls
        yield item
		#查找下一页链接
        next_urls = response.xpath('//div[@class="page"]/ul/a[last()]/@href').extract()[0]
        if next_urls:
        	#拼接下一页链接
            next_url = request.urljoin(response.url, next_urls)
            print(next_url)
            #回调parse函数,解析下一页内容
            yield scrapy.Request(next_url,callback=self.parse)

重点在于pipelines

参考ImagesPipeline中file_path函数返回为return 'full/%s.jpg' % (image_guid)
上一个案例保存的图片都在E:\PICTRRE的full文件夹下,这里试想一下,把返回值修改为自定义的文件夹\文件名,是不是就实现了文件夹、文件名的自定义!!

from scrapy.pipelines.images import ImagesPipeline
from ROSI.settings import IMAGES_STORE
import os

#继承自ImagesPipeline,对其重新定义
class ImagesnamePipeline(ImagesPipeline):

	#借助https://pic.meinvtu123.net/tupian/2019/allimg/190321/21133024-1-3B4.jpg,实现自定义文件名
	
    def file_path(self, request, response=None, info=None):

        #导入文件地址
        image_store = IMAGES_STORE
        
        # 提取url中间数字作为图片名。
        name =  request.url.split('-')[-2] + '.jpg'
        
        #自己构建文件地址
        filename = os.path.join(image_store,name)
        
        print(filename)
        return filename

settings,机器人协议、等待延时、请求头就不写了,在其他的里面有很多。

设置主文件夹,启用自己编写的ImagesnamePipeline

#自己选择文件夹
IMAGES_STORE = 'E:\PICTRURE'

ITEM_PIPELINES = {
   'ROSI.pipelines.ImagesnamePipeline':1
}

启动爬虫就行了,文件夹和文件名实现了自定义,只是这里没有用到文件夹起名为标题名,下个案例再说。
Python学习Scrapy图片保存二,自定义文件夹、文件名