编码实现
接下来,我们按照以下3步完成该项目:
(1)创建Scrapy项目,并使用scrapy genspider命令创建Spider。
(2)在配置文件中启用ImagesPipeline,并指定图片下载目录。
(3)实现ImagesSpider。
1)首先创建Scrapy项目,取名为so_image,再使用scrapy genspider命令创建Spider。
$scrapy startproject so_image
$cd so_image
$scrapy genspider images image.so.com
2)在配置文件settings.py中启用ImagesPipeline,并指定图片下载目录,代码如下:
ITEM_PIPELINES = {
#'so_image1.pipelines.SoImage1Pipeline': 300,
'scrapy.pipelines.images.ImagesPipeline':1,
}
IMAGES_STORE='download_images'
3)实现ImagesSpider,代码如下:
import scrapy
import json
from PIL import Image
from scrapy import Request
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):
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,发现里面什么也没有,此时查看运行结果,发现这么一段话:
在robots.txt这个文件中规定了本站点允许的爬虫机器爬取的范围,因为无论什么爬虫都被要求遵守robot协议,所以会先请求这个文件查看自己的权限,此时需要查看文件总都限制了什么。打开http://image.so.com/robots.txt网址,如下:
可以看到,robots.txt文件不让我们爬取我们想要的数据,所以我们在settings.py中改变ROBOTSTXT_OBEY为False,让scrapy不要遵守robot协议,之后就能正常爬取了,如下所示:
# Obey robots.txt rules
ROBOTSTXT_OBEY = False
之后删除之前爬取的结果后重新运行爬虫,就可以得到我们想要的结果了。如下为部分截图:
此代码基本适用于360图片中的所有图片的爬取。