下载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