我对python不熟悉,对twisted甚至更新。我试图使用twisted下载几十万个文件,但在尝试添加一个errback时遇到了困难。如果下载失败,我想打印坏的url。我故意拼错了我的一个网址,以便抛出一个错误。但是,我的代码只是挂起,python没有完成(如果我删除errback调用,它就可以很好地完成)。在
另外,如何单独处理每个文件?据我所知,当一切都完成时,叫做“完成”。我想在下载每个文件时将其gzip,以便从内存中删除。在
以下是我所拥有的:
urls = [
'http://www.python.org',
'http://stackfsdfsdfdsoverflow.com', # misspelled on purpose to generate an error
'http://www.twistedmatrix.com',
'http://www.google.com',
'http://launchpad.net',
'http://github.com',
'http://bitbucket.org',
]
def finish(results):
for result in results:
print 'GOT PAGE', len(result), 'bytes'
reactor.stop()
def print_badurls(err):
print err # how do I just print the bad url????????
waiting = [client.getPage(url) for url in urls]
defer.gatherResults(waiting).addCallback(finish).addErrback(print_badurls)
reactor.run()
欢迎来到Python和Twisted!在
粘贴的代码有一些问题。我一次看一个。在
首先,如果您确实想下载数千个url,并且在
urls
列表中有数千个条目,那么这一行:会引起麻烦的。是否尝试同时下载列表中的每一页?默认情况下,通常情况下,您在Twisted中所做的事情会同时发生,所以这个循环会立即开始下载
urls
列表中的每个URL。这很可能行不通。你的DNS服务器将删除一些域查找请求,你的DNS客户端将删除一些域查找响应。TCP连接尝试返回任何地址都会争夺任何仍然可用的网络资源,其中一些会超时。其余的连接都会慢慢地进行,在几十个甚至几百个不同的下载之间共享可用带宽。在相反,您可能希望将并发程度限制在一次10到20次下载。不久前我在我的博客上写过one approach to this。在
第二,}将失败。
gatherResults
返回一个Deferred
,当传递给它的任何一个的Deferred
发生故障时,它就会立即触发。因此,一旦任何一个client.getPage(url)
失败-可能是因为我上面提到的一个问题,或者是因为域已经过期,或者web服务器碰巧关闭,或者仅仅是因为一个不幸的暂时性网络状况,gatherResults
返回的{finish
将被跳过,print_badurls
将被调用,错误描述单个失败的getPage
调用。在要处理来自单个HTTP请求的失败,请将回调和errback添加到从
getPage
调用返回的Deferred
s中。添加这些回调和错误后,可以使用defer.gatherResults
等待下载结果的所有下载和处理完成。在第三,您可能需要考虑为此使用一个更高级别的工具-scrapy是一个web爬行框架(基于Twisted),它为此类应用程序提供了许多很酷的有用的帮助程序。在
相关问题 更多 >
编程相关推荐