创建项目的过程我们这里就不讲了,上一篇讲了
-
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 ImgproItem
class 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的字典的键,值就是爬到的src
itme['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 scrapy
class 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#返回给下一个即将被执行的管道类