爬取网址: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
count的值正常为30,若图片加载完毕,count的值将变成0。
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)。
图片很快就能下载好。