流scrapy日志输出到websocket

Gre*_*orn 4 python twisted websocket scrapy

我正在尝试构建一个通过websocket消息请求时将运行Scrapy Web Spider的API。

我想将日志记录输出转发到websocket客户端,以便您了解-有时运行时间很长的过程中发生的情况。完成后,我还将发送抓取的结果。

由于可以在进程中运行Scrapy,因此我想做到这一点。我在这里找到了一种将外部流程流式传输到websocket的解决方案,但是如果可以在服务器中运行Scrapy,那似乎是不对的。

https://tomforb.es/displaying-a-processes-output-on-a-web-page-with-websockets-and-python

我可以想像有两种方法可以在Twisted中实现此功能:以某种方式使用LogObserver,或定义LogHandler(可能是带有StringIO的StreamHandler),然后使用诸如WebSocketServerProtocol之类的autobahn.websocket类在Twisted中以某种方式处理流。

现在我很困,不知道如何连接两端。

有人可以提供一个简短的示例,说明如何将日志输出从扭曲的日志记录(如果可能的话避免使用文件)流式传输到Websocket客户端?

Gre*_*orn 6

我设法以某种方式自己解决了这个问题,并想让您知道我是如何做到的:

基本思想是拥有一个可以远程调用的流程,并将流日志输出到客户端(通常是浏览器)。

我没有自己构建所有令人讨厌的细节,而是决定使用autobahn.wscrossbar.io,通过Wamp协议提供pubsub和rpc,该协议本质上只是websockets上的JSON-正是我计划构建的东西,只是更高级了!

这是一个非常基本的示例:

from twisted.internet.defer import inlineCallbacks

from autobahn.twisted.wamp import ApplicationSession
from example.spiders.basic_spider import BasicSpider
from scrapy.crawler import CrawlerRunner
from scrapy.utils.log import configure_logging
from scrapy.utils.project import get_project_settings

import logging

class PublishLogToSessionHandler(logging.Handler):
    def __init__(self, session, channel):
        logging.Handler.__init__(self)
        self.session = session
        self.channel = channel

    def emit(self, record):
        self.session.publish(self.channel, record.getMessage())


class AppSession(ApplicationSession):

    configure_logging(install_root_handler=False)

    @inlineCallbacks
    def onJoin(self, details):
        logging.root.addHandler(PublishLogToSessionHandler(self, 'com.example.crawler.log'))

        # REGISTER a procedure for remote calling
        def crawl(domain):
            runner = CrawlerRunner(get_project_settings())
            runner.crawl("basic", domain=domain)
            return "Running..."

        yield self.register(crawl, 'com.example.crawler.crawl')
Run Code Online (Sandbox Code Playgroud)