前言
本文中如有错误请指正。内容摘自书《精通Scrapy网络爬虫》
背景
从网页中爬取信息是爬虫最典型的一种应用,除此之外 ,下载文件也是实际应用中很常见的一种需求,例如使用爬虫爬取网站中的图片、视频、WORD文档、PDF文件、压缩包等。
理论
Scrapy 框架内部提供了两个Item Pipeline,专门用于下载文件和图片:
- FilesPipeline
- ImagesPipeline
我们可以将这两个Item Pipeline看作特殊的下载器,用户使用时只需要通过item的一个特殊的字段将要下载的文件或图片的链接传递给他们,它们会自动将文件或图片下载到本地,并将下载结果信息存入item的另一个字段,以便用户在导出文件中查阅。
content | FilesPipeline | ImagesPipeline |
---|---|---|
导入路径 | scrapy.pipelines.files.FilesPipeline | scrapy.pipelines.images.ImagesPileline |
Item字段 | file_urls,files | image_urls,images |
下载目录 | FILES_STORE | IMAGES_STORE |
ImagesPipeline在FilesPipeline的基础上针对图片增加了一些特有的功能:
- 为图片生成缩略图
开启该功能,只需在配置文件settings.py中设置IMAGES_THUMBS,它是一个字典,每一项的值是缩略图的尺寸,代码如下:
IMAGES_THUMBS={
"small":(50,50),
"big":(270,270),
}
开启该功能后,下载一张图片时,本地会出现3张图片。(1张原图,2张缩略图)。
- 过滤掉尺寸过小的图片
开启该功能,需要在配置文件settings.py中设置IMAGES_MIN_WIDTH和IMAGES_MIN_HEIGHT,它们分别指定图片最小的宽和高,代码如下:
IMAGES_MIN_WIDTH = 110
IMAGES_MIN_HEIGHT = 110
开启该功能后,如果下载一张105*200的图片,该 图片会被抛弃掉,因为它的宽度不符合标准。
步骤:
- 在配置文件settings.py中启用FilesPipeline,通常将其置于其他Item Pipeline之前:
ITEM_PIPELINES = {‘scrapy.pipelines.files.FilesPipeline’:1}
或
ITEM_PIPELINES = {‘scrapy.pipelines.images.ImagesPileline’:1} - 在配置文件settings.py中,使用FILES_STORE指定文件下载目录,如:
FILES_STORE = ‘(路径)’
或
IMAGES_STORE = ‘(路径)’ - 在Spider解析一个包含文件下载链接的页面时,将所有需要下载文件的链接收集到一个列表,赋给item的file_urls字段。FilesPipeline在处理每一项item时,会读取item[‘file_urls’],对其中每一个url进行下载,代码如下:
class DownloadSpider(scrapy.Spider):
...
def parse(response):
item = {}
#下载列表
item['file_urls'] = []
#将链接赶往下载列表
item['file_urls'].append(download_url)
yield item
当FilesPipeline下载完item[‘file_urls’]中的所有文件后,会将文件的下载结果信息收集到另一个列表,赋给item的files字段。下载结果信息包括:
- Path 文件下载到本地的路径
- Checksum 文件的校验和
- url 文件的url地址
后语
本篇为理论部分,后续会用两个实例介绍下载文件和下载图片的具体方法。