【问题标题】:python downloading is extremely slowpython下载速度极慢
【发布时间】:2014-01-17 21:24:11
【问题描述】:

有没有办法提高 Python 上的 url 下载速度?

我有一个用 VB6 编写的程序,它无需尝试就可以使用 Python。我已经把东西改过来了,我现在正在尝试,在 Python(linux) 中的东西似乎要慢得多,时间是原来的两倍。甚至该程序的初始版本似乎也比我在 Windows 上使用的时间要长。

我尝试过同时使用urllib(2.7)、urllib.request(3.3) 和requests。目前我正在尝试urllib3,它也没有更快。在 Windows 上通常需要 45 分钟,在 linux 上需要将近 2 个小时才能在同一台计算机上通过相同的 Internet 连接完成相同的任务。该任务只是在互联网上搜索并在搜索找到所需内容时下载文件……只是一系列潜在文件名。

我也想问一下,因为今天下午已经发生了不止一次,我如何检测到 110 错误代码(连接超时)。我在下面使用的不起作用,它仍然杀死了程序。

import urllib3

http = urllib3.PoolManager()

def dl_10(self):
        self.NxtNum10 = int(self.HiStr10)
        while self.NxtNum10 < int(self.HiStr10)+9999:
                url = 'http://www.example.com/videos/encoded/'+str(self.NxtNum10)+'.mp4'
                r = http.request('GET', url)
                if r.status==404:
                        self.NxtNum10 +=1
                        continue
                elif r.status==110:
                        continue
                else:
                        urllib.request.urlretrieve(url,str(self.NxtNum10)+'_1.mp4')
                        statinfo = os.stat(str(self.NxtNum10)+'_1.mp4')
                        if statinfo.st_size<10000:
                                os.remove(str(self.NxtNum10)+'_1.mp4')
                        else:
                                self.End10 = self.NxtNum10
                self.NxtNum10 +=1

        self.counter +=1
        self.NxtNum10 = 'FINISHED'

这是通过线程运行的,我认为这不会有任何区别。就像我说的,最初使用 urllib(2.7) 编写的代码也很慢,而且它没有使用线程,我只是像在 Windows 上一样运行程序 10 次。

有没有更快的方式使用 Python 从互联网上抓取内容?

【问题讨论】:

  • 你说的是总时间还是个人时间?在我看来,您是按顺序下载,而不是并行下载。
  • 我通过 10,000 个文件按顺序排列了 10 个独立的三键。 Windows (VB6) 上的每个程序通常需要 45-50 分钟才能完成一个完整的周期(同时运行所有 10 个)。在 linux/Python 上,我在一小时内只能通过每个线程超过 3000 个文件。因此,为什么我对缺乏速度感到震惊。唯一改变的是 Windows 到 Linux 和 VB6 到 Python。其他一切都是一样的。昨晚我打算在 Windows 上尝试 Python。我厌倦了尝试安装模块并放弃了。 Linux 在使用 Python 方面要优越得多。
  • 是的,从你那里的风格我可以看出你对VB比较熟悉。 ;) 我真的不知道从这里发生了什么,但你可以试试 pycurl(libcurl 的 python 包装器)。
  • 我想查看网站上的视频文件。如果存在,请下载并继续检查下一个可能的文件。使用 Python 2.7/urllib 它会下载任何 404 丢失的文件,我会删除它。在 3.3 中每次都会弹出 404 错误。当我浏览不同的模块时,我开始检查代码并将其踢出,我对模块的能力有了更好的理解。它不会收到错误 110,但连接超时错误。我来看看pycurl。回到2.7。认为我已经完成了任何 Python 3.0+。缺少/不可用的东西太多。
  • 刚试过pycurl,还是一样。我很困惑为什么我无法获得与 Windows 或 VB6 相同的下载速度。

标签: python


【解决方案1】:

我发现比起直接使用urlretrieve,使用下面的方法要快很多:

resp = urllib2.urlopen(url)
respHtml = resp.read()
binfile = open(filename, "wb")
binfile.write(respHtml)
binfile.close()

直接写文件,希望对你有帮助

【讨论】:

  • 此解决方案是否在保存前下载整个文件?我有一长串要下载的网址,但其中一些已超时。我想知道这些特定下载是否只是失败(或下载但不完整)。
猜你喜欢
  • 1970-01-01
  • 2015-02-07
  • 1970-01-01
  • 2018-05-07
  • 2011-08-22
  • 1970-01-01
  • 1970-01-01
  • 2015-07-22
  • 1970-01-01
相关资源
最近更新 更多