scrapy 图片下载(一):三行代码实现scrapy图片下载
各位看官,欢迎回到scrapy中文网!这一期,我们说点scrapy的神马呢?过年回来,有同学说想学学scrapy下载图片,大伙目的很单纯就是想爬妹子图!那接下来我们就来一发scrapy实战:scrapy 图片下载!scrapy图片下载其实灰常简单,就是编写一个pipeline中间件,然后就可以愉快下载了!我们先爬取这个网址的图片练练手:http://lab.scrapyd.cn/archives/55.html
一、首先我们创建蜘蛛项目,
命令行输入:
创建蜘蛛文件,最终生成的目录结构如下:
import scrapy class ImagespiderItem(scrapy.Item): imgurl = scrapy.Field() pass
二、定义item
既然我们要下载图片,肯定要得到图片的链接,也就是src里面的内容,因此我们需要定义一个item,用来存放图片链接,于是乎:items.py文件定义如下:
定义了一个item:imgurl,这里你随便定义!好了之后我们开始来编写我们的蜘蛛!
三、创建蜘蛛文件
我们进入spiders目录,创建:ImgSpider.py 文件,并编写爬虫:
import scrapy from ImageSpider.items import ImagespiderItem class ImgspiderSpider(scrapy.Spider): name = 'ImgSpider' allowed_domains = ['lab.scrapyd.cn'] start_urls = ['http://lab.scrapyd.cn/archives/55.html'] def parse(self, response): item = ImagespiderItem() # 实例化item imgurls = response.css(".post img::attr(src)").extract() # 注意这里是一个集合也就是多张图片 item['imgurl'] = imgurls yield item pass
若对上面细节不清楚,请查看:scrapy中文文档
四、图片下载中间件pipeline编写:
打开pipeline.py进行中间件编写,这里的话主要继承了scrapy的:ImagesPipeline这个类,我们需要在里面实现:def get_media_requests(self, item, info)这个方法,这个方法主要是把蜘蛛yield过来的图片链接执行下载,灰常的简单,代码如下:
class ImagespiderPipeline(ImagesPipeline): def get_media_requests(self, item, info): # 循环每一张图片地址下载,若传过来的不是集合则无需循环直接yield for image_url in item['imgurl']: yield Request(image_url)
五、设置,启动图片下载
万事俱备,接下来就启动我们的下载中间件,还有一个问题,那图片存在哪里呢?scrapy给我们提供了一个常量:IMAGES_STORE,我们只需要在settings.py里面设置即可,来我们看一下settings里面的设置:
#图片存储位置 IMAGES_STORE = 'D:\ImageSpider' #启动图片下载中间件 ITEM_PIPELINES = { 'ImageSpider.pipelines.ImagespiderPipeline': 300, }
六、启动爬虫
进入ImageSpider目录,命令行输入:
scrapy crawl ImgSpider
你将会发现,图片已经乖乖的躺在:D:\ImageSpider目录里了
总结:
scrapy下载图片和我们平时开发一模一样,唯一多的就是需要你多定义一个item保存图片的地址,这也很合理,木有图片我们怎么下载呀?然后再把地址传给自定义的pipeline下载,pipeline也非常的简单,可以看到就几行代码。
不满足的同学可能就有疑问了,为什么里面的图片名称都是些乱七八糟的字符,如果我要个性化的命名,要肿么办呢?若你有同样需求,不妨继续观看scrapy中文网下一篇文章:《scrapy图片下载(二):scrapy图片重命名放入不同目录》
本文完全转载自 scrapy中文网
- 版权申明:此文如未标注转载均为本站原创,自由转载请表明出处《龙行博客》。
- 本文网址:https://www.liaotaoo.cn/284.html
- 上篇文章:scrapy 图片下载(二):scrapy图片重命名、放入不同文件夹
- 下篇文章:scrapy爬取ygdy8