最近公司有一個需求就是隨機抓取10萬張百度街景地圖,剛開始沒有什么頭緒,最后還是解決了,在這里分享一下。
毫無疑問,這些圖片肯定是異步加載的,打開百度地圖的街景模式,f12打開開發(fā)者模式,清空所有響應,并點擊向前

百度街景.png
可以看到產(chǎn)生了很多的圖片

image.png
正是這些圖片拼接成了街景的360VR模式,但是我們并不需要全部的,只需要道路的街景。
經(jīng)過觀察發(fā)下,這個鏈接才是我們想要的接口
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是這個圖片的唯一標識,鏈接最后是設(shè)置圖片的大小。而且這個panoid也是有一定一定規(guī)律的,理論上遍歷這個id,雖然有很多錯誤,但是肯定是能滿足需求的。
那么這個panoid是怎么來的呢?仔細查看結(jié)果可以看出來

image.png
接口為url=“https://mapsv0.bdimg.com/?qt=sdata&sid=09000200011704011540405782F&pc=1&udt=20180706&fn=jsonp.p3991630”
由這個sid=09000200011704011540405782F可以得到結(jié)果

image.png
可以看到第一個PID和SID是相等的,由此可以推斷每一個PID都是一個低點的道路圖片標識,把PID傳入上方鏈接則會返回附近點的圖片標識,如此遍歷循環(huán),就能獲取一條道路的所有圖片。
但是這個SID是怎么來的呢?
打開百度地圖并切換到全景將鼠標放在地圖上,可以看到隨著鼠標的移動會不斷的產(chǎn)生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"
結(jié)果的產(chǎn)生只與x與y的值有關(guān)。
響應的結(jié)果如下:

image.png
其中包含了道路名稱,我們想要的sid,還有拍攝這個照片的坐標值,當然這個坐標不是GPS而是百度地圖自己的坐標。
由于街景地圖只有道路有,所以地圖的很多地方都是沒有結(jié)果的。只有在道路附近才會返回正確的sid,而且距離太近返回的sid也是一致的。
所以最后大概有三種方法可以滿足我的條件,一個是暴力的循環(huán)pid,錯誤就忽略正確就返回結(jié)果。另一個就是在一條道路尋找一個種子pid,然后爬取整條道路的所有圖片。最后一種就是根據(jù)百度地圖的坐標,設(shè)置一個區(qū)域,遍歷整個區(qū)域的所有坐標,正確就返回pid,錯誤就不處理。