Python爬取(天地图·武汉\智慧武汉时空信息云平台)社区界线数据以及村子属性信息
單純的獲取天地圖的一般數(shù)據(jù)是和我前面獲取高德,百度地圖的POI是一樣的,在獲得開發(fā)者權(quán)限后得到api接口,申請(qǐng)Keys值然后獲得你想要的POI等數(shù)據(jù)。可以參考我的博客詳解:
https://blog.csdn.net/weixin_41447267/article/details/93371697
今天我們來獲取一些沒有api接口,而是疊加到地圖上的數(shù)據(jù)。
一、分析網(wǎng)站
網(wǎng)站地址:http://www.digitalwuhan.com/map/
打開網(wǎng)站查看網(wǎng)頁源代碼,發(fā)現(xiàn)這是一個(gè)javascript加載的網(wǎng)頁,數(shù)據(jù)不再html里。
因此只能進(jìn)行抓包分析。
經(jīng)過分析發(fā)現(xiàn)數(shù)據(jù)都在下面的服務(wù)器里。
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
分析得到參數(shù)geometry和mapExtent是變量。
因此改變表單上面兩個(gè)參數(shù)的值就可以得到全部的數(shù)據(jù)了。
二、思路
由于分析知道是AJax異步加載數(shù)據(jù),我首先想到的就是selenium或splash模擬瀏覽器操作,在經(jīng)過不斷的嘗試下,發(fā)現(xiàn)沒必要而且很復(fù)雜,發(fā)現(xiàn)模擬鼠標(biāo)在屏幕上自動(dòng)的移動(dòng)上萬次,還是有點(diǎn)兒詭異。于是就直接獲取。首先想到從底圖的左上角逐步移動(dòng)的方法獲取數(shù)據(jù),但是這么的想法不是不行,其在遍歷的時(shí)候次數(shù)會(huì)成幾何倍數(shù)增加,對(duì)于這么龐大的數(shù)據(jù)來說這個(gè)可能得爬幾天,而且在中間如果有凹凸的地方會(huì)遺漏數(shù)據(jù)的,所以這個(gè)方法不可靠,服務(wù)器也不能接受這么多次的訪問。那么多種想法過后,最終是以將邊緣地區(qū)的經(jīng)緯坐標(biāo)得到再遍歷,如此會(huì)減少遍歷次數(shù),減小服務(wù)器壓力。
三、代碼
廢話少說,附上代碼一目了然。
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,減慢爬取速度,為服務(wù)器減小壓力params = {'f': 'json','tolerance': '3','returnGeometry': 'true','imageDisplay': '400,400,96','geometry': "{'x': " + str(xx)+ ", 'y':" + str(dat["y"]) + "}",#爬取社區(qū)村的,鼠標(biāo)停留的坐標(biāo)'geometryType': 'esriGeometryPoint','sr': '4490','mapExtent': '113.69637983261839,29.971009545533356,115.07679084787873,31.3607736095515',#武漢市的外接矩形的兩點(diǎn)坐標(biāo)'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:#跳出沒有數(shù)據(jù)的部分breakdata = json.loads(txt)#以json格式讀取數(shù)據(jù)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列表來記錄每一項(xiàng)已有的數(shù)據(jù),借此來去除冗余數(shù)據(jù)’’’fh.append(data["results"][i]["attributes"]["SSSQ"])file.write(str(data["results"][i]))#寫入為txt文本file.write('\n')xx=xx+0.005#每隔0.005度經(jīng)度獲取相應(yīng)的數(shù)據(jù)t = len(fh)print(t) if __name__ == '__main__':f = open("D:\Python_DATA/tianditu/edges.txt", "r")#武漢市邊緣處每個(gè)村內(nèi)的任一一點(diǎn)經(jīng)緯度坐標(biāo)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()四、部分?jǐn)?shù)據(jù)結(jié)果展示
五、總結(jié)
在爬取這個(gè)天地圖網(wǎng)站的時(shí)候,遇到了很多問題。首先在抓包分析的時(shí)候找出數(shù)據(jù)的藏身之處就費(fèi)了一番時(shí)間。然后憑著自己的經(jīng)驗(yàn)來判斷以為這種抓包分析得到的url都是有極大的規(guī)律的,所以在自己這樣的認(rèn)識(shí)下,下了一番功夫才發(fā)現(xiàn),它卻是無律可循的,每一個(gè)params表單里的geometry都是獨(dú)立的參數(shù),所以一直想在這上面有所突破,但是最后發(fā)現(xiàn)沒有規(guī)律后就只能放棄這條思路了。而后我想從整個(gè)切片地圖的每個(gè)像素所對(duì)應(yīng)的經(jīng)緯坐標(biāo)來下手,如此遍歷下去,將有數(shù)據(jù)的保存下來,然而這也是不太現(xiàn)實(shí)的,畢竟那樣遍歷的次數(shù)將大大增加,造成對(duì)方服務(wù)器不響應(yīng),所以也放棄這條路。最后想到可以跳過訪問沒有數(shù)據(jù)的行為,但是這樣少了訪問空白數(shù)據(jù)處的訪問次數(shù),但是在有數(shù)據(jù)的地方對(duì)其會(huì)重復(fù)訪問多次,這樣服務(wù)器也會(huì)不耐煩的,所以也不是很好。最后我用了一個(gè)比較笨的方法,就是在武漢市市界內(nèi)橫方離散順序的取一些點(diǎn)坐標(biāo),縱向的取一些點(diǎn)坐標(biāo),然后這樣既減少了遍歷訪問的次數(shù),也不會(huì)造成數(shù)據(jù)的缺失,是一個(gè)比較可行的算法。
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 誠長ing? ?
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 2019.8.28
數(shù)據(jù)和源代碼:
鏈接:https://pan.baidu.com/s/1SYB4LUnqX0uGvGFqbyLsOQ?
提取碼:33nz?
總結(jié)
以上是生活随笔為你收集整理的Python爬取(天地图·武汉\智慧武汉时空信息云平台)社区界线数据以及村子属性信息的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: android系统联系人可以转到blac
- 下一篇: python创建简单的客户端和服务器