scrapy下载图片(《精通scrapy网络爬虫》第九章)

下载360图片

1.需求分析

下载360图片网站中艺术分类下的所有图片到本地

2.页面分析

页面图片加载是由JavaScript脚本完成,如图可以看到jQuery发送的请求,其响应结果是一个json串。
在这里插入图片描述
在这里插入图片描述
复制图中jQuery发送请求的url,使用scrapy shell进行访问,查看响应结果的内容(json):

$scrapy shell "http://image.so.com/zjl?ch=art&sn=30&listtype=new&temp=1"
...
In [1]: import json

In [2]: res=json.loads(response.body.decode('utf8'))

In [3]: res
Out[3]: 
{'end': False,
 'count': 30,
 'lastid': 30,
 'prevsn': '0',
 'list': [{'id': 'b7d59189f13499fb43cbd3194d4526a1',
   'index': 1,
   'grpmd5': 'ea6ee478e929488320be6fcec9cc2164',
   'grpseq': '1',
   'grpcnt': '68',
   'imgkey': 't01d0089d6b91c7bb72.jpg',
   'width': '950',
   'height': '1549',
   'title': '梅墨生作品欣赏',
   'imgurl': 'http://www.sinaimg.cn/dy/slidenews/26_img/2011_47/16418_93478_267477.jpg',
   'purl': 'http://slide.collection.sina.com.cn/slide_26_16418_6364.html?img=93478',
   'site': 'slide.collection.sina.com.cn',
   'imgsize': '0',
   'label': '',
   'sitename': 'roll.collection.sina.com.cn',
   'siteid': '644316091',
   'src': '0',
   'fnum': '0',
   'qhimg_thumb_width': 123,
   'qhimg_thumb_height': 200,
   'qhimg_downurl': 'http://dl.image.so.com/d?imgurl=http%3A%2F%2Fp2.so.qhimgs1.com%2Ft01d0089d6b91c7bb72.jpg&purl=http%3A%2F%2Fimage.so.com%2F%3
Fsrc%3Ddl.image&key=9cbf376e02',
   'qhimg_url': 'http://p2.so.qhimgs1.com/t01d0089d6b91c7bb72.jpg',
   'qhimg_thumb': 'http://p2.so.qhimgs1.com/sdr/200_200_/t01d0089d6b91c7bb72.jpg',
   'qhimg_qr_key': 'c999bf35a7',
   'tag': '0',
   'rdate': '1410856295',
   'ins_time': '2014-09-16 16:31:35',
   'dsptime': '',
   'summary': [],
   'pic_desc': ' 载酒泛中流'},
  {'id': '9a7a51531781ae242eb2a5c8b155afb3',
   'index': 2,
   'grpmd5': '27a56e6f91eaff84c907728e2013d990',
   'grpseq': '1',
   'grpcnt': '19',
   'imgkey': 't01fd3dc0ad3b81ccea.jpg',
   'width': '950',
   'height': '2419',
   'title': '言恭达作品欣赏',
   'imgurl': 'http://www.sinaimg.cn/dy/slidenews/26_img/2010_52/16418_21247_394402.jpg',
   'purl': 'http://slide.collection.sina.com.cn/slide_26_16418_6493.html?img=21247',
   'site': 'slide.collection.sina.com.cn',
   'imgsize': '0',
   'label': '',
   'sitename': 'roll.collection.sina.com.cn',
   'siteid': '644316091',
   'src': '0',
   'fnum': '0',
   'qhimg_thumb_width': 79,
   'qhimg_thumb_height': 200,
   'qhimg_downurl': 'http://dl.image.so.com/d?imgurl=http%3A%2F%2Fp0.so.qhimgs1.com%2Ft01fd3dc0ad3b81ccea.jpg&purl=http%3A%2F%2Fimage.so.com%2F%3
Fsrc%3Ddl.image&key=cf82ee3f27',
   'qhimg_url': 'http://p0.so.qhimgs1.com/t01fd3dc0ad3b81ccea.jpg',
   'qhimg_thumb': 'http://p0.so.qhimgs1.com/sdr/200_200_/t01fd3dc0ad3b81ccea.jpg',
   'qhimg_qr_key': '3f1f66b930',
   'tag': '0',
   'rdate': '1410856294',
   'ins_time': '2014-09-16 16:31:34',
   'dsptime': '',
   'summary': [],
   'pic_desc': ' 大草 《易经》'},
	...省略
 {'id': 'e68bf4d3310e12fc55a469187c36e789',
   'index': 30,
   'grpmd5': '0c27d2bfbd823fd30dbd170ae1e27039',
   'grpseq': '1',
   'grpcnt': '102',
   'imgkey': 't01ad053f24788a62b8.jpg',
   'width': '950',
   'height': '386',
   'title': '洪潮作品欣赏',
   'imgurl': 'http://www.sinaimg.cn/dy/slidenews/26_img/2011_26/18496_50164_110912.jpg',
   'purl': 'http://slide.collection.sina.com.cn/slide_26_18496_9099.html?img=50164',
   'site': 'slide.collection.sina.com.cn',
   'imgsize': '0',
   'label': '',
   'sitename': 'roll.collection.sina.com.cn',
   'siteid': '644316091',
   'src': '0',
   'fnum': '0',
   'qhimg_thumb_width': 200,
   'qhimg_thumb_height': 81,
   'qhimg_downurl': 'http://dl.image.so.com/d?imgurl=http%3A%2F%2Fp3.so.qhmsg.com%2Ft01ad053f24788a62b8.jpg&purl=http%3A%2F%2Fimage.so.com%2F%3Fs
rc%3Ddl.image&key=8dca189984',
   'qhimg_url': 'http://p3.so.qhmsg.com/t01ad053f24788a62b8.jpg',
   'qhimg_thumb': 'http://p3.so.qhmsg.com/sdr/200_200_/t01ad053f24788a62b8.jpg',
   'qhimg_qr_key': '4f4f7803b3',
   'tag': '0',
   'rdate': '1410856273',
   'ins_time': '2014-09-16 16:31:13',
   'dsptime': '',
   'summary': [],
   'pic_desc': ' 新安瑞雪'}]}

