Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/csharp-4.0/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 将碎片日志输出流到websocket_Python_Websocket_Scrapy_Twisted - Fatal编程技术网

Python 将碎片日志输出流到websocket

Python 将碎片日志输出流到websocket,python,websocket,scrapy,twisted,Python,Websocket,Scrapy,Twisted,我正在尝试构建一个API,当通过websocket消息请求时,它将运行一个ScrapyWebSpider 我想将日志输出转发到websocket客户端,这样您就可以看到这个过程中发生了什么——有时运行时间相当长。完成后,我还将发送刮取的结果 因为有可能在进程中运行Scrapy,所以我希望能够做到这一点。我在这里找到了一个将外部进程流式传输到websocket的解决方案,但如果可以在服务器内部运行Scrapy,那么这似乎并不正确 我可以想象有两种方法在Twisted中实现这一点:以某种方式使用L

我正在尝试构建一个API,当通过websocket消息请求时,它将运行一个ScrapyWebSpider

我想将日志输出转发到websocket客户端,这样您就可以看到这个过程中发生了什么——有时运行时间相当长。完成后,我还将发送刮取的结果

因为有可能在进程中运行Scrapy,所以我希望能够做到这一点。我在这里找到了一个将外部进程流式传输到websocket的解决方案,但如果可以在服务器内部运行Scrapy,那么这似乎并不正确

我可以想象有两种方法在Twisted中实现这一点:以某种方式使用LogObserver,或者定义LogHandler(可能是StringIO中的StreamHandler),然后以某种方式在Twisted中使用autobahn.websocket类(如WebSocketServerProtocol)处理流

现在我被卡住了,不知道如何连接两端


有人能提供一个简短的示例,说明如何将twisted logging(如果可能,避免使用文件)的日志输出流式传输到websocket客户端吗?

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

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

我没有亲自构建所有令人讨厌的细节,而是决定使用和,通过基本上只是WebSocket上的JSON提供pubsub和rpc——这正是我计划构建的,只是更高级而已

下面是一个非常基本的例子:

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')

谢谢你的回答!