9.3 项目实战:下载 360 图片
我们再来完成一个使用ImagesPipeline下载图片的实战项目。360图片是一个知名的图片搜索网站,在浏览器中打开http://image.so.com,页面如图9-5所示。
图9-5
其中,艺术分类下有大量字画图片,我们可以编写爬虫爬取这些图片。
9.3.1 项目需求
下载360图片网站中艺术分类下的所有图片到本地。
9.3.2 页面分析
在图9-5所示的页面中向下滚动鼠标滚轮,便会有更多图片加载出来,图片加载是由JavaScript脚本完成的,在图9-6中可以看到jQuery发送的请求,其响应结果是一个json串。
图9-6
复制图中jQuery发送请求的url,使用scrapy shell进行访问,查看响应结果的内容(json):
$ scrapy shell 'http://image.so.com/zj?ch=art&sn=30&listtype=new&temp=1' ... >>> import json >>> res = json.loads(response.body.decode('utf8')) >>> res {'count': 30, 'end': False, 'lastid': 60, 'list': [{'cover_height': 942, 'cover_imgurl': 'http://www.sinaimg.cn/dy/slidenews/26_img/2011_27/17290_50560_803601.jpg', 'cover_width': 950, 'dsptime': '', 'group_title': '李正天作品欣赏', 'grpseq': 1, 'id': 'e4e6dbc8c5deaf2799d396569904227f', 'imageid': '5332cbd95b1098f0e9325a16ce022a74', 'index': 31, 'label': '', 'qhimg_height': 236, 'qhimg_thumb_url': 'http://p0.so.qhimgs1.com/sdr/238__/t01ab50e7f19a03afa0.jpg', 'qhimg_url': 'http://p0.so.qhimgs1.com/t01ab50e7f19a03afa0.jpg', 'qhimg_width': 238, 'tag': '新浪艺术名家人物库', 'total_count': 70}, {'cover_height': 1798, 'cover_imgurl': 'http://www.sinaimg.cn/dy/slidenews/26_img/2011_15/18496_33310_603704.jpg', 'cover_width': 950, 'dsptime': '', 'group_title': '崔自默作品欣赏', 'grpseq': 1, 'id': 'f08148a113c6c2e6104a77798d285d88', 'imageid': 'c6662a238bb6faf9b22a335db6707fff', 'index': 32, 'label': '', 'qhimg_height': 450, 'qhimg_thumb_url': 'http://p0.so.qhmsg.com/sdr/238__/t01b187fc2ce65e29b5.jpg', 'qhimg_url': 'http://p0.so.qhmsg.com/t01b187fc2ce65e29b5.jpg', 'qhimg_width': 238, 'tag': '新浪艺术名家人物库', 'total_count': 53}, {'cover_height': 950, 'cover_imgurl': 'http://www.sinaimg.cn/dy/slidenews/26_img/2011_32/18496_59078_243228.jpg', 'cover_width': 950, 'dsptime': '', 'group_title': '徐宁作品欣赏', 'grpseq': 1, 'id': 'ed8686ac7f10dfb52d68baca348a08be', 'imageid': '51c2b804fb6d402486737c29c5301a84', 'index': 33, 'label': '', 'qhimg_height': 238, 'qhimg_thumb_url': 'http://p2.so.qhmsg.com/sdr/238__/t017f259639fd6c8287.jpg', 'qhimg_url': 'http://p2.so.qhmsg.com/t017f259639fd6c8287.jpg', 'qhimg_width': 238, 'tag': '新浪艺术名家人物库', 'total_count': 161}, ...省略中间部分... {'cover_height': 377, 'cover_imgurl': 'http://www.sinaimg.cn/dy/slidenews/26_img/2011_03/16418_23122_876413.jpg', 'cover_width': 950, 'dsptime': '', 'group_title': '王国斌作品欣赏', 'grpseq': 1, 'id': '8e173e45250d90d2dc7316777e2be59b', 'imageid': 'c7d7e74dc18685f5c100d235522d5e4b', 'index': 59, 'label': '', 'qhimg_height': 94, 'qhimg_thumb_url': 'http://p2.so.qhimgs1.com/sdr/238__/t014d248b01108afebe.jpg', 'qhimg_url': 'http://p2.so.qhimgs1.com/t014d248b01108afebe.jpg', 'qhimg_width': 238, 'tag': '新浪艺术名家人物库', 'total_count': 13}, {'cover_height': 1215, 'cover_imgurl': 'http://www.sinaimg.cn/dy/slidenews/26_img/2011_09/17732_26034_613620.jpg', 'cover_width': 900, 'dsptime': '', 'group_title': '王习三作品欣赏', 'grpseq': 1, 'id': '989031bb929f667f8eb920cfa21e32fa', 'imageid': 'f57b9882a93265edcd85e59d3fbb8a4c', 'index': 60, 'label': '王习三', 'qhimg_height': 321, 'qhimg_thumb_url': 'http://p4.so.qhmsg.com/sdr/238__/t015381735d7c0aa2a9.jpg', 'qhimg_url': 'http://p4.so.qhmsg.com/t015381735d7c0aa2a9.jpg', 'qhimg_width': 238, 'tag': '新浪艺术名家人物库', 'total_count': 31}]}
如上所示,响应结果(json)中的list字段是一个图片信息列表,count字段是列表中图片信息的数量,每一项图片信息的qhimg_url字段是图片下载地址。
连续滚动鼠标滚轮加载图片,捕获更多jQuery发送的请求:
第1次加载:http://image.so.com/zj?ch=art&sn=30&listtype=new&temp=1
第2次加载:http://image.so.com/zj?ch=art&sn=60&listtype=new&temp=1
第3次加载:http://image.so.com/zj?ch=art&sn=90&listtype=new&temp=1
……
经过观察,可以总结出这些url的规律:
ch参数 分类标签。
sn参数 从第几张图片开始加载,即结果列表中第一张图片在服务器端的序号。
我们可以通过这个API每次获取固定数量的图片信息,从中提取每一张图片的url(下载地址),直到响应结果中的count字段为0(意味着没有更多图片了)。
到此,页面分析工作完成了。
9.3.3 编码实现
接下来,我们按以下3步完成该项目:
(1)创建Scrapy项目,并使用scrapy genspider命令创建Spider。
(2)在配置文件中启用ImagesPipeline,并指定图片下载目录。
(3)实现ImagesSpider。
步骤 01 首先创建Scrapy项目,取名为so_image,再使用scrapy genspider命令创建Spider。
$ scrapy startproject so_image $ cd so_image $ scrapy genspider images image.so.com
步骤 02 在配置文件settings.py中启用ImagesPipeline,并指定图片下载目录,代码如下:
ITEM_PIPELINES = { 'scrapy.pipelines.images.ImagesPipeline': 1, } IMAGES_STORE = 'download_images'
步骤 03 实现IamgesSpider,代码如下:
# -*- 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)
编码完成后,运行爬虫:
$ scrapy crawl images
运行结束后,查看图片下载目录download_images,如图9-7所示,我们成功爬取到了607张艺术图片。
图9-7
到此,图片下载的项目完成了。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论