如何在 Scrapy 中使用自定义的 Spider Middlewares 进行爬虫处理和控制?

2023-04-17 00:00:00 爬虫 自定义 控制

Scrapy 是一个灵活而强大的爬虫框架,可以使用自定义的 Spider Middlewares 进行爬虫处理和控制。Spider Middlewares 可以在爬虫请求发送给下载器之前或之后插入自定义的处理逻辑,比如添加 headers 、代理、重试等等操作。

具体使用方法如下:

  1. 创建自定义 Spider Middlewares 类
from scrapy import signals
from scrapy.http import HtmlResponse

class CustomSpiderMiddleware():
    def __init__(self):
        self.logger = logging.getLogger(__name__)

    @classmethod
    def from_crawler(cls, crawler):
        # 初始化中用来创建一个新的实例的方法
        # 可以从 Settings 对象中获取参数并传递给构造函数
        return cls()

    def process_spider_input(self, response, spider):
        # 在Scrapy引擎将响应发送给爬虫之前处理响应
        # 返回None或HtmlResponse的实例
        pass

    def process_spider_output(response, result, spider):
        # 从爬虫生成的结果或异常中处理并对它们进行处理
        # 返回可迭代对象
        pass

    def process_spider_exception(response, exception, spider):
        # 处理 spider 的异常
        pass
  1. 在 Scrapy 的 Settings 中添加中间件
SPIDER_MIDDLEWARES = {
    'myproject.middlewares.CustomSpiderMiddleware': 543,
}

其中 myproject.middlewares.CustomSpiderMiddleware 是自定义 Spider Middlewares 类的路径, 543 是优先级,范围是01000,数字越小时优先级越高。

示例代码:

import logging

from scrapy import signals
from scrapy.http import HtmlResponse


class CustomSpiderMiddleware():

    def __init__(self, settings):
        self.logger = logging.getLogger(__name__)
        self.settings = settings

    @classmethod
    def from_crawler(cls, crawler):
        return cls(settings=crawler.settings)

    def process_spider_input(self, response, spider):
        self.logger.info('CustomSpiderMiddleware--process_spider_input')
        return None

    def process_spider_output(response, result, spider):
        self.logger.info('CustomSpiderMiddleware--process_spider_output')
        return result

    def process_spider_exception(response, exception, spider):
        self.logger.info('CustomSpiderMiddleware--process_spider_exception')
        pass
SPIDER_MIDDLEWARES = {
    'test.middlewares.CustomSpiderMiddleware': 543,
}

这里我们添加了一个简单的示例中间件 CustomSpiderMiddleware ,当请求进入 spider 之前,输出一条 log 日志。

完整代码:

import scrapy
import logging

from scrapy import signals
from scrapy.http import HtmlResponse


class CustomSpiderMiddleware():

    def __init__(self, settings):
        self.logger = logging.getLogger(__name__)
        self.settings = settings

    @classmethod
    def from_crawler(cls, crawler):
        return cls(settings=crawler.settings)

    def process_spider_input(self, response, spider):
        self.logger.info('CustomSpiderMiddleware--process_spider_input')
        return None

    def process_spider_output(self, response, result, spider):
        self.logger.info('CustomSpiderMiddleware--process_spider_output')
        return result

    def process_spider_exception(self, response, exception, spider):
        self.logger.info('CustomSpiderMiddleware--process_spider_exception')
        return None


class MySpider(scrapy.Spider):
    name = 'myspider'
    allowed_domains = ['pidancode.com']
    start_urls = ['http://pidancode.com/']

    custom_settings = {
        'SPIDER_MIDDLEWARES': {
            'test.middlewares.CustomSpiderMiddleware': 543,
        },
    }

    def parse(self, response):
        print(response.body)
        pass


if __name__ == '__main__':
    from scrapy import cmdline

    cmdline.execute("scrapy crawl myspider".split())

当运行这个爬虫时,你可以看到输出了一条日志提示: CustomSpiderMiddleware--process_spider_input 。这就说明自定义中间件生效了。

总结:

在 scrapy 中使用自定义的 Spider Middlewares 进行爬虫处理和控制,只需要创建自定义中间件类,设置一些方法,然后把自定义中间件添加到 Scrapy 的 Settings 中即可。自定义 Spider Middlewares 可以帮助我们快速地进行请求的处理和控制,大大增强了 Scrapy 爬虫的灵活度。

相关文章