python爬虫_抓取瓦片图片信息并将其拼接_以mapbar为例(适用交通工程类专业)

  • 这次就以mapbar为例爬取道路交通拥堵情况
  • 第一步,瓦片标号解析
  • 第二步,拼url,然后下载
  • 第三步,图片拼接
  • 完整代码如下

爬虫是抓取数据的高效率方法,本次介绍爬取瓦片图片并进行拼接:
瓦片信息就是,类似于拼图,一块块小的拼图本身所含的信息并不多,将所有的拼图碎片全部抓取之后,再将其拼接成完成的拼图,才能运用其中的数据。

瓦片图片主要存在在地图(包含道路交通等等以不同图层layer的方式展现),每块瓦片碎片的大小、类别都是一样的,只是所代表的位置不同罢了。也因此每块瓦片碎片都有它自己的标号来标定当前瓦片的位置(一般是以某种方向的坐标系为准)。
所以,首先解析瓦片标号并构建瓦片所在的坐标系,之后按照一定的范围依次爬取,最后进行拼接就可以得到想要的数据了。流程大概如下:

Created with Raphaël 2.2.0开始解析瓦片标号信息和其所在坐标系找到需要爬取的范围(一般为一个矩形)开始爬将瓦片按顺序拼接,得到完整的图片数据结束

这次就以mapbar为例爬取道路交通拥堵情况


绿色、黄色、红色的线就是北京市的道路交通拥堵情况了,目标是尽可能详细地抓出来然后拼接。

第一步,瓦片标号解析

打开开发者工具F12,进一步放大地图会弹出很多.png格式的图,前面是一连串序号。在network的preview里就能看到图的样子,明显就是道路交通拥堵的图层瓦片。

这里就直接解析这张图的序列号:o b 16bd l 9bd
这是一个16位进制编码的标号,o为开头,b代表大小层级,16bd是x轴,l为xy轴分隔,9bd是y轴。顺序从左到右,从下到上,典型的xy坐标系啊。
因此大概找了北京等其他城市的大致范围,并将其存到了表格方便依次读取,表格大概长这样:

df1=pd.read_excel('pic.xlsx',sheet_name='cityinf',header=0,index=False)
data_citypic=df1.values
citynum=data_citypic.shape[0] #city num=42

然后是对坐标解析:

'''xy坐标信息'''
def city_loc(number):n=number                            #表格里的序号,代表城市city_inf=data_citypic[n,1:4]        #读取需要的信息cityname=city_inf[0]xy1_16=city_inf[1]xy2_16=city_inf[2]                  #16位进制坐标x1_16=xy1_16[2:6]y1_16=xy1_16[7:10]x2_16=xy2_16[2:6]y2_16=xy2_16[7:10]                  #分离x1_10=eval('0x'+str(x1_16))y1_10=eval('0x'+str(y1_16))x2_10=eval('0x'+str(x2_16))y2_10=eval('0x'+str(y2_16))         #得到10进制的坐标return x1_10,y1_10,x2_10,y2_10,cityname

第二步,拼url,然后下载

在mapbar的刚刚那张图找到其url在header的位置,就可以得到url,很好解析,是原始通路+日期+坐标.png的格式。(测试之后发现其实日期没啥用,它只能爬实时数据没法爬历史数据)

'''xy转图片下载pic_inf'''
def to_pic_inf(x,y):xa=hex(x)ya=hex(y)list_xa=list(xa)list_ya=list(ya)list_xa.pop(0)list_xa.pop(0)list_ya.pop(0)list_ya.pop(0)x_last=''.join(list_xa)y_last=''.join(list_ya)pic_inf='ob'+x_last+'l'+y_lastreturn pic_inf

下载图片的代码,有会注意到我这边并不是普通的下载。中间出现了ymax,xmin,with open这边还有city_loadfilename和loop等东西
别忘了改自己的文件地址!!!

