Scrapy框架学习 - 使用内置的ImagesPipeline下载图片

需求分析

需求:爬取斗鱼主播图片,并下载到本地

思路

  • 使用Fiddler抓包工具,抓取斗鱼手机APP中的接口
  • 使用Scrapy框架的ImagesPipeline实现图片下载

ImagesPipeline实现图片下载的使用方法:

  • 在items中的XxxItem中定义 image_urlsimages字段
  • 在spider中将提取出来的图片链接保存到Item的 image_urls 字段中(注意:该字段接收一个可迭代对象,否则报错)
  • 在settings文件中进行配置,具体配置见 settings.py 文件

报错 : ValueError: Missing scheme in request url: h

Traceback (most recent call last):
  File "/usr/local/lib/python3.5/dist-packages/twisted/internet/defer.py", line 653, in _runCallbacks
    current.result = callback(current.result, *args, **kw)
  File "/usr/local/lib/python3.5/dist-packages/scrapy/pipelines/media.py", line 79, in process_item
    requests = arg_to_iter(self.get_media_requests(item, info))
  File "/usr/local/lib/python3.5/dist-packages/scrapy/pipelines/images.py", line 155, in get_media_requests
    return [Request(x) for x in item.get(self.images_urls_field, [])]
  File "/usr/local/lib/python3.5/dist-packages/scrapy/pipelines/images.py", line 155, in 
    return [Request(x) for x in item.get(self.images_urls_field, [])]
  File "/usr/local/lib/python3.5/dist-packages/scrapy/http/request/__init__.py", line 25, in __init__
    self._set_url(url)
  File "/usr/local/lib/python3.5/dist-packages/scrapy/http/request/__init__.py", line 62, in _set_url
    raise ValueError('Missing scheme in request url: %s' % self._url)
ValueError: Missing scheme in request url: h

报错原因:Image_urls字段,必须是一个可迭代对象,而不能是字符串

代码实现

items.py

class DouyuMeiziItem(scrapy.Item):
    """斗鱼妹子爬虫Item"""

    image_urls=scrapy.Field()
    images=scrapy.Field()

spider.py

# !/usr/bin/env python
# -*- coding:utf-8 -*-

import json
import scrapy
from myscrapy.items import DouyuMeiziItem


class DouyuMeiziSpider(scrapy.Spider):
    """
    爬取斗鱼直播平台中的主播信息
    练习:
        1. 手机APP抓包(获取json数据API接口)
        2. 用Scrapy进行图片下载的方法
    """

    name = 'douyuzhubo'
    allowed_domains=['douyucdn.cn',]

    offset=0
    base_url='http://capi.douyucdn.cn/api/v1/getVerticalRoom?limit=20&offset='
    start_urls=[base_url+str(offset),]

    def parse(self, response):
        # 获取响应内容,字符串
        content=response.text
        data=json.loads(content)['data']

        for i in data:
            # 图片链接
            image_url=i['vertical_src']

            item=DouyuMeiziItem()
            # 该字段必须是图片链接的可迭代对象,否则报错
            item['image_urls']=[image_url]
            yield item

        if self.offset<230:
            self.offset+=20
            yield scrapy.Request(url=self.base_url+str(self.offset),callback=self.parse)

settings.py

ITEM_PIPELINES = {
    # 引入Scrapy提供的ImagesPipeline组件
    'scrapy.pipelines.images.ImagesPipeline': 300,
}
# ImagesPipeline辅助配置项
# 图片存储路径(绝对路径 or 相对路径)
IMAGES_STORE = 'data/斗鱼主播图片/'
# 该字段的值为XxxItem中定义的存储图片链接的image_urls字段
IMAGES_URLS_FIELD='image_urls'
# 该字段的值为XxxItem中定义的存储图片信息的images字段
IMAGES_RESULT_FIELD='images'
# 生成缩略图(可选)
IMAGES_THUMBS = {
    'small': (50, 50),
    'big': (270, 270),
}
# 过期时间,单位:天(可选)
IMAGES_EXPIRES = 120
# 过滤小图片(可选)
# IMAGES_MIN_HEIGHT = 110
# IMAGES_MIN_WIDTH = 110
# 是否允许重定向(可选)
# MEDIA_ALLOW_REDIRECTS = True

运行结果

运行爬虫,将在配置文件中所配置的图片保存路径下,生成如下目录结构:
Scrapy框架学习 - 使用内置的ImagesPipeline下载图片_第1张图片

full/文件夹下的图片
Scrapy框架学习 - 使用内置的ImagesPipeline下载图片_第2张图片

thumbs/big/文件夹下的图片
Scrapy框架学习 - 使用内置的ImagesPipeline下载图片_第3张图片

thumbs/small/文件夹下的图片

你可能感兴趣的:(爬虫)