首页 > 其他分享 >Scrapy(五) - Extension的使用

Scrapy(五) - Extension的使用

时间:2022-12-21 17:24:57浏览次数:36  
标签:name Extension spider signals item Scrapy 使用 data crawler

目录

介绍

Scrapy 提供了一个Extension机制,可以让我们添加和扩展一些自定义的功能。利用Extension 我们可以注册一些
处理方法并监听Scrapy 运行过程中的各个信号,做到某个事件发生的时候执行我们自定义的方法

Scrapy 已经内置了一些Extension:

  • LogStats:用于记录一些基本的爬取信息,比如爬取的页面数量,提取的item数量等
  • CoreStats:用于统计爬取过程中的核心统计信息,如开始爬取时间,爬取结束时间等。

通过如下配置可以开启这两个Extension

# settings.py
EXTENSIONS = {
  'scrapy.extensions.corestats.CoreStats': 500,
  'scrapy.extensions.telnet.TelnetConsole': 501
}

另外我们也可以实现自定义的Extension,实现过程其实非常简单,主要分为:

  • 实现一个Python类,然后实现对应的处理方法,如实现一个spider_opened方法用于处理Spider开始爬取时执行的操作,
    可以接收一个spider参数并对其进行操作
  • 定义from_crawler类方法,其第一个参数是cls 类对象,第二个参数是crawler。利用crawler的signals对象将Scrapy
    的各个信号和已经定义的处理方法关联起来

实战

1.利用 Flask 搭建一个简单的 web 服务器:

from flask import Flask,request,jsonify
from loguru import logger


app = Flask(__name__)


@app.route('/notify', methods=['POST'])
def receive():
    post_data = request.get_json()
    event = post_data.get('event')
    data  = post_data.get('data')
    logger.debug(f'receive event:{event},data:{data}')
    return jsonify(status='success')

if __name__ == '__main__':
    app.run(debug=True,host='127.0.0.1',port=5000)

2.新增extensions.py

# @Time: 2022/12/21 10:40
# @Authot: zzc
# @Project: scrapyitempipelinedemo
# @File:extensions.py.py
from scrapy import signals
import requests


notification_url = 'http://127.0.0.1:5000/notify'


class NotificationExtension(object):

    def spider_opened(self, spider):
        """
        爬取开始时的处理
        :param spider:
        :return:
        """
        requests.post(notification_url, json={
            'event':'spider_opened',
            'data':{'spider_name':spider.name}
        })

    def spider_closed(self, spider):
        """
        爬取结束时的处理
        :param spider: 
        :return: 
        """
        requests.post(notification_url,json={
            'event':'SPIDER_CLOSED',
            'data':{'spider_name':spider.name}
        })

    def item_scraped(self, item, spider):
        """
        爬取到item的处理
        :param item: 
        :param spider: 
        :return: 
        """
        requests.post(notification_url,json={
            'event':'ITEM_SCRAPED',
            'data':{'spider_name':spider.name,'item': dict(item)}
        })
        
        
    @classmethod
    def from_crawler(cls,crawler):
        ext = cls()
        crawler.signals.connect(ext.spider_opened,signal=signals.spider_opened)
        crawler.signals.connect(ext.spider_closed,signal=signals.spider_closed)
        crawler.signals.connect(ext.item_scraped,signal=signals.item_scraped)
        return ext

执行scrapy 后,flask 服务输出:

SPIDER_CLOSED :

标签:name,Extension,spider,signals,item,Scrapy,使用,data,crawler
From: https://www.cnblogs.com/czzz/p/16996684.html

相关文章

  • TS.003.使用tsc指令报错
    01.错误现象  02. 问题原因vscode终端不能使用命令03. 处理方法a. 管理员权限支行vscode;b. 读取运行权限,确认是否是:Restricted; 若......
  • Go语言使用场景 | go语言与其它开源语言比较 | Go WEB框架选型
     一、Go语言使用场景1.关于go语言2007年,受够了C++煎熬的Google首席软件工程师RobPike纠集RobertGriesemer和KenThompson两位牛人,决定创造一种新语言来取代C++,......
  • 使用 Maven 构建 Java 项目
    本指南将引导您使用Maven构建一个简单的Java项目。您将构建的内容您将创建一个提供一天中的时间的应用程序,然后使用Maven构建它。你需要什么约15分钟最喜欢的文本编辑......
  • 使用 JDBC 和 Spring 访问关系数据
    本指南将引导您完成使用Spring访问关系数据的过程。您将构建什么您将构建一个应用程序,该应用程序使用Spring来访问存储在关系数据库中的数据。​​JdbcTemplate​​你需......
  • 使用 LDAP 对用户进行身份验证
    本指南将引导您完成创建应用程序并使用弹簧安全LDAP模块。您将构建什么您将构建一个简单的Web应用程序,该应用程序由SpringSecurity的嵌入式基于Java的LDAP服务器保护。您......
  • 使用 Spring Data Redis 发布和订阅使用 Redis 发送的消息
    本指南将引导您完成使用SpringDataRedis发布和订阅使用Redis发送的消息的过程。您将构建什么您将生成一个应用程序,该应用程序用于发布字符串消息,并使用为POJO订阅......
  • 使用 Doxygen 来生成 Box2d 的 API 文档
      对于Doxygen以前只听别人说过,而现在使用它也是一个偶然,缘分吧。前两天看box2d的官方sdk中,发现他有用户手册却没有说明,只是留下了一个Doxygen的文件。事情告一......
  • 使用 Gradle 构建 Java 项目
    本指南将引导您使用Gradle构建一个简单的Java项目。您将构建的内容您将创建一个简单的应用程序,然后使用Gradle构建它。你需要什么约15分钟最喜欢的文本编辑器或IDEJD......
  • Linux中history配置及使用技巧
    前言在Linux中,我们可以通过history来查看历史命令,用来确认在某个时刻使用了哪个命令。但是,history的默认的,只会输出命令的序号以及命令。这时我们就需要对history进行一些......
  • zotero的安装与使用
    下载地址Zotero|Yourpersonalresearchassistant茉莉花插件l0o0/jasminum:AZoteroadd-ontoretriveCNKImetadata.一个简单的Zotero插件,用于识别中文元数据......