Scrapy框架下载图片案例

使用官方提供的 Pipline

Scrapy框架为下载的item中包含的图片提供了一个可以重用的图片下载 pipeline 。这些 pipeline有共同的方法和结构。一般会使用到有Files PipelineImages Pipline

使用官方 Pipline 的好处

  1. 避免重新下载最近已经下载的数据
  2. 方便指定下载的路径
  3. 方便的转换图片的格式
  4. 方便生成略缩图
  5. 方便检测图片的宽高,确保满足最小值
  6. 异步下载,效率非常高

Images Pipline 的使用准备

使用 Images Pipline,需要提前下载好 Pillow 图片处理库

当使用Images Pipline 下载图片的时候,按照以下步骤完成

1. 定义 Item 属性

必须要定义两个个默认的 item属性:

  • image_urls:存储下载图片的链,需要传递一个列表。
  • images:文件下载完成后,会把图片的相关信息存储到这个属性里,比如 下载的路径、下载的URL、文件的校验码 …
    class MaybachItem(scrapy.Item):
      image_urls = scrapy.Field()
      images = scrapy.Field()
    

2. 启用 Images Pipline 管道

在 settings.py 里开启

# Configure item pipelines
# See https://docs.scrapy.org/en/latest/topics/item-pipeline.html
ITEM_PIPELINES = {
   # 'Maybach.pipelines.MaybachPipeline': 300,
   # 开启图片下载器
   'scrapy.pipelines.images.ImagesPipeline':1,
}

3. 配置 Images Pipline 下载路径

在 settings.py 里添加上

# Images Pipline 下载路径,可以使用 OS 模块来指定路径
# 没有这个路径,会自动创建
IMAGES_STORE = '路径'

0x00 创建爬虫工程

scrapy startproject ImagesApp (创建Scrapy工程)

cd ImagesApp (进入工程目录)

scrapy genspider WallPaperSpider pic.netbian.com (创建爬虫)

mark

0x01 配置爬虫

关闭机器人协议

# Obey robots.txt rules
ROBOTSTXT_OBEY = False

设置请求头

# Crawl responsibly by identifying yourself (and your website) on the user-agent
USER_AGENT = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/76.0.3809.100 Safari/537.36'

开启 Images Pipline 管道

# Configure item pipelines
# See https://docs.scrapy.org/en/latest/topics/item-pipeline.html
ITEM_PIPELINES = {
   # 'ImagesApp.pipelines.ImagesappPipeline': 300, (注释掉)
   'scrapy.pipelines.images.ImagesPipeline':1,
}

配置图片的下载路径

import os
IMAGES_STORE = os.path.join(os.path.dirname(os.path.dirname(__file__)),'img')

设置 Item 属性

在 items.py 里

class ImagesappItem(scrapy.Item):
    # define the fields for your item here like:
    # name = scrapy.Field()
    image_urls = scrapy.Field()
    images = scrapy.Field()

0x02 编写爬虫程序

通过对网页的分析,我们需要的链接在这些 li 标签下

mark

获取图片链接

但这些 url ,没有协议头

def parse(self, response):
    url = response.xpath('//ul[@class="clearfix"]/li/a/img/@src').getall()
    print(url)

mark

添加协议头

response.urljoin( url ) 方法会自动把 相应的协议头加上

urls_pic = list(map(lambda url: response.urljoin(url),urls))

mark

把图片链接通过 Item 传给 ImagesPipeline 下载

导入 ImagesappItem ,传入 url 列表,启动爬虫

from ImagesApp.items import ImagesappItem

def parse(self, response):
    urls = response.xpath('//ul[@class="clearfix"]/li/a/img/@src').getall()
    urls_pic = list(map(lambda url: response.urljoin(url),urls))
    yield ImagesappItem(image_urls= urls_pic)

# 启动爬虫
scrapy crawl WallPaperSpider

mark

0x03 小结

这个小案例是直接使用的官方的 ImagePipeline 下载,所以没有对图片进行重命名,或者分类等操作,需要实现这些操作,就需要继承 ImagesPipeline类,然后重新里面的相关方法,可以查看改进版。

发表评论 / Comment

用心评论~