Python爬取(天地图·武汉\智慧武汉时空信息云平台)社区界线数据以及村子属性信息
單純的獲取天地圖的一般數據是和我前面獲取高德,百度地圖的POI是一樣的,在獲得開發者權限后得到api接口,申請Keys值然后獲得你想要的POI等數據??梢詤⒖嘉业牟┛驮斀?#xff1a;
https://blog.csdn.net/weixin_41447267/article/details/93371697
今天我們來獲取一些沒有api接口,而是疊加到地圖上的數據。
一、分析網站
網站地址:http://www.digitalwuhan.com/map/
打開網站查看網頁源代碼,發現這是一個javascript加載的網頁,數據不再html里。
因此只能進行抓包分析。
經過分析發現數據都在下面的服務器里。
http://58.49.165.89:8010/ServiceAdapter/MAP/%E7%A4%BE%E5%8C%BA%E7%95%8C%E7%BA%BF/07769b53b5243b7d6aea9df803f471c1/identify?f=json&tolerance=3&returnGeometry=true&imageDisplay=400%2C400%2C96&geometry=%7B%22x%22%3A114.25133544921195%2C%22y%22%3A31.33576538092775%7D&geometryType=esriGeometryPoint&sr=4490&mapExtent=113.25157958973799%2C29.836131591716807%2C117.47032959015559%2C31.61317016611146&layers=all%3A0&callback=dojo.io.script.jsonp_dojoIoScript3._jsonpCallback
分析得到參數geometry和mapExtent是變量。
因此改變表單上面兩個參數的值就可以得到全部的數據了。
二、思路
由于分析知道是AJax異步加載數據,我首先想到的就是selenium或splash模擬瀏覽器操作,在經過不斷的嘗試下,發現沒必要而且很復雜,發現模擬鼠標在屏幕上自動的移動上萬次,還是有點兒詭異。于是就直接獲取。首先想到從底圖的左上角逐步移動的方法獲取數據,但是這么的想法不是不行,其在遍歷的時候次數會成幾何倍數增加,對于這么龐大的數據來說這個可能得爬幾天,而且在中間如果有凹凸的地方會遺漏數據的,所以這個方法不可靠,服務器也不能接受這么多次的訪問。那么多種想法過后,最終是以將邊緣地區的經緯坐標得到再遍歷,如此會減少遍歷次數,減小服務器壓力。
三、代碼
廢話少說,附上代碼一目了然。
from urllib.parse import urlencode import requests import json import timedef __spider__(dat):headers = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.100 Safari/537.36"}xx=dat["x"]while True:time.sleep(1)#休息1s,減慢爬取速度,為服務器減小壓力params = {'f': 'json','tolerance': '3','returnGeometry': 'true','imageDisplay': '400,400,96','geometry': "{'x': " + str(xx)+ ", 'y':" + str(dat["y"]) + "}",#爬取社區村的,鼠標停留的坐標'geometryType': 'esriGeometryPoint','sr': '4490','mapExtent': '113.69637983261839,29.971009545533356,115.07679084787873,31.3607736095515',#武漢市的外接矩形的兩點坐標'layers': 'all:0',}url = "http://58.49.165.89:8010/ServiceAdapter/MAP/%E7%A4%BE%E5%8C%BA%E7%95%8C%E7%BA%BF/07769b53b5243b7d6aea9df803f471c1/identify?" + urlencode(params)r = requests.get(url, headers=headers)txt = r.textgo = len(txt)if go < 15:#跳出沒有數據的部分breakdata = json.loads(txt)#以json格式讀取數據num = len(data["results"])for i in range(0, num):if (data["results"][i]["attributes"]["SSSQ"] not in fh):print(xx,":",data["results"][i]) ’’’用fh列表來記錄每一項已有的數據,借此來去除冗余數據’’’fh.append(data["results"][i]["attributes"]["SSSQ"])file.write(str(data["results"][i]))#寫入為txt文本file.write('\n')xx=xx+0.005#每隔0.005度經度獲取相應的數據t = len(fh)print(t) if __name__ == '__main__':f = open("D:\Python_DATA/tianditu/edges.txt", "r")#武漢市邊緣處每個村內的任一一點經緯度坐標file = open("D:\Python_DATA/tianditu/tianditudata.txt", "a", encoding="utf-8")fh = []while True:lon_lat = f.readline()if not lon_lat:breaklon_lat = str(lon_lat)dat = json.loads(lon_lat)__spider__(dat)file.close()f.close()四、部分數據結果展示
五、總結
在爬取這個天地圖網站的時候,遇到了很多問題。首先在抓包分析的時候找出數據的藏身之處就費了一番時間。然后憑著自己的經驗來判斷以為這種抓包分析得到的url都是有極大的規律的,所以在自己這樣的認識下,下了一番功夫才發現,它卻是無律可循的,每一個params表單里的geometry都是獨立的參數,所以一直想在這上面有所突破,但是最后發現沒有規律后就只能放棄這條思路了。而后我想從整個切片地圖的每個像素所對應的經緯坐標來下手,如此遍歷下去,將有數據的保存下來,然而這也是不太現實的,畢竟那樣遍歷的次數將大大增加,造成對方服務器不響應,所以也放棄這條路。最后想到可以跳過訪問沒有數據的行為,但是這樣少了訪問空白數據處的訪問次數,但是在有數據的地方對其會重復訪問多次,這樣服務器也會不耐煩的,所以也不是很好。最后我用了一個比較笨的方法,就是在武漢市市界內橫方離散順序的取一些點坐標,縱向的取一些點坐標,然后這樣既減少了遍歷訪問的次數,也不會造成數據的缺失,是一個比較可行的算法。
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 誠長ing? ?
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 2019.8.28
數據和源代碼:
鏈接:https://pan.baidu.com/s/1SYB4LUnqX0uGvGFqbyLsOQ?
提取碼:33nz?
總結
以上是生活随笔為你收集整理的Python爬取(天地图·武汉\智慧武汉时空信息云平台)社区界线数据以及村子属性信息的全部內容,希望文章能夠幫你解決所遇到的問題。
 
                            
                        - 上一篇: android系统联系人可以转到blac
- 下一篇: 为什么32位系统支持的最大内存为4G?
