当前位置:   article > 正文

Scrapy ImagesPipeline下载图片_scrapy管道按照条件对图片进行下载

scrapy管道按照条件对图片进行下载

一、  ImagesPipeline是啥

      ImagesPipeline是scrapy自带的类,用来处理图片(爬取时将图片下载到本地)。

二、ImagesPipeline优势:

  1. 将下载图片转换成通用的jpg和rgb格式
  2. 避免重复下载
  3. 缩略图生成
  4. 图片大小过滤
  5. 异步下载

三、ImagesPipeline工作流程

  • 爬取一个item,将图片的urls放入image_urls字段
  • 从spider返回的item,传递到item pipeline
  • 当item传递到imagepipeline,将调用scrapy 调度器和下载器完成image_urls中的url的调度和下载。
  • 图片下载成功结束后,图片下载路径、url和校验和等信息会被填充到images字段中。

四、使用ImagesPipeline下载美女整页的图片

    (1) 网页分析

 

 详情页的信息

(2) 创建项目

    scrapy startproject Uis
    cd Uis
    scrapy genspider -t crawl ai_img xx.com

 (3) 修改setting.py文件

        USER_AGENT = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/113.0.0.0 Safari/537.36"
        ROBOTSTXT_OBEY = False
        DOWNLOAD_DELAY = 1

(4)  编写spider的文件ai_img.py

    首先 查看ImagesPipeline源文件

  1. import scrapy
  2. from scrapy.linkextractors import LinkExtractor
  3. from scrapy.spiders import CrawlSpider, Rule
  4. from ..items import *
  5. class AiImgSpider(CrawlSpider):
  6. name = "ai_img"
  7. allowed_domains = ["netbian.com"]
  8. start_urls = ["http://www.netbian.com/mei/index.htm"] # 起始url
  9. rules = (
  10. Rule(LinkExtractor(allow=r"^http://www.netbian.com/desk/(.*?)$"), #详情页的路径
  11. callback="parse_item", follow=False),)
  12. def parse_item(self, response):
  13. #创建item对象
  14. item =UisItem()
  15. # 图片url ->保存到管道中 是字符串类型
  16. url_=response.xpath('//div[@class="pic"]//p/a/img/@src').get()
  17. #图片名称
  18. title_=response.xpath('//h1/text()').get()
  19. # 注意:必须是列表的形式
  20. item['image_urls']=[url_]
  21. item['title_']=title_
  22. return item

(5) 编写item.py文件

  1. class UisItem(scrapy.Item):
  2. # define the fields for your item here like:
  3. # name = scrapy.Field()
  4. #默认字段image_urls,查看源码
  5. image_urls=scrapy.Field()
  6. title_=scrapy.Field()
  7. pass

(6)编写管道pipelines.py

    首先 查看ImagesPipeline源文件

   1) 默认保存的文件夹

  2)获取Item对象

  1. # Define your item pipelines here
  2. #
  3. # Don't forget to add your pipeline to the ITEM_PIPELINES setting
  4. # See: https://docs.scrapy.org/en/latest/topics/item-pipeline.html
  5. # useful for handling different item types with a single interface
  6. import hashlib
  7. from itemadapter import ItemAdapter
  8. from scrapy import Request
  9. from scrapy.pipelines.images import ImagesPipeline
  10. from scrapy.utils.python import to_bytes
  11. #继承ImagesPipeline
  12. class UisPipeline(ImagesPipeline):
  13. # 重写1:直接修改默认路径
  14. # def file_path(self, request, response=None, info=None, *, item=None):
  15. # image_guid = hashlib.sha1(to_bytes(request.url)).hexdigest()
  16. # # 修改默认文件夹路径
  17. # return f"desk/{image_guid}.jpg"
  18. #重写2:需要修改文件夹和文件名
  19. def file_path(self, request, response=None, info=None, *, item=None):
  20. #获取item对象
  21. item_=request.meta.get('db')
  22. #获取图片名称
  23. image_guid = item_['title_'].replace(' ','').replace(',','')
  24. print(image_guid)
  25. # 修改默认文件夹路径
  26. return f"my/{image_guid}.jpg"
  27. # 重写-item对象的图片名称数据
  28. def get_media_requests(self, item, info):
  29. urls = ItemAdapter(item).get(self.images_urls_field, [])
  30. # 传递item对象
  31. return [Request(u, meta={'db':item}) for u in urls]

 (7)设置settings.py ,开启图片管道

  1. ITEM_PIPELINES = {
  2. #普通管道
  3. # "Uis.pipelines.UisPipeline": 300,
  4. # "scrapy.pipelines.images.ImagesPipeline": 301, #图片的管道开启
  5. "Uis.pipelines.UisPipeline": 302, #自定义图片的管道开启
  6. }
  7. # 保存下载图片的路径
  8. IMAGES_STORE='./'

 (8) 运行: scrapy crawl ia_img

 (9)成果展示

 

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/花生_TL007/article/detail/437239
推荐阅读
相关标签
  

闽ICP备14008679号