返回介绍

9.3 项目实战:下载 360 图片

发布于 2024-02-05 21:13:20 字数 5867 浏览 0 评论 0 收藏 0

我们再来完成一个使用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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文