使用Twisted服务器部署Scrapy爬虫

0 投票
1 回答
526 浏览
提问于 2025-04-18 05:40

我有超过20个爬虫程序,想通过浏览器网页手动启动它们。为了实现这个目标,我创建了一个简单的twisted服务器,它可以在一个命令行进程中执行以下命令:

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

这些命令是通过twisted中的utils.getProcessOutput(scriptname)来执行的。前面提到的两个命令都在作为参数传入的script里。

当我尝试用twistd -y <server.py>来运行这个twisted服务器时,出现了以下错误:[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 个回答

1

子进程的标准错误流中有一些字节导致了这个问题。getProcessOutput 会把任何标准错误输出都当作错误来处理,因此会让Deferred 失败。

你可以通过给getProcessOutput 传递 errortoo=True 来解决这个问题。这样做会把标准输出和标准错误的内容混合在一起,而不是把标准错误的数据当作错误处理。

你可以在 getProcessOutput 的API文档 中了解这个行为。

撰写回答