图片下载

今天要学习的是图片下载,Scrapy用ImagesPipeline类提供一种方便的方式来下载和存储图片;

  • (1)首先还是使用dribbble.com这个网站来爬取数据,先在项目中的dribbble.py文件中根据响应来获取图片的src属性,这样我们就可以获取到了图片的路径了,这个我们之前已经学过了;

  • (2)然后在items.py文件中根据自己的需求添加字段,这里我们可以根据需求创建图片地址的字段、标题字段、时间字段等


import scrapy
class XkdDribbbleSpiderItem(scrapy.Item):
    title = scrapy.Field()
    image_url = scrapy.Field()
    date = scrapy.Field()

  • (3)接着我们还需要在settings文件中设置条件和属性,如在ITEM_PIPELINES的列表里面定义一个images的pipline,是用来处理图片的下载过程的。然后根据item中的字段来设置哪一个内容需要被下载。还需要指定图片下载存储的路径,这个路径可以根据自己的需求指定;

from .pipelines import ImagePipeline
import os
# 获取项目根目录
BASE_DIR = os.path.dirname(os.path.abspath(__file__))
ITEM_PIPELINES = {
   # 'XKD_Dribbble_Spider.pipelines.XkdDribbbleSpiderPipeline': 300,
   # 当items.py模块yield之后,默认就是下载image_url的页面
   'scrapy.pipelines.images.ImagePipeline': 1,
}
# 获取item中,image_url的地址,并且下载
IMAGES_URLS_FIELD = 'image_url'
# 指定图片下载存储的路径
IMAGES_STORE = os.path.join(BASE_DIR, 'images')

  • (4)然后在dribbble.py文件中实例化items.py文件中的类,再把获取到的图片路径赋给类中的字段,这里的字段名要与items.py文件中的字段名一致,记得yield这个实例化对象;

import scrapy
from urllib import parse
from scrapy.http import Request
from ..items import XkdDribbbleSpiderItem
from datetime import datetime
class DribbbleSpider(scrapy.Spider):
    name = 'dribbble'
    allowed_domains = ['dribbble.com']
    start_urls = ['https://dribbble.com/stories']
    def parse(self, response):
        # 获取a标签的url值
        # urls = response.css('h2 a::attr(href)').extract()
        a_nodes = response.css('header div.teaser a')
        for a_node in a_nodes:
            # print(a_node)
            a_url = a_node.css('::attr(href)').extract()[0]
            a_image_url = a_node.css('img::attr(src)').extract()[0]
            yield Request(url=parse.urljoin(response.url, a_url), callback=self.parse_analyse, meta={'a_image_url': a_image_url})
    def parse_analyse(self, response):
        a_image_url = response.meta.get('a_image_url')
        title = response.css('.post header h1::text').extract()[0]
        date = response.css('span.date::text').extract_first()
        date = date.strip()
        date = datetime.strptime(date, '%b %d, %Y').date()
        # 构建模型
        dri_item = XkdDribbbleSpiderItem()
        dri_item['a_image_url'] = a_image_url
        dri_item['title'] = title
        dri_item['date'] = date
        yield dri_item

  • (5)编辑pipelines.py文件,自定义ImagePipeline类继承ImagesPipeline,导入需要用到的库。要修改图片的保存路径需要重写ImagesPipeline类中的file_path方法;

# 导入自定义ImagePipeline需要的库
from scrapy.http import Request
from scrapy.utils.python import to_bytes
import hashlib
from scrapy.pipelines.images import ImagesPipeline
from datetime import datetime
class XkdDribbbleSpiderPipeline(object):
    def process_item(self, item, spider):
        return item
class ImagePipeline(ImagesPipeline):
    def file_path(self, request, response=None, info=None):
        ## start of deprecation warning block (can be removed in the future)
        def _warn():
            from scrapy.exceptions import ScrapyDeprecationWarning
            import warnings
            warnings.warn('ImagesPipeline.image_key(url) and file_key(url) methods are deprecated, '
                          'please use file_path(request, response=None, info=None) instead',
                          category=ScrapyDeprecationWarning, stacklevel=1)
        # check if called from image_key or file_key with url as first argument
        if not isinstance(request, Request):
            _warn()
            url = request
        else:
            url = request.url
        # detect if file_key() or image_key() methods have been overridden
        if not hasattr(self.file_key, '_base'):
            _warn()
            return self.file_key(url)
        elif not hasattr(self.image_key, '_base'):
            _warn()
            return self.image_key(url)
        ## end of deprecation warning block
        image_guid = hashlib.sha1(to_bytes(url)).hexdigest()  # change to request.url after deprecation
        # 修改为时间为目录
        return '{}/{}.jpg'.format(datetime.now().year,image_guid)

运行代码我们能看到打印出来的信息,显示的字段信息是根据我们在蜘蛛文件中构建的模型决定的。然后这些图片就会下载到我们指定的文件夹中

Pipeline介绍

  • Item Pipeline又称之为管道,顾名思义就是对数据的过滤处理,主要作用包括:清理HTML数据、验证爬取数据,检查爬取字段、查重并丢弃重复内容、将爬取结果保存到数据库等;

  • 创建一个项目的时候都会自带pipeline,pipeline的几个核心方法有:

  • open_spider(spider) :在开启spider的时候触发的,常用于初始化操作,如常见开启数据库连接或打开文件;

  • close_spider(spider) :在关闭spider的时候触发的,常用于关闭数据库连接;

  • process_item(item, spider) :item表示被爬取的item,spider 表示爬取该item的spider,每个item pipeline组件都需要调用该方法,这个方法必须返回一个 Item (或任何继承类)对象, 或是抛出 DropItem 异常,被丢弃的item将不会被之后的pipeline组件所处理;

  • from_crawler(cls, crawler) :是一个类方法,常用于从settings.py获取配置信息;

参考: https://www.9xkd.com/user/plan-view.html?id=1835482827

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/69908432/viewspace-2648747/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/69908432/viewspace-2648747/

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值