Scrapy—ImagesPipeline

图片数据爬取之ImagesPipeline

  • 基于scrapy爬取字符串类型的数据和爬取图片类型的数据的区别?

    • 字符串:只需要基于xpath进行解析且提交管道进行持久化存储
    • 图片:xpath解析出图片src的属性值。单独的对图片地址发起请求获取图片二进制类型的数据
  • ImagesPipeline:

    • 需要将img的src的属性值进行解析,提交到管道,管道就会对图片的src进行请求发送获取图片的二进制类型的数据,且还会进行持久化存储
  • 需求:爬取站长素材中的高清图片

    网页中的图片使用了懒加载方式,所以解析时需要使用伪属性

  • 使用流程:

    1. 数据解析(图片的地址)

      [items.py]

      import scrapy
      
      
      class ImgsproItem(scrapy.Item):
          # define the fields for your item here like:
          # name = scrapy.Field()
          img_src = scrapy.Field()
      

      [chinaz.py]

      import scrapy
      from imgsPro.items import ImgsproItem
      
      
      class ChinazSpider(scrapy.Spider):
          name = 'chinaz'
          # allowed_domains = ['www.xxx.com']
          start_urls = ['http://sc.chinaz.com/tupian/']
      
          def parse(self, response):
      
              div_list = response.xpath('//*[@id="container"]/div')
              for div in div_list:
                  # 注意:使用伪属性
                  img_src = div.xpath('./div/a/img/@src2').extract_first()
                  # print(img_src)
      
                  item = ImgsproItem()
                  item['img_src'] = img_src
      
                  yield item
      
    2. 将存储图片地址的item提交到指定的管道类
      [pipelines.py]

      from itemadapter import ItemAdapter
      
      
      # class ImgsproPipeline:
      #     def process_item(self, item, spider):
      #         return item
      
      import scrapy
      from scrapy.pipelines.images import ImagesPipeline
      
      
      class ImgsPipeline(ImagesPipeline):
          """
          类说明:自定义的专用于图片下载的管道类
          """
      
          def get_media_requests(self, item, info):
              """
              函数说明:根据图片地址进行图片数据的请求
              :param item:
              :param info:
              :return:
              """
              # 这里因为获取的是二进制数据,所以不需要 callback回调请求
              yield scrapy.Request(item['img_src'])
      
          def file_path(self, request, response=None, info=None, *, item=None):
              """
              函数说明:指定图片存储的路径
              :param request:
              :param response:
              :param info:
              :param item:
              :return:
              """
              imgName = request.url.split('/')[-1]
              return imgName
      
          def item_completed(self, results, item, info):
              return item  # 返回给下一个即将被执行的管道类
      
    3. 在管道文件中定制一个基于ImagesPipeline的管道类

      • get_media_requests()
      • file_path()
      • item_completed()
    4. 在配置文件中

      • 指定图片存储的目录:IMAGES_STORE = ‘./imgs’

        image.png

      • 指定开启的管道:自定义的管道类

        image.png

image.png

Good Luck!

运行报错:

builtins.ModuleNotFoundError: No module named ‘PIL’

安装pillow模块:pip install pillow

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 5
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值