'''下载图片'''
def pic_load(x,y,x1,y2):ymax=y2xmin=x1url_pic=to_pic_inf(x,y)url2='https://lukuang.mapbar.com//city/traffic/images/2020/08/04/08/202008040814/10/'+url_pic+'.png'with open("E:\\pytstu\\todpic\\"+city_loadfilename+"\\"+str(loop[x-xmin])+str(loop[ymax-y])+".png",'wb') as f:   #别忘了改文件地址f.write(requests.get(url2).content)

loop是为了应对下载顺序与拼接顺序的一致性所设立的:
① 本身它是左下-右上的顺序,而文件读取是自上而下的
② 读文件名“1”之后是读取“2”呢还是读“11”呢,机器和人可不太一样
因此设立了loop作为下载和拼接的逻辑地址标号。

loop=[]
for i in np.arange(11,100):loop.append(i)

city_loadfilename其实是为了方便下载所设立的命名,瓦片图片一个城市就会有几百甚至上千张的量,可能会多次分时间点爬取,那么我就让它“全自动”一点,自己在某个文件夹下面建立下载文件夹,然后再下载。

'''创建文件夹'''
now=time.strftime("%Y%m%d%H%M", time.localtime())
city_loadfilename=str(cityname)+str(now)
path = r'E:\pytstu\todpic'
os.mkdir(path + './'+city_loadfilename)
print(city_loadfilename)

第三步,图片拼接

按照需要的顺序一个个拼接。图片拼接部分代码参考 beyond_LH,感谢原创作者:
https://blog.csdn.net/beyond9305/article/details/83413009
xy的顺序可能还是需要自己调试一下。

'''拼接图片'''
def image_compose():to_image = Image.new('RGBA', (image_column * image_size, image_row * image_size)) #创建一个新图# 循环遍历,把每张图片按顺序粘贴到对应位置上for y in range(1, image_row + 1):for x in range(1, image_column + 1):from_image = Image.open(images_path + image_names[image_row * (x - 1) + y - 1]).resize((image_size, image_size),Image.ANTIALIAS)to_image.paste(from_image, ((x - 1) * image_size, (y - 1) * image_size))return to_image.save(image_save_path) # 保存新图

完整代码如下

