第一步:在爬虫.py中找出要下载图片的链接
#爬虫.py
item=DemoItem()
image_title=response.xpath('//div[@class="basic-line"]/div[1]/div[1]/div[2]/h1/a/@title').extract()
image_urlList=response.xpath('//div[@class="out clearfix"][1]/div[1]/div[1]/div[1]/ul/li/img/@data-src').extract()
image_price=response.xpath('//div[@class="basic-line"]/div[1]/div[1]/div[4]/ul/li[1]/text()').extract()
a=[]
for image_url in image_urlList:
image_url=image_url.replace('@!blth','')
a.append(image_url)
print(a)
#这里链接以数组的形式导入pipeline文件
item['image_urls']=a
#这里标题以字符串的形式导入pipeline文件
item['image_title']=image_title[0]
print(image_title)
#这里价格以字符串的形式导入pipeline文件
item['image_price']=image_price[0]
print(image_price)
#print(image_urlList)
yield item
第二步:重新定义pipeline文件中的ImagesPipeline。
(1)思路是在get_media_requests(self, item, info):导入item内容,把图片链接用scrapy.Request请求用来下载,把item其他内容用meta传出去,用来传到file_path。
#pipeline.py文件
def get_media_requests(self, item, info):
image_url = item['image_urls']
print("这个是pipeline")
print(image_url)
#将链接的数组拆分成每一个链接,然后提交。
#将image_title和image_price用meta传出去
for inurl in item['image_urls']:
yield scrapy.Request(url=inurl,meta={'name':item['image_title'],'price':item['image_price']})
(2)在file_path函数中重新定义filename。,承接meta中的字段,然后利用filename = u'{0}/{1}'.format(文件夹名字, 文件名),重新定义下载路径。
#pipeline文件
def file_path(self, request, response=None, info=None):
name = request.meta['name'] # 接收上面meta传递过来的图片名称
price= request.meta['price']
name = re.sub(r'[?\\*|“<>:/]', '', name)
# 过滤windows字符串,不经过这么一个步骤,你会发现有乱码或无法下载
price = re.sub(r'[?\\*|“<>:/]', '', price)
#price = re.sub(r'[?\\*|“<>:/]', '', price)
name= name+ price
#以文件的网址名字命名文件
filename1= request.url.split("/")[-1]
filename = u'{0}/{1}'.format(name, filename1)
print(filename1)
return filename