日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > python >内容正文

python

Python爬取(天地图·武汉\智慧武汉时空信息云平台)社区界线数据以及村子属性信息

發布時間:2024/1/1 python 84 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Python爬取(天地图·武汉\智慧武汉时空信息云平台)社区界线数据以及村子属性信息 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

單純的獲取天地圖的一般數據是和我前面獲取高德,百度地圖的POI是一樣的,在獲得開發者權限后得到api接口,申請Keys值然后獲得你想要的POI等數據。可以參考我的博客詳解:

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爬取(天地图·武汉\智慧武汉时空信息云平台)社区界线数据以及村子属性信息的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。