'''allcode完整版'''
import numpy as np
import pandas as pd
import requests
import re
from PIL import Image
import os
import time'''xy坐标信息'''
def city_loc(number):n=number                            #表格里的序号,代表城市city_inf=data_citypic[n,1:4]        #读取需要的信息cityname=city_inf[0]xy1_16=city_inf[1]xy2_16=city_inf[2]                  #16位进制坐标x1_16=xy1_16[2:6]y1_16=xy1_16[7:10]x2_16=xy2_16[2:6]y2_16=xy2_16[7:10]                  #分离x1_10=eval('0x'+str(x1_16))y1_10=eval('0x'+str(y1_16))x2_10=eval('0x'+str(x2_16))y2_10=eval('0x'+str(y2_16))         #得到10进制的坐标return x1_10,y1_10,x2_10,y2_10,cityname  '''xy转图片下载pic_inf'''
def to_pic_inf(x,y):xa=hex(x)ya=hex(y)list_xa=list(xa)list_ya=list(ya)list_xa.pop(0)list_xa.pop(0)list_ya.pop(0)list_ya.pop(0)x_last=''.join(list_xa)y_last=''.join(list_ya)pic_inf='ob'+x_last+'l'+y_lastreturn pic_inf'''下载图片'''
def pic_load(x,y,x1,y2):ymax=y2xmin=x1url_pic=to_pic_inf(x,y)url2='https://lukuang.mapbar.com//city/traffic/images/2020/08/04/08/202008040814/10/'+url_pic+'.png'with open("E:\\pytstu\\todpic\\"+city_loadfilename+"\\"+str(loop[x-xmin])+str(loop[ymax-y])+".png",'wb') as f:f.write(requests.get(url2).content)'''拼接图片'''
def image_compose():to_image = Image.new('RGBA', (image_column * image_size, image_row * image_size)) #创建一个新图# 循环遍历,把每张图片按顺序粘贴到对应位置上for y in range(1, image_row + 1):for x in range(1, image_column + 1):from_image = Image.open(images_path + image_names[image_row * (x - 1) + y - 1]).resize((image_size, image_size),Image.ANTIALIAS)to_image.paste(from_image, ((x - 1) * image_size, (y - 1) * image_size))return to_image.save(image_save_path) # 保存新图'''主函数'''
if __name__ == '__main__':  '''编码进制'''loop=[]for i in np.arange(11,100):loop.append(i)'''获取信息'''df1 = pd.read_excel('pic.xlsx',sheet_name='cityinf',header=0,index=False)data_citypic=df1.valuescitynum=data_citypic.shape[0]while True:time_tostart = time.strftime("%H%M", time.localtime())  # 刷新if time_tostart == "1703": # 设置要执行的时间print("开始运行")city_i=0while(city_i<citynum):try:'''提取信息'''city_chinese=data_citypic[city_i][0]x1,y1,x2,y2,cityname=city_loc(city_i)pic_size=(x2-x1+1)*(y2-y1+1)length=x2-x1+1width=y2-y1+1print(cityname)print(x1,y1,x2,y2)print(length,width)print(pic_size)'''创建文件夹'''now=time.strftime("%Y%m%d%H%M", time.localtime()) city_loadfilename=str(cityname)+str(now)path = r'E:\pytstu\todpic' os.mkdir(path + './'+city_loadfilename)print(city_loadfilename)'''开始下载图片'''for x in np.arange(x1,x2+1):for y in np.arange(y1,y2+1):pic_load(x,y,x1,y2)print(city_chinese,"下载完成")'''拼接图片'''images_path = 'E:\\pytstu\\todpic\\'+city_loadfilename+'\\'  # 图片集地址,别忘了改成自己的images_format = ['.png']  # 图片格式image_size = 300  # 每张小图片的大小image_row = y2-y1+1  # 图片间隔,也就是合并成一张图后,一共有几行image_column = x2-x1+1  # 图片间隔,也就是合并成一张图后,一共有几列image_save_path = 'E:\\pytstu\\todpic\\'+city_loadfilename+'.png'  # 图片转换后的地址image_names = [name for name in os.listdir(images_path) for item in images_format ifos.path.splitext(name)[1] == item]# print(image_names)if len(image_names) != image_row * image_column:raise ValueError("合成图片的参数和要求的数量不能匹配!")image_compose() #调用函数print(city_chinese,"拼接完成")print("=======================================================================================")city_i+=1except Exception:print("failed!!!!!!!!")print("=======================================================================================")continuetime.sleep(50)

主函数里我加了while true,设置固定时间运行等方便进行“全自动爬取”。就让它开个几天几夜爬就完事了,根本不用管。有了while true+except出现timeout或者http连接错误它也会自己继续爬的。
大概结果就张很大的图(北京的10MB太大了,就放张小一点的兰州的吧),然后你放QGIS,ARCGIS里做新的研究吧:

以上。

