Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/289.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/http/4.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 用于并行下载多个文件的库或工具_Python_Http_Parallel Processing_Download_Feed - Fatal编程技术网

Python 用于并行下载多个文件的库或工具

Python 用于并行下载多个文件的库或工具,python,http,parallel-processing,download,feed,Python,Http,Parallel Processing,Download,Feed,我正在寻找一个python库或一个用于并行下载多个文件的命令行工具。我目前的解决方案是按顺序下载文件,这很慢。我知道你可以很容易地用python编写一个半途而废的线程解决方案,但我在使用线程时总是遇到令人讨厌的问题。它用于轮询来自网站的大量xml提要 我对解决方案的要求是: 应该是可中断的。Ctrl+C应立即终止所有下载 即使主程序崩溃或引发异常,也不应该存在必须使用kill手动终止的剩余进程 它也应该在Linux和Windows上工作 它应该重试下载,对网络错误具有弹性,并且应该正确超时 不要

我正在寻找一个python库或一个用于并行下载多个文件的命令行工具。我目前的解决方案是按顺序下载文件,这很慢。我知道你可以很容易地用python编写一个半途而废的线程解决方案,但我在使用线程时总是遇到令人讨厌的问题。它用于轮询来自网站的大量xml提要

我对解决方案的要求是:

  • 应该是可中断的。Ctrl+C应立即终止所有下载
  • 即使主程序崩溃或引发异常,也不应该存在必须使用kill手动终止的剩余进程
  • 它也应该在Linux和Windows上工作
  • 它应该重试下载,对网络错误具有弹性,并且应该正确超时
  • 不要同时下载100多个内容,而是以一种合理的方式对同一台服务器进行排队,这应该是明智的
  • 它应该处理重要的http状态代码,如301、302和304。这意味着,对于每个文件,它应该将上次修改的值作为输入,并且只有在自上次更改后才下载
  • 最好它应该有一个进度条,或者应该很容易为它编写一个进度条来监控所有文件的下载进度
  • 它最好利用http保持活动以最大化传输速度
  • 请不要建议我如何实施上述要求。我正在寻找一个现成的、经过战斗考验的解决方案

    我想我也应该描述一下我想要它的原因。。。我有大约300个不同的数据源,作为来自50个数据提供者的xml格式文件。每个文件的大小在100kb到5mb之间。我需要经常对他们进行投票(每隔几分钟一次),以确定他们中是否有需要处理的新数据。因此,重要的是下载程序使用http缓存来最小化要获取的数据量。它显然也使用了gzip压缩


    那么,最大的问题就是如何以尽可能有效的方式使用带宽而不超越任何界限。例如,一个数据提供者可能会认为它滥用,如果你打开20个同时连接到他们的数据提要。相反,最好使用一个或两个可重复用于多个文件的连接。或者你自己的联系可能会受到奇怪方式的限制。。我的isp限制了您可以进行的dns查找的数量,因此某种类型的dns缓存会很好。

    有很多选择,但很难找到一个适合您所有需要的

    在您的情况下,请尝试以下方法:

  • 创建一个队列
  • 将要下载的URL放入此队列(或“配置对象”,其中包含URL和其他数据,如用户名、目标文件等)
  • 创建一个线程池
  • 每个线程都应该尝试从队列中获取URL(或配置对象)并对其进行处理
  • 使用另一个线程收集结果(即另一个队列)。当结果对象数==第一个队列中的放置数时,您就完成了

    确保所有通信都通过队列或“配置对象”进行。避免访问线程之间共享的数据结构。这将为您节省99%的问题。

    除非您是一个差劲的程序员,否则线程不是“半途而废”的。解决这个问题的最佳通用方法是生产者/消费者模型。您有一个专用的URL生成器和N个专用的下载线程(如果使用多处理模型,甚至还有进程)


    至于您的所有需求,所有这些都可以使用普通的python线程模型来完成(是的,甚至可以使用Ctrl+C——我已经完成了)。

    我认为不存在这样一个完整的库,因此您可能需要编写自己的库。我建议为这项任务看一看。它们甚至提供了一个示例脚本。然后,您可以将其用于大多数其他需求,例如,和。

    urlgrabber是否符合您的需求

    如果没有,你可以考虑志愿帮助完成它。联系作者Michael Stenner和Ryan Tomayko

    更新:谷歌搜索“并行wget”可以得到以下结果:


    您似乎有许多选项可供选择。

    我建议您选择Twisted,尽管它不是现成的解决方案,但它提供了主要的构建块,可以轻松获得您列出的每个功能,并且它不使用线程

    如果您感兴趣,请查看以下链接:

    根据您的要求:

  • 支持开箱即用
  • 支持开箱即用
  • 支持开箱即用
  • 支持开箱即用的超时,其他错误处理通过延迟完成
  • 易于使用
  • 支持开箱即用
  • 不受支持,解决方案存在(而且实施起来并不那么困难)
  • 不支持,可以实现(但相对比较困难)

  • 您可以尝试pycurl,虽然界面一开始并不容易,但只要看一下示例,就不难理解了。我用它在贫瘠的linux机器上并行获取了1000个网页

  • 您不必处理线程,因此它会优雅地终止,并且不会留下任何进程
  • 它提供超时和http状态处理选项
  • 它可以在linux和windows上工作
  • 唯一的问题是它提供了一个基本的基础设施(基本上只是优秀的curl库之上的一个python层)。你需要写几行来实现你想要的功能

    尝试通过简单的python模块使用。 它提供了您列表中的所有需求,除了7之外,都是开箱即用的,而且7很容易编写。
    aria2c有一个很好的xml rpc或json rpc接口,可以从脚本与之交互。

    我使用了标准的libs,
    urllib.urlretrieve