最近公司有一个需求就是随机抓取10万张百度街景地图,刚开始没有什么头绪,最后还是解决了,在这里分享一下。
毫无疑问,这些图片肯定是异步加载的,打开百度地图的街景模式,f12打开开发者模式,清空所有响应,并点击向前
百度街景.png
可以看到产生了很多的图片
image.png正是这些图片拼接成了街景的360VR模式,但是我们并不需要全部的,只需要道路的街景。
经过观察发下,这个链接才是我们想要的接口
url = "https://mapsv0.bdimg.com/?qt=pr3d&fovy=35&quality=80&panoid=09000200121706161142304748F&heading=13.579&pitch=0&width=198&height=108"
image.png
其中panoid=09000200121706161142304748F是这个图片的唯一标识,链接最后是设置图片的大小。而且这个panoid也是有一定一定规律的,理论上遍历这个id,虽然有很多错误,但是肯定是能满足需求的。
那么这个panoid是怎么来的呢?仔细查看结果可以看出来 image.png
接口为url=“https://mapsv0.bdimg.com/?qt=sdata&sid=09000200011704011540405782F&pc=1&udt=20180706&fn=jsonp.p3991630”
由这个sid=09000200011704011540405782F可以得到结果
image.png
可以看到第一个PID和SID是相等的,由此可以推断每一个PID都是一个低点的道路图片标识,把PID传入上方链接则会返回附近点的图片标识,如此遍历循环,就能获取一条道路的所有图片。
但是这个SID是怎么来的呢?
打开百度地图并切换到全景将鼠标放在地图上,可以看到随着鼠标的移动会不断的产生response.
image.png
链接示例 url= "https://mapsv0.bdimg.com/?udt=20180706&qt=qsdata&x=12736165.723753473&y=3539379.7796100094&l=17.031000000000002&action=0&mode=day&t=1530956939770&fn=jsonp22844820"
结果的产生只与x与y的值有关。
响应的结果如下:
image.png
其中包含了道路名称,我们想要的sid,还有拍摄这个照片的坐标值,当然这个坐标不是GPS而是百度地图自己的坐标。
由于街景地图只有道路有,所以地图的很多地方都是没有结果的。只有在道路附近才会返回正确的sid,而且距离太近返回的sid也是一致的。
所以最后大概有三种方法可以满足我的条件,一个是暴力的循环pid,错误就忽略正确就返回结果。另一个就是在一条道路寻找一个种子pid,然后爬取整条道路的所有图片。最后一种就是根据百度地图的坐标,设置一个区域,遍历整个区域的所有坐标,正确就返回pid,错误就不处理。
网友评论