python爬虫_抓取瓦片图片信息并将其拼接_以mapbar为例(适用交通工程类专业)相关推荐

  1. python爬网页数据用什么_初学者如何用“python爬虫”技术抓取网页数据?

    原标题:初学者如何用"python爬虫"技术抓取网页数据? 在当今社会,互联网上充斥着许多有用的数据.我们只需要耐心观察并添加一些技术手段即可获得大量有价值的数据.而这里的&quo ...

  2. python抓取网页电话号码_利用正则表达式编写python 爬虫,抓取网页电话号码!...

    利用正则表达式编写python 爬虫,抓取网页联系我们电话号码!这里以九奥科技(www.jiuaoo.com)为例,抓取'联系我们'里面的电话号码,并输出. #!/usrweilie/bin/pyth ...

  3. python正则表达式提取电话号码_利用正则表达式编写python 爬虫,抓取网页电话号码!...

    利用正则表达式编写python 爬虫,抓取网页联系我们电话号码!这里以九奥科技(www.jiuaoo.com)为例,抓取'联系我们'里面的电话号码,并输出. #!/usrweilie/bin/pyth ...

  4. Python爬虫实战---抓取图书馆借阅信息

    Python爬虫实战---抓取图书馆借阅信息 原创作品,引用请表明出处:Python爬虫实战---抓取图书馆借阅信息 前段时间在图书馆借了很多书,借得多了就容易忘记每本书的应还日期,老是担心自己会违约 ...

  5. Python爬虫:抓取智联招聘岗位信息和要求(进阶版)

    本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理 以下文章来源于腾讯云 作者:王强 ( 想要学习Python?Python学习交流群 ...

  6. python抓取视频违法吗,科学网—【python爬虫】抓取B站视频相关信息(一) - 管金昱的博文...

    昨天我在B站上写了这么一篇文章,但是被他们锁住了.无奈之下我复制到知乎上先保存起来 在这篇名为<三天学会用python进行简单地爬取B站网页视频数据>文章中我主要提到了两点在已知aid的情 ...

  7. Python爬虫采集抓取:Python3.x+Fiddler 采集抓取 APP 数据

    随着移动互联网的市场份额逐步扩大,手机 APP 已经占据我们的生活,以往的数据分析都借助于爬虫采集爬取网页数据进行分析,但是新兴的产品有的只有 APP,并没有网页端这对于想要提取数据的我们就遇到了些问 ...

  8. python 爬虫 数据抓取的三种方式

    python 爬虫   数据抓取的三种方式 常用抽取网页数据的方式有三种:正则表达式.Beautiful Soup.lxml 1.正则表达式 正则表达式有个很大的缺点是难以构造.可读性差.不易适用未来 ...

  9. python爬虫定时抓取数据

    python爬虫定时抓取数据 from scrapy import cmdline import datetime import time def doSth(): # 把爬虫程序放在这个类中 shi ...

最新文章

  1. python卸载pip重新安装_pip无法正常使用卸载并重新安装
  2. python实现进度条的3种方式
  3. P2P的原理和常见的实现方式
  4. 小师妹学JVM之:JIT中的PrintAssembly续集
  5. c语言电子期末考试题,山东师范大学11-12电子C语言期末试题
  6. nssl1478-题【dp】
  7. appium GUI介绍
  8. 关于代码控制管理的一些想法
  9. Epoll 的time_out参数引发的cpu占用问题
  10. JAVA 多用户商城系统b2b2c- 服务消费者(rest+ribbon)
  11. 高通如何通过9008端口读取EMMC的分区
  12. Per-cpu 变量
  13. 比较新旧两个CMDB库,列出要删除的编号,要更新的编号,要添加的编号。
  14. macOS Big Sur初体验之自带五笔输入法质变
  15. MODIS数据的简介和下载(二)——MODIS数据下载方式(FTP)
  16. 一个北京妞儿写的经典的话,太现实了!
  17. vscode调用keil-MDK编译程序
  18. DB2数据库HANG住的时候应该收集什么数据以及如何处理
  19. U盘有占用空间,但无文件或者都变成了快捷方式
  20. ファイルダウンロード

热门文章

  1. 机械设备出入库管理用什么软件管理?
  2. 世界各个国家坐标位置和中国各个省份坐标位置json格式
  3. 云呐|常见的固定资产折旧方法有哪些
  4. Kubernetes的ETCD集群备份、恢复
  5. 在使用SigmaStudio对ADAU1452做开发的时候,如何判断自己的程序是否已经正确的下载到DSP中运行?
  6. Gboard 基于 RNN 的手写识别
  7. 网络模拟器 eNSP、EVE-NG、GNS3、Packet Tracert
  8. angular指令心得(ng-model)
  9. Python学习5(生成器、类、属性、方法、私有化、继承、多态)
  10. 谷歌创始人口述历史:创建谷歌是意外 曾被赶出宿舍