和上一个不同,这个要实现自定义文件名,需要编写自己的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
}
启动爬虫就行了,文件夹和文件名实现了自定义,只是这里没有用到文件夹起名为标题名,下个案例再说。