好久没写了,可不能生疏了,这次我们爬取360图片~
就爬个妹子的图吧,网址在此,
http://image.so.com/z?ch=wallpaper&t1=93
F12看网络请求,随着鼠标往下往下滚动,发现加载了很多的图片,以及最重要的,jQuery发送的请求,其响应结果是一个json
可以看到发送请求的额url:
http://image.so.com/zj?ch=wallpaper&t1=93&sn=30&listtype=new&temp=1
返回的结果也可以看到,是一段json,当然复制这个链接浏览器打开也是一样的,观察json可以发现图片的url,也就是下载地址
接着往下滚动,获取更多jQuery发送的请求
http://image.so.com/zj?ch=wallpaper&t1=93&sn=30&listtype=new&temp=1
http://image.so.com/zj?ch=wallpaper&t1=93&sn=60&listtype=new&temp=1
http://image.so.com/zj?ch=wallpaper&t1=93&sn=90&listtype=new&temp=1
http://image.so.com/zj?ch=wallpaper&t1=93&sn=120&listtype=new&temp=1
经过观察,可以总结出这些url的规律:
- ch参数 分类标签
- sn参数 从第几张图片开始加载
分析的差不多了## 开工
1. 创建项目
这个就没啥说的了
scrapy startproject so_image
cd so_image
scrapy genspider images image.so.com
2. 在配置文件中启用ImagesPipeline
在配置文件settings.py中启用ImagesPipeline,并指定图片下载目录
ITEM_PIPELINES = {
# 'so_image.pipelines.SoImagePipeline': 300,
'scrapy.pipelines.images.ImagesPipeline':1,
}
IMAGES_STORE = 'download_images'
3, 实现Spider
# -*- coding: utf-8 -*-
import scrapy
import json
from scrapy import Request
class ImagesSpider(scrapy.Spider):
name = 'images'
allowed_domains = ['image.so.com']
BASE_URL = 'http://image.so.com/zj?ch=wallpaper&t1=93&sn=%s&listtype=new&temp=1'
start_index = 0
# 限制最大数据量,防止磁盘爆炸
MAX_DOWNLOAD_NUM = 1000
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
这里出现了问题,提示了这么一句话:
rawled (200) <GET http://image.so.com/robots.txt> (referer: None)
DEBUG: Forbidden by robots.txt: <GET http://image.so.com/zj?ch=wallpaper&t1=93&sn=0&listtype=new&temp=1>
robots.txt这个文件中规定了本站点允许的爬虫机器爬取的范围(比如你不想让百度爬取你的页面,就可以通过robot来限制),因为默认scrapy遵守robot协议,所以会先请求这个文件查看自己的权限,那我们打开这个robots.txt看看他写了啥
User-agent: *
Disallow: /j?
Disallow: /i?
Disallow: /z?
Disallow: /zv?
Disallow: /zj?
可以看到,robots.txt文件不让我们爬取我们想要的数据,所以我们在setting改变ROBOTSTXT_OBEY为False,让scrapy不要遵守robot协议,之后就能正常爬取了。
# Obey robots.txt rules
ROBOTSTXT_OBEY = False
重新爬取就可以得到我们要的图片了