【发布时间】: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