赵走x博客
首页
书籍
软件
工具
古诗词
搜索
登录
精通Scrapy爬虫:25、Scrapy模拟登录
精通Scrapy爬虫:24、登录实质
精通Scrapy爬虫:23、项目实战:下载360图片
精通Scrapy爬虫:22、项目实战:爬取matplotlib例子源码文件
精通Scrapy爬虫:21、下载文件和图片:FilesPipeline和ImagesPipeline
精通Scrapy爬虫:20、项目练习
精通Scrapy爬虫:16、使用LinkExtractor提取链接
精通Scrapy爬虫:19、Exporter添加导出数据格式
精通Scrapy爬虫:18、使用Exporter导出数据
精通Scrapy爬虫:17、LinkExtractor描述提取规则
精通Scrapy爬虫:15、将数据存入MongoDB
精通Scrapy爬虫:14、过滤重复数据
精通Scrapy爬虫:13、Item Pipeline
精通Scrapy爬虫:12、Field元数据
精通Scrapy爬虫:11、Item和Field
精通Scrapy爬虫:10、CSS选择器
精通Scrapy爬虫:9、XPath
精通Scrapy爬虫:8、Response内置Selector
精通Scrapy爬虫:7、Selector对象
精通Scrapy爬虫:6、Spider开发流程
精通Scrapy爬虫:5、Request和Response对象
精通Scrapy爬虫:4、Scrapy框架结构及工作原理
精通Scrapy爬虫:3、编写第一个Scrapy爬虫
精通Scrapy爬虫:2、Scrapy简介及安装
精通Scrapy爬虫:1、网络爬虫是什么
精通Scrapy爬虫:23、项目实战:下载360图片
资源编号:75953
精通Scrapy
爬虫
热度:101
我们再来完成一个使用ImagesPipeline下载图片的实战项目。
我们再来完成一个使用ImagesPipeline下载图片的实战项目。360图片是一个知名的图片搜索网站,在浏览器中打开http://image.so.com ,页面如图9-5所示。 ![bs64](https://img.handsomemark.com/2019/10/19/d66d0048-f25e-11e9-960f-acde48001122.png) 图9-5 其中,艺术分类下有大量字画图片,我们可以编写爬虫爬取这些图片。 # 1、项目需求 下载360图片网站中艺术分类下的所有图片到本地。 # 2、页面分析 在图9-5所示的页面中向下滚动鼠标滚轮,便会有更多图片加载出来,图片加载是由JavaScript脚本完成的,在图9-6中可以看到jQuery发送的请求,其响应结果是一个json串。 ![bs64](https://img.handsomemark.com/2019/10/19/f1923550-f25e-11e9-960f-acde48001122.png) 图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(意味着没有更多图片了)。 到此,页面分析工作完成了。 # 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张艺术图片。 ![bs64](https://img.handsomemark.com/2019/10/19/9547fa62-f265-11e9-960f-acde48001122.png) 图9-7 到此,图片下载的项目完成了。 # 4、本章小结 本章我们学习了在Scrapy中下载文件和图片的方法,先简单介绍了Scrapy提供的FilesPipeline和ImagesPipeline,然后通过两个实战项目演示了FilesPipeline和ImagesPipeline的使用。