六. 项目实战:下载360图片

爬取网址:http://image.so.com/
爬取信息:爬取图片
爬取方式:scrapy框架
存储方式:ImagesPipeline

1.图片加载规律:
http://image.so.com/zj?ch=go&t1=402&sn=0&listtype=new&temp=1
http://image.so.com/zj?ch=go&t1=402&sn=30&listtype=new&temp=1
http://image.so.com/zj?ch=go&t1=402&sn=60&listtype=new&temp=1
http://image.so.com/zj?ch=go&t1=402&sn=90&listtype=new&temp=1

其中,ch为分类,sn为页数,图片加载采用JavaScript脚本完成,通过XHR项可以简单获取,另外网站使用jQuery发送请求,响应结果为json数据,下面使用json库可以解析结果。

调用scrapy shell http://image.so.com/zj?ch=go&t1=402&sn=0&listtype=new&temp=1

image.png

count的值正常为30,若图片加载完毕,count的值将变成0。


image.png

2.settings.py中启用ImagesPipeline

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

3.image.py中实现爬虫主程序

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

class ImageSpider(scrapy.Spider):
    name = 'image'
    # allowed_domains = ['http://image.so.com/']   ##必须注释掉,否则只能下载第一页图片
    url = 'http://image.so.com/zj?ch=go&t1=402&sn={}&listtype=new&temp=1'
    start_urls = [url.format(0)]

    image_index = 0
    MAX_DOWNLOAD_NUM = 1000

    def parse(self, response):
        r = json.loads(response.body)
        infos = r['list']
        yield {'image_urls':[info['qhimg_url'] for info in infos]}  #给image_urls传递链接列表

        self.image_index += r['count']
        if r['count'] > 0 and self.image_index < self.MAX_DOWNLOAD_NUM:
            yield scrapy.Request(self.url.format(self.image_index))  #callback默认传递给parse(self,response)。

图片很快就能下载好。


image.png

你可能感兴趣的:(六. 项目实战:下载360图片)