响应结果(json)中的list字段是一个图片信息列表,count字段是列表中图片信息的数量,每一项图片信息的qhimg_url字段是图片下载地址。
连续滚动鼠标加载图片,捕获更多jQuery发送的请求:
第一次加载:http://image.so.com/zjl?ch=art&sn=30&listtype=new&temp=1
第二次加载:http://image.so.com/zjl?ch=art&sn=60&listtype=new&temp=1
第三次加载:http://image.so.com/zjl?ch=art&sn=90&listtype=new&temp=1

经过观察,可以总结出这些url规律:

  • ch参数 分类标签
  • sn参数 从第几张图片开始加载,即结果列表中第一张图片在服务器的序号。

我们可以通过这个API每次获取固定数量的图片信息,从中提取每一张图片的url(下载地址),直到响应结果中count字段为0(意味着没有更多的图片了),
到此,页面分析工作完成。

3.编码实现

分3各步骤
(1)创建Scrapy项目,并使用scrapy genspider 命令创建Spider,
(2)在配置文件中启用ImagesPipeline,并指定图片下载目录,
(3)实现ImagesSpider.
(1)首先创建Scrapy项目,取名为so_image,再使用scrapy genspider命令创建Spider.

$scrapy startproject so_image
$cd so_image
$scrapy genspider images.so.com

(2)在配置文件settings.py中启用ImagesPipeline,并指定图片下载目录

ITEM_PIPELINES = {
    'scrapy.pipelines.images.ImagesPipeline':1,
}
IMAGES_STORE = 'download_images'

(3)实现ImagesSpider

# -*- coding: utf-8 -*-
import scrapy
from scrapy import Request
import json


class ImagesSpider(scrapy.Spider):
    BASE_URL = 'http://image.so.com/zj?ch=art&sn=%s&listtype=new&temp=1'
    start_index = 0

    #限制最大下载量,防止磁盘用量过大
    MAX_DOWNLOAD_NUM = 1000

    name = 'images'
    start_urls = [BASE_URL % 0]

    def parse(self, response):
        #使用json模块解析响应结果
        infos = json.loads(response.body.decode('utf-8'))
        #提取所有图片下载url到一个列表,赋给item的'image_urls'字段
        yield {'image_urls':[info['qhimg_url'] for info in infos['list']]}

        #如count字段大于0,并且下载数量不足 MAX_DOWNLOAD_NUM,继续下载下一页图片信息
        self.start_index += infos['count']
        if infos['count'] > 0 and self.start_index < self.MAX_DOWNLOAD_NUM:
            yield  Request(self.BASE_URL % self.start_index)

要记着:将配置文件中ROBOTSTXT_OBEY = True改为False,因为这个网站在robot.txt里面禁止爬虫了,所以要改成不按照该爬取协议,否则会出错。
编码完成,运行爬虫

$scrapy crawl images

在这里插入图片描述

评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值