scrapy中已经为我们封装好了一个专门基于图片请求和持久化存储的管道类ImagesPipeline,如果想要基于scrapy实现图片数据的爬取,则可以直接使用该管道类即可
在配置文件中进行如下配置:
IMAGES_STORE = ‘./imgs’:表示最终图片存储的目录
爬虫文件
import scrapy
from learn_scrapy.items import LearnScrapyItem
class ImgcrawlSpider(scrapy.Spider):
name = ‘imgcrawl‘
# allowed_domains = [‘www.xxx.com‘]
start_urls = [‘http://sc.chinaz.com/tupian/‘]
def parse(self, response):
div_ls = response.xpath(‘//*[@id="container"]/div‘)
for div in div_ls:
#只需要将img的src属性值进行解析,提交到管道,管道就会对图片的src进行请求发送获取图片的二进制数据并进行持久化存储
src = div.xpath(‘./div/a/img/@src2‘).extract_first()
item = LearnScrapyItem()
item[‘src‘] = src
yield item
管道文件
from itemadapter import ItemAdapter
from scrapy.pipelines.images import ImagesPipeline
import scrapy
#ImagesPipeline专门用于文件下载的管道类,下载过程支持异步和多线程
class ImgPipeLine(ImagesPipeline):
#对item中的图片进行请求操作
def get_media_requests(self, item, info):
yield scrapy.Request(item[‘src‘])
#定制图片的名称
def file_path(self, request, response=None, info=None):
url = request.url
file_name = url.split(‘/‘)[-1]
return file_name
def item_completed(self, results, item, info):
return item #该返回值会传递给下一个即将被执行的管道类
原文:https://www.cnblogs.com/bibicode/p/13386877.html