scrapy配置文件下载图片
哈喽,大家好呀,我是滑稽君。平时我们利用爬虫下载图片或者文件时,都离不开requests库。本期我们就来聊聊通过配置scrapy文件来下载图片容易跳的坑。
视频讲解:
我们在开始创建一个scrapy项目时,大家会发现除去spiders文件,scrapy还帮我们创建了一些其他的文件。如下图,我们可以看到settings文件我们上期用到过,我们可以用它来配置一些基础设置,如是否遵守robots协议,伪装自己的头部信息等等。那剩下的如pipelins和items文件就没有用吗?当然不是,当我们需要下载文件时,他们就派上了用场。
下载图片之前我们需要做一些准备工作:
1.配置items文件
我们把图片的url交给items文件。
2.配置pipelines文件
这里我们需要做的很简单,把爬取到的图片的url交给requests,它将帮我们完成下载。注意如果传入的不是集合的形式,直接yield即可。但既然都用上爬虫了,我们肯定不只是想要一两张图片那么简单,且通常extract()出来的都是list的格式。这样更方便我们遍历。还是提醒一下,大家不要忘记导入requests库。
3.配置settings文件
除了我们之前讲过的基础配置外,我们还需调整如下参数。作用依次为传入图片url、设置最终储存位置、设置爬取的时间间隔(防止频繁操作被踢出)、开启图片下载中间件。
需要注意的是储存图片的文件夹需要我们提前创建好。否则爬虫默认你的通道是关闭的。28~29行是settings文件里自带的,不过默认是被注释掉了。我们需要去掉注释符,然后添加自己新定义的通道。
4.主代码
import scrapyfrom ImageSpider.items import ImagespiderItemfrom scrapy.pipelines.images import ImagesPipelineclass ImgspiderSpider(scrapy.Spider): name = 'ImgSpider' allowed_domains = ['movie.douban.com'] start_urls = ['https://movie.douban.com/top250'] def parse(self, response): item = ImagespiderItem() # 实例化item #imgurls = response.xpath('//div[@]/p/img/@src').extract() # 注意这里是一个集合也就是多张图片 imgurls = response.xpath('//ol[@]/li//a//img/@src').extract() # 注意这里是一个集合也就是多张图片 item['imgurl'] = imgurls print(imgurls) next = response.xpath('//span[@]/a/@href').extract_first() if next !=None: next_url = "https://movie.douban.com/top250" + next yield scrapy.Request(next_url) yield item pass #scrapy crawl ImgSpider
开头一定要导入我们配置的文件,中间部分是我们对图片url的提取和处理。结尾是向item传递url以及翻页处理。豆瓣top250有10页,我们是贪婪的爬虫,我们全都要。
运行结果:
可以看到250个封面我们全都爬取到了。说明我们的代码没有错误。
你当然可以在主代码中直接写一个requests方法。可scrapy已经给我们提供了打火机,为什么我们还要选择火柴呢?我们需要做的只是学会怎样去使用这个‘打火机’。
通过配置scrapy文件来下载图片的好处也是显而易见的。主代码更加简洁,层次分明。后续也便于维护。缺点是配置文件的过程较为复杂,对新手不太友好。一个参数错误可能就会导致图片下载失败。网上大部分教程都不是很全面,所以滑稽君帮大家把坑都踩了一遍。
❂ END咳咳,视频讲解会把完整的思路串联起来过一遍。还有想要一起探讨的问题私信滑稽君。欢迎‘骚扰’。