Python:urllib2.open()很慢,需要更快的方式来下载文件

时间:2015-07-16 13:02:31

标签: python-2.7 urllib2

我需要在python脚本中从OpenStreepMap-Tileserver下载许多Tiles。每个Tile都有自己的URL。 URL("http://otile4.mqcdn.com/tiles/1.0.0/osm/...")的常量部分和由zoomlevel和x-& amp;描述的动态部分。 y-tile的坐标(".../zoomlevel/x/y.png")。 Here就是一个例子。

目前,我使用urllib2下载Tiles。为了提高效率,我将平铺下载并行化。无论如何,下载10.000平铺(相当于40兆字节)平均需要12分钟。我发现,函数urllib2.urlopen(url)有时需要很多秒(10到20秒)来建立与OSM-Server的连接。还有另一种方法,从HTTP服务器下载文件或加速连接建立吗?

1 个答案:

答案 0 :(得分:0)

您只能通过设置Range标题

来下载部件
req = urllib2.Request(url)
req.headers['Range'] = 'bytes=%s-%s' % (start, end)
file = urllib2.urlopen(req)

下载上半部分并开始另一部分下载其他部分

示例:

import urllib, urllib2
from thread import start_new_thread
def dwl1():
    url = "http://otile2.mqcdn.com/tiles/1.0.0/osm/18/136933/86273.png" #url
    req = urllib2.Request(url) #http request.
    req.headers['Range'] = 'bytes=%s-%s' % (0, 4836)
    img_part1 = urllib2.urlopen(req)

def dwl2():
    url = "http://otile2.mqcdn.com/tiles/1.0.0/osm/18/136933/86273.png" #url
    req = urllib2.Request(url) #http request.
    req.headers['Range'] = 'bytes=%s-%s' % (4836, 10000)
    img_part2 = urllib2.urlopen(req)
start_new_thread(dwl1)
start_new_thread(dwl2)

现在将第1部分和第2部分放在一起...... 我很确定它不会起作用,但你正在寻找像这样的东西