使用Twisted Server部署Scrapy Spiders

时间:2014-05-07 13:18:40

标签: python bash scrapy twisted scrapyd

我希望+20 scrapy crawlers从浏览器deploy手动webpage。 为了实现这一点,我创建了一个简单的twisted server,它在shell进程中执行以下命令:

  
scrapyd-deploy default -p $project
curl http://127.0.0.1:6800/schedule.json -d project=$project -d spider=$spider

这些命令使用twistedutils.getProcessOutput(scriptname)中执行。前两个命令位于作为参数给出的script内。

尝试使用twistd -y <server.py>执行扭曲服务器时,会出现以下错误:[Failure instance: Traceback (failure with no frames): : got stderr: 'Packing version 1399464111\n' ]

以下是twisted服务器的代码:

  
#/usr/bin/python
from twisted.internet import utils, reactor
from twisted.web import server, resource
from twisted.application import internet, service

class CrawlerResource(resource.Resource):
    isLeaf = True
    script = "./script2.sh"

    def render_GET(self, request):
        request.write("<pre>\n")
        deferred = utils.getProcessOutput(self.script)
        deferred.addCallback(lambda s: (request.write(s+"success!\n"), request.finish()))
        deferred.addErrback(lambda s: (request.write(str(s)), request.finish()))

        return server.NOT_DONE_YET



# factory: create a protocol for each connection
resource = CrawlerResource()
factory = server.Site(resource)

# application & service: run server in the background as a service
application = service.Application("Crawlers deployer")
service = internet.TCPServer(8000, factory)
service.setServiceParent(application)

导致此错误的原因(它不是非常详细)?

1 个答案:

答案 0 :(得分:1)

子进程的标准错误流上的字节引起了这种情况。 getProcessOutput将任何标准错误输出视为错误,并使Deferred失败。

您可以通过将errortoo=True传递给getProcessOutput来解决此问题。这使得它在结果中将stdout和stderr混合在一起,而不是将stderr上的数据视为错误。

您可以在getProcessOutput API documentation

中了解此行为