scrapy 信号扩展中间件(signals EXTENSIONS)使用

一. signals EXTENSIONS
# -*- coding: utf-8 -*-
# @Time    : 2021/12/31 10:58
# @Author  : Cocktail_py
# @File    : extensions.py

import time
from scrapy import signals
from datetime import datetime


class SignalsExtension(object):
    @classmethod
    def from_crawler(cls, crawler):
        return cls(crawler)

    def __init__(self, crawler):
        cs = crawler.signals.connect
        cs(self.engine_started, signal=signals.engine_started)
        cs(self.engine_stopped, signal=signals.engine_stopped)
        cs(self.spider_opened, signal=signals.spider_opened)
        cs(self.spider_idle, signal=signals.spider_idle)
        cs(self.spider_closed, signal=signals.spider_closed)
        cs(self.spider_error, signal=signals.spider_error)
        cs(self.request_scheduled, signal=signals.request_scheduled)
        cs(self.response_received, signal=signals.response_received)
        cs(self.response_downloaded, signal=signals.response_downloaded)
        cs(self.item_scraped, signal=signals.item_scraped)
        cs(self.item_dropped, signal=signals.item_dropped)
        cs(self.item_error, signal=signals.item_error)

    def engine_started(self):
        pass

    def engine_stopped(self):
        pass

    def spider_opened(self, spider):
        """爬虫开始运行"""
        spider_name = spider.name
        self.start_time = datetime.now().strftime('%Y-%m-%d %H:%M:%S')
        pass

    def spider_idle(self, spider):
        pass

    def spider_closed(self, spider, reason):
        """爬虫结束运行"""
        # 爬虫结束时间
        start_time = self.start_time
        finish_time = time.time()
        finish_time_str = time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(finish_time))

        start_timestamp = int(time.mktime(time.strptime(start_time, "%Y-%m-%d %H:%M:%S")))
        finish_timestamp = int(time.mktime(time.strptime(finish_time_str, "%Y-%m-%d %H:%M:%S")))

    def spider_error(self, failure, response, spider):
        """"处理spiders异常"""

        exit(1)
        pass

    def request_scheduled(self, request, spider):
        pass

    def response_downloaded(self, response, request, spider):
        pass

    def response_received(self, response, request, spider):
        pass

    def item_scraped(self, item, response, spider):
        pass

    def item_dropped(self, item, spider, exception):
        pass

    def item_error(self, item, response, spider, failure):
        """处理pipelines/process_item异常"""
        exit(0)
        pass

    @classmethod
    def from_settings(cls, settings):
        pass
        # This is never called - but would be called if from_crawler()
        # didn't exist. from_crawler() can access the settings via
        # crawler.settings but also has access to everything that
        # crawler object provides like signals, stats and the ability
        # to schedule new requests with crawler.engine.download()

二.scrapy spider使用信号扩展中间件
# -*- coding: utf-8 -*-
# @Time    : 2021/12/31 10:58
# @Author  : Cocktail_py

import logging
import scrapy

logging.basicConfig(
    format="%(asctime)s - %(levelname)s - %(message)s",
    level=logging.INFO)


class BaiduSpider(scrapy.Spider):
    name = 'baidu.com'

    allowed_domains = []

    custom_settings = {
        'EXTENSIONS': {
            'scrapy.extensions.corestats.CoreStats': None,
            'scrapy.extensions.telnet.TelnetConsole': None,
            # 引入信号扩展中间件
            'scrapy_project_name.extensions.SignalsExtension': 1,
        },
        "DOWNLOADER_MIDDLEWARES": {
 
        },
        "ITEM_PIPELINES": {

        },
        "DOWNLOAD_DELAY": 0,
        "RANDOMIZE_DOWNLOAD_DELAY": True,
        "COOKIES_ENABLED": True,
        'CONCURRENT_REQUESTS': 5,
        'CONCURRENT_REQUESTS_PER_DOMAIN': 1,
    }

参考:
https://blog.youkuaiyun.com/qq_41020281/article/details/82779919
https://scrapy-chs.readthedocs.io/zh_CN/latest/topics/signals.html

### 关于爬虫流程图的设计与解析 #### 什么是爬虫流程图? 爬虫流程图是一种用于描述爬虫工作原理和执行过程的图形化表示方法。通过这种图表,开发者能够清晰地理解爬虫的工作机制及其各模块之间的交互关系。 #### Scrapy框架中的爬虫流程图 Scrapy 是一种功能强大的爬虫框架,其核心设计理念是将复杂的爬虫开发任务分解为多个独立的功能模块[^1]。以下是基于 Scrapy 的典型爬虫流程: 1. **引擎 (Engine)** 引擎负责协调整个系统的运作,控制信号流并调度请求队列。它是整个爬虫的核心部分[^1]。 2. **调度器 (Scheduler)** 调度器接收来自引擎的任务请求,并按照优先级管理这些请求。当某个请求准备好被处理时,它会被重新提交给引擎以供进一步操作。 3. **下载器 (Downloader)** 下载器的主要职责是从互联网上抓取目标网页的内容。它可以配置多种参数来优化性能或规避反爬策略,例如设置超时时间、启用缓存等。 4. **蜘蛛 (Spider)** Spider 定义了如何解析特定网站的数据提取逻辑。通常情况下,开发者需要实现 `parse` 方法或其他回调函数来完成这一目的[^1]。 5. **项目管道 (Item Pipeline)** 数据经过 Spider 提取后进入 Item Pipeline 进行清洗、验证以及最终存储的操作。此阶段还可以扩展其他自定义处理器,比如去重过滤或是上传至数据库[^1]。 6. **中间件 (Middleware)** 中间件提供了灵活的钩子接口允许修改默认行为,包括但不限于调整 HTTP 请求/响应头部字段、拦截异常情况等等。 7. **日志记录(Logging)** 和 **统计(Stats Collection)** 日志系统帮助监控程序运行状态;而统计数据则可用于分析效率瓶颈所在之处。 8. **扩展(Extensions & Signals)** 用户可通过注册事件监听器或者创建新的插件形式增加额外功能性支持,像自动限速(AutoThrottle),分布式协作等功能均依赖于此机制得以实现。 #### Requests 库的基本流程概述 除了专门构建的框架外,利用简单的第三方库也可以快速搭建轻量化的爬虫应用。例如 Python 的 requests 模块就非常适合初学者学习掌握基本概念[^3]: - 初始化 Session 对象以便维持会话期间的一致性; - 构造 GET 或 POST 请求携带必要的参数如 URL, Headers, Cookies 等信息发起调用; - 获取服务器返回的结果并通过属性访问相应资源(text/html/json等形式); - 如果遇到复杂场景可能还需要借助辅助工具解决验证码识别等问题. 以上便是有关爬虫整体架构概览及相关技术要点介绍。希望对你有所帮助! ```python import requests # 创建 session 实例保持连接状态一致性 s = requests.Session() # 设置 headers 参数模拟浏览器环境减少封禁风险 headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64)' } # 发送 get 请求获取页面源码 r = s.get('https://example.com', headers=headers) print(r.status_code) # 输出状态码确认是否成功加载 ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Cocktail_py

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值