如何使用Scrapy 中间键

发布时间:2021-06-23 14:09:54 作者:Leah
来源:亿速云 阅读:282
# 如何使用Scrapy中间件

## 目录
1. [Scrapy中间件概述](#scrapy中间件概述)
2. [中间件类型与执行流程](#中间件类型与执行流程)
3. [编写自定义中间件](#编写自定义中间件)
   - [3.1 下载中间件示例](#31-下载中间件示例)
   - [3.2 Spider中间件示例](#32-spider中间件示例)
4. [内置中间件解析](#内置中间件解析)
5. [常见应用场景](#常见应用场景)
6. [调试与最佳实践](#调试与最佳实践)
7. [总结](#总结)

---

## Scrapy中间件概述

Scrapy中间件是处理引擎与组件间通信的钩子框架,允许开发者全局修改Scrapy的请求/响应流程。作为Scrapy架构的核心机制,中间件提供了以下能力:

- 预处理请求和后处理响应
- 修改爬虫的输入/输出
- 异常处理
- 扩展核心功能

```python
# Scrapy架构中的中间件位置
Engine → Downloader Middlewares → Downloader
      ↑                         ↓
Scheduler                    Response → Spider Middlewares → Spider

中间件类型与执行流程

1. 下载中间件(Downloader Middleware)

位于引擎和下载器之间,处理: - 请求预处理(修改headers、代理设置) - 响应后处理(自动重试、响应解码) - 异常处理(超时、重试机制)

执行顺序

process_request(request, spider)  # 请求发出前
↓
Downloader处理
↓
process_response(request, response, spider)  # 获取响应后

2. Spider中间件(Spider Middleware)

位于引擎和Spider之间,处理: - 响应处理(检查响应有效性) - 结果处理(修改Item/Request对象) - 异常处理(忽略特定异常)

执行顺序

process_spider_input(response, spider)  # 响应到达Spider前
↓
Spider处理
↓
process_spider_output(response, result, spider)  # Spider输出结果时

编写自定义中间件

3.1 下载中间件示例

随机User-Agent中间件

# middlewares.py
from fake_useragent import UserAgent

class RandomUserAgentMiddleware:
    def process_request(self, request, spider):
        request.headers.setdefault('User-Agent', UserAgent().random)
        
# settings.py
DOWNLOADER_MIDDLEWARES = {
    'myproject.middlewares.RandomUserAgentMiddleware': 400,
}

代理IP中间件

class ProxyMiddleware:
    def process_request(self, request, spider):
        request.meta['proxy'] = "http://proxy.example.com:8080"
        # 添加认证信息
        request.headers['Proxy-Authorization'] = basic_auth_header('user', 'pass')

3.2 Spider中间件示例

结果过滤中间件

class DuplicateFilterMiddleware:
    def __init__(self):
        self.seen_urls = set()

    def process_spider_output(self, response, result, spider):
        for item in result:
            if isinstance(item, dict) and 'url' in item:
                if item['url'] not in self.seen_urls:
                    self.seen_urls.add(item['url'])
                    yield item
            else:
                yield item

异常处理中间件

class RetryMiddleware:
    def process_spider_exception(self, response, exception, spider):
        if isinstance(exception, TimeoutError):
            new_request = request.copy()
            new_request.dont_filter = True  # 避免被去重
            return new_request

内置中间件解析

Scrapy默认启用的关键中间件:

中间件 功能 配置项
HttpErrorMiddleware 过滤错误响应 HTTPERROR_ALLOWED_CODES
RetryMiddleware 自动重试失败请求 RETRY_TIMES, RETRY_HTTP_CODES
RedirectMiddleware 处理重定向 REDIRECT_MAX_TIMES
CookiesMiddleware 管理Cookies COOKIES_DEBUG

配置示例:

# settings.py
RETRY_TIMES = 3
REDIRECT_MAX_TIMES = 5
HTTPERROR_ALLOWED_CODES = [404]

常见应用场景

1. 反爬虫绕过

2. 数据预处理

3. 性能优化

4. 监控与统计

class StatsMiddleware:
    def __init__(self, stats):
        self.stats = stats

    def process_response(self, request, response, spider):
        self.stats.inc_value('response_count')
        if response.status == 404:
            self.stats.inc_value('error/404')
        return response

调试与最佳实践

调试技巧

  1. 使用Scrapy shell测试中间件:
scrapy shell -s USER_AGENT='test' 'http://example.com'
  1. 日志输出:
class DebugMiddleware:
    def process_request(self, request, spider):
        spider.logger.debug(f"Processing request to {request.url}")

最佳实践

  1. 执行顺序管理

    • 通过设置优先级数值(通常300-900之间)
    • 依赖中间件需明确顺序
  2. 资源清理

class DBConnectionMiddleware:
    def spider_opened(self, spider):
        self.conn = create_db_connection()

    def spider_closed(self, spider):
        self.conn.close()
  1. 配置化设计
class ConfigurableMiddleware:
    def __init__(self, retry_times=3):
        self.retry_times = retry_times

    @classmethod
    def from_crawler(cls, crawler):
        return cls(retry_times=crawler.settings.getint('RETRY_TIMES'))

总结

Scrapy中间件系统提供了强大的扩展点,通过合理使用可以:

关键注意事项: 1. 避免在中间件中进行阻塞操作 2. 注意中间件执行顺序的影响 3. 合理处理中间件状态(使用spider参数传递数据)

通过本文介绍的实践方法,开发者可以构建出适应各种复杂场景的高效爬虫系统。完整的中间件开发示例可参考Scrapy官方文档的Middleware示例。 “`

注:本文实际约3100字(含代码示例),完整版建议补充: 1. 更多实战案例(如Selenium集成) 2. 性能对比数据 3. 错误处理的具体代码示例 4. 与Scrapy扩展(Extension)的区别说明

推荐阅读:
  1. 一、Scrapy的简单使用-爬虫
  2. Scrapy 入门

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

scrapy

上一篇:怎么用SpringBoot + FFmpeg实现一个简单的M3U8切片转码系统

下一篇:linux 中ss命令如何使用

相关阅读

您好,登录后才能下订单哦!

密码登录
登录注册
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》