创建项目的过程我们这里就不讲了,上一篇讲了
-
ImagesPipeline特点:
-
将下载图片转换成通用的JPG和RGB格式
-
避免重复下载
-
缩略图生成
-
图片大小过滤
这里我直接给大家看一下,项目的目录结构
-
在爬取之前我们需要将settings里面的数据修改一下
settings.py
#在设置里面添加 不用打印所有的日志,只打印报错信息
LOG_LEVEL='ERROR'
#将这个的True改成False
ROBOTSTXT_OBEY = False
#将管道传递出去存储数据的注释打开,300是优先级,数字越小,越先执行 后面会遇到
ITEM_PIPELINES = {'imgPro.pipelines.imgsPileLine': 300,
}# 指定图片存储的目录
IMAGES_STORE = './imgs_bobo'
# 过期天数
IMAGES_EXPIRES = 90 #90天内抓取的都不会被重抓
接下来就是我们写脚本的地方了
img.py
import scrapy
from imgPro.items import ImgproItemclass ImgSpider(scrapy.Spider):name = 'img'# allowed_domains = ['www.xxx.com'] 这个得注释掉#这是我们的目标网址start_urls = ['https://sc.chinaz.com/tupian/']def parse(self, response):#这里拿到图片的列表div_list=response.xpath('//div[@id="container"]/div')for div in div_list:#注意:使用伪属性src ='https:'+ div.xpath('./div/a/img/@src2').extract_first()#将item实例化itme =ImgproItem()#给item定义一个src的字典的键,值就是爬到的srcitme['src'] = src#提交给item 管道yield itme
item.py
#这里面就是,你爬的数据传过来几个就写几个src = scrapy.Field()
这里是管道将数据传过来进行数据储存的地方
pipelines.py
# useful for handling different item types with a single interface
#这是自带的
from itemadapter import ItemAdapter将之前的注释掉,我们自定义就好
# class ImgproPipeline:
# def process_item(self, item, spider):
# return item#引入处理图片的方法
from scrapy.pipelines.images import ImagesPipeline
import scrapyclass imgsPileLine(ImagesPipeline):#就是可以根据图片地址进行图片数据的请求#ImagePipeline根据image_urls中指定的url进行爬取,可以通过get_media_requests为每个url直接下载def get_media_requests(self, item, info):yield scrapy.Request(item['src'])
#拿到我们在设置里面的路劲def file_path(self, request, response=None, info=None, *, item=None):#从连接中截取拿到图片的名字imgName = request.url.split('/')[-1]return imgName#图片下载完毕后,处理结果会以二元组的方式返回给item_completed()函数def item_completed(self, results, item, info):return item#返回给下一个即将被执行的管道类