「Scrapy 爬虫框架」异常操作(Exceptions) 详解

文章目录

  • 内容介绍
  • 常规异常操作

内容介绍

开发环境为 Python3.6,Scrapy 版本 2.4.x ,爬虫项目全部内容索引目录

看懂Python爬虫框架,所见即所得一切皆有可能

本章带你学习基于 Python3Scrapy 爬虫框架 中数据爬取过程中异常操作处理操作。用于在 Scrapy 爬虫框架 工作过程中遇见特殊情况对整个工程进行的相关操作。

代码内容基于「Scrapy 爬虫框架」源码版本 2.4.0 ,更新内容会进行标记说明对应版本。

常规异常操作

  • 1.关闭spider操作
# 异常错误类型 
exception scrapy.exceptions.CloseSpider(reason='cancelled')

# 异常操作举例
def parse_page(self, response):
    if 'Bandwidth exceeded' in response.body: # 替换成你的业务逻辑
        raise CloseSpider('bandwidth_exceeded')
  • 2.不关闭spider操作
# 异常错误类型 
exception scrapy.exceptions.DontCloseSpider

# 异常操作举例,为防止由于特殊情况停止spider
def parse_page(self, response):
    if 'Bandwidth exceeded' not in response.body: # 替换成你的业务逻辑
        raise DontCloseSpider('bandwidth_exceeded')
可以在spider_idle信号处理程序中引发此异常,以防止蜘蛛网被关闭。
  • 3.停止处理Item操作
# 异常错误类型 
exception scrapy.exceptions.DropItem

# 异常操作举例,pipline阶段必须引发的异常才能停止处理Item
def parse_page(self, response):
    if 'Bandwidth exceeded' not in response.body: # 替换成你的业务逻辑
        raise DropItem('drop_item')
  • 4.忽略请求操作
# 异常错误类型 
exception scrapy.exceptions.IgnoreRequest

# 异常操作举例,调度程序或任何下载程序中间件均可引发此异常,以指示应忽略该请求。
def parse_page(self, response):
    if 'Bandwidth exceeded' not in response.body: # 替换成你的业务逻辑
        raise IgnoreRequest('ignore_request')
  • 5.未配置操作
# 异常错误类型 
exception scrapy.exceptions.NotConfigured

# 异常操作举例,某些组件可能会引发异常,指示它们将保持禁用状态。
# 1. Extensions 
# 2. Item pipelines 
# 3. Downloader middlewares 
# 4. Spider middlewares
def parse_page(self, response):
    if 'Bandwidth exceeded' not in response.body: # 替换成你的业务逻辑
        raise NotConfigured('not_configured')
  • 6.不支持操作
# 异常错误类型 
exception scrapy.exceptions.NotSupported

# 异常操作举例,调度程序或任何下载程序中间件均可引发此异常,以指示应忽略该请求。
def parse_page(self, response):
    if 'Bandwidth exceeded' not in response.body: # 替换成你的业务逻辑
        raise NotSupported('not_upported')
  • 7.停止下载操作
# 异常错误类型 
exception scrapy.exceptions.StopDownload(fail=True)

# 异常操作举例
# fail=True(默认),则调用请求errback
# fail=False,则调用请求callback
def parse_page(self, response):
    if 'Bandwidth exceeded' not in response.body: # 替换成你的业务逻辑
        raise StopDownload('stop_download')

# 如果为fail=False,则调用请求回调
def errback(self, failure):
    failure.value.response

你可能感兴趣的:(Python,爬虫基础和项目管理,python,scrapy,异常,exceptions,源码)