地图概览
要下载的地图 大清一统天下全图,如下:
地图图片URL分析
通过抓取图片URL可知:该地图一共切分成了52行,30列个小图
下载每一个切图
代码:#encoding: utf-8
import os
import urllib.request
import urllib.parse
import time
'''
下载地图的各部分小图
'''
start = time.time()
print('开始时间:' + str(start))
header_dict = {
'Host': 'lbezone.ust.hk',
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:57.0) Gecko/20100101 Firefox/57.0',
'Accept': '*/*',
'Accept-Language': 'zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2',
'Accept-Encoding': 'gzip, deflate',
'Referer': 'http://lbezone.ust.hk/rse/wp-content/plugins/wp-imagezoom/zoom.php?id=ZvltF',
'Connection': 'keep-alive',
}
#下载后的图片保存到的路径
filePath = 'D:\\大清地图\\'
#http://lbezone.ust.hk/rse/wp-content/plugins/wp-imagezoom/work/http_cln__sls__sls_lbezone.ust.hk_sls_obj_sls_2_sls_o_sls_b626740_sls_b626740.jpg/div0-0-29.jpg
#地图地址前缀
url='http://lbezone.ust.hk/rse/wp-content/plugins/wp-imagezoom/work/http_cln__sls__sls_lbezone.ust.hk_sls_obj_sls_2_sls_o_sls_b626740_sls_b626740.jpg/'
#总行数-1
pages = 51
#总列数-1
fileNum = 29
#当前行数,从0开始
i = 0
while i <= pages:
j = 0
print('第' + str(i) + '页开始下载================================')
while j<= fileNum:
try:
fileName = 'div0-' + str(i) + '-' + str(j) + '.jpg'
print('fileName=' + fileName)
request = urllib.request.Request(url=(url + fileName), headers=header_dict)
response = urllib.request.urlopen(request)
res = response.read()
#print(res)
#print(type(res))
except BaseException:
print('第' + str(i) + '-' + str(j) + '页下载失败\n=======================================')
else:
# 带路径的文件
filename = filePath + str(i) + '\\' + fileName
# 将文件路径分割出来
file_dir = os.path.split(filename)[0]
# 判断文件路径是否存在,如果不存在,则创建,此处是创建多级目录
if not os.path.isdir(file_dir):
os.makedirs(file_dir)
with open(filename, 'wb') as f:
f.write(res)
f.close()
print('第'+ str(i) + '-' + str(j) + '页下载结束\n=======================================')
j += 1
time.sleep(2)
i += 1
end = time.time()
print('结束时间:' + str(end))
print('执行用时:' + str(end - start) + 's')
下载完成:
切图拼接成地图
把所有的切图拼接成一个完整的地图主要用到了PIL库,图片较多拼接过程有点长,最后地图近500M,拼接核心代码:
#每行合并完后接着合并下一行
def mergeRowThenCol(files,width,height,toImage,rowNum):
print('第'+ str(rowNum) + '行files=' + repr(files))
for i in range(0, len(files)):
file = files[i]
pic_fole_head = Image.open(file)
# width, height = pic_fole_head.size
# print('width=' + str(width))
# print('height=' + str(height))
loc = (i * width, rowNum * height)
print(loc)
print('第'+ str(rowNum) +'行,第' + str(i) + "列存放位置" + str(loc))
toImage.paste(pic_fole_head, loc)
return toImage
最终结果
全图:
局部:
到此完成,改天有时间再把代码放到GitHub上。