如何在 Scrapy 中使用自定义的 Spider Middlewares 进行爬虫处理和控制?
Scrapy 是一个灵活而强大的爬虫框架,可以使用自定义的 Spider Middlewares 进行爬虫处理和控制。Spider Middlewares 可以在爬虫请求发送给下载器之前或之后插入自定义的处理逻辑,比如添加 headers 、代理、重试等等操作。
具体使用方法如下:
- 创建自定义 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
- 在 Scrapy 的 Settings 中添加中间件
SPIDER_MIDDLEWARES = { 'myproject.middlewares.CustomSpiderMiddleware': 543, }
其中 myproject.middlewares.CustomSpiderMiddleware
是自定义 Spider Middlewares 类的路径, 543
是优先级,范围是0
到1000
,数字越小时优先级越高。
示例代码:
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 爬虫的灵活度。
相关文章