我如何定制这个扭曲的代码?

2024-04-19 14:27:15 发布

您现在位置:Python中文网/ 问答频道 /正文

我对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() 

Tags: 文件orgcomhttpurlfordefwww
1条回答
网友
1楼 · 发布于 2024-04-19 14:27:15

欢迎来到Python和Twisted!在

粘贴的代码有一些问题。我一次看一个。在

首先,如果您确实想下载数千个url,并且在urls列表中有数千个条目,那么这一行:

waiting = [client.getPage(url) for url in 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调用返回的Deferreds中。添加这些回调和错误后,可以使用defer.gatherResults等待下载结果的所有下载和处理完成。在

第三,您可能需要考虑为此使用一个更高级别的工具-scrapy是一个web爬行框架(基于Twisted),它为此类应用程序提供了许多很酷的有用的帮助程序。在

相关问题 更多 >