Python爬蟲爬取屬于自己的地鐵線路圖
前言:
網(wǎng)上找的地鐵線路圖大多數(shù)都不太清晰,而且有水印,對本人這種視力不好的人來說看起來是真的不方便。所以能不能制作屬于自己的地鐵線路圖呢?好不好看無所謂,主要是高清無碼,要看清楚各個站點!想了想,主要還是缺乏站點數(shù)據(jù),有數(shù)據(jù)了圖自然就有了。經(jīng)過網(wǎng)上查詢,發(fā)現(xiàn)高德地圖上有專門的地鐵線路圖,但是不能導出數(shù)據(jù)或圖片,只好自己想辦法抓取了。下面以西安地鐵線路圖為例介紹方法。
一.高德地圖數(shù)據(jù)爬取
1.爬取思路
首先,谷歌瀏覽器打開 高德地圖官網(wǎng) ,點擊上方菜單欄 地鐵 進入地鐵線路網(wǎng)站如下,網(wǎng)址:http://map.amap.com/subway/index.html。

按 F12 或右擊 檢查 進入調(diào)試頁面,點擊 Network 選項。在網(wǎng)頁上先點擊 西安 ,可以發(fā)現(xiàn)箭頭2出新增兩行響應(yīng)信息,鼠標左擊可以發(fā)現(xiàn)箭頭3處出現(xiàn)真實的請求地址等信息。

復制請求URL地址(http://map.amap.com/service/subway?_1612234237437&srhdata=6101_drw_xian.json),在瀏覽器新頁面打開可以看見返回的是 json 數(shù)據(jù),里面包含了各線路站點信息,正是我們想要的。

可以復制json數(shù)據(jù)在json在線驗證網(wǎng)站上進行分析,以便于后續(xù)解析數(shù)據(jù)(網(wǎng)址:http://www.json.cn/#)。如下圖所示,顯示的是1號線灃河森林公園站的相關(guān)信息:中文名稱、經(jīng)緯度(應(yīng)該是火星坐標系?)、拼音名稱等。

我們通過python爬蟲爬取各線路各站點的 名稱、經(jīng)緯度 信息,導出到文本文件,以供后續(xù)使用。
2.python核心代碼
獲取網(wǎng)頁內(nèi)容:
def getHtml(url):
user_agent = random.choice(USER_AGENTS)
headers = {
"Host":"map.amap.com",
'User-Agent': user_agent
}
try:
response = requests.get(url, headers=headers)
#print(response.url)
text = response.content
return text
except:
print("爬取失敗!")
解析json數(shù)據(jù):
def parse_page(text):
lines_list = json.loads(text).get('l')
# 地鐵線路信息表
lineInfo_list = []
for line in lines_list:
#每條線的信息集合
lineInfo = {}
lineInfo['ln'] = line.get('ln')
print(lineInfo['ln'])
#線路站點列表
station_list = []
st_list = line.get('st')
for st in st_list:
station_dict = {}
station_dict['name'] = st.get('n')
coord = st.get('sl')
station_dict['lat'] = coord.split(',')[0]
station_dict['lon'] = coord.split(',')[-1]
print("站名稱:", station_dict['name'])
print("經(jīng)度:", station_dict['lat'])
print("緯度:", station_dict['lon'])
station_list.append(station_dict)
#pass
print('-----------------------------------')
lineInfo['st'] = station_list
lineInfo['kn'] = line.get('kn')
lineInfo['ls'] = line.get('ls')
lineInfo['cl'] = line.get('cl')
lineInfo_list.append(lineInfo)
#返回各線路信息列表
return lineInfo_list
保存站點數(shù)據(jù)(站名稱、經(jīng)緯度):
def save_file(filename, lineInfo):
#print("開始寫入文件......")
with open(filename, 'a', encoding='utf-8') as f:
for st in lineInfo['st']:
f.write(st['name'] + " " + st['lat'] + " " + st['lon'] + "\n")
#print("寫入文件完成!")
爬取完成后,生成的數(shù)據(jù)如下:

二.生成shp文件并導出圖片
主要思路:調(diào)用Arcpy函數(shù)生成shp文件-——>點轉(zhuǎn)線——>設(shè)置符號樣式——>導出圖片。
1.文本點生成shp代碼
def create_shp(text,dirpath):
point_shpname = text.split('.')[0] + "_point.shp"
line_shpname = text.split('.')[0] + "_line.shp"
f = open(text, 'r')
lines = f.readlines()
spatRef = arcpy.SpatialReference(4326)
createFC = arcpy.CreateFeatureclass_management(dirpath, point_shpname, "POINT", "", "", "",spatRef)
arcpy.AddField_management(createFC, "name", "TEXT")
arcpy.AddField_management(createFC, "lat", "DOUBLE")
arcpy.AddField_management(createFC, "lon", "DOUBLE")
cur = arcpy.InsertCursor(createFC)
for line in lines:
info = line.strip().split(" ")
row = cur.newRow()
name = info[0]
point = arcpy.Point()
point.X = float(info[1])
point.Y = float(info[2])
pointGeometry = arcpy.PointGeometry(point)
row.shape = pointGeometry
row.name = name
row.lon = point.X
row.lat = point.Y
cur.insertRow(row)
#站點生成線
arcpy.PointsToLine_management(point_shpname, line_shpname)
2.Arcmap設(shè)置樣式
將生成的點shp與線shp矢量文件加載到arcmap當中設(shè)置樣式與符號大小,然后導出地圖為圖片。記得導出地圖時圖片分辨率選擇為300dpi。

最終,如下圖所示屬于自己的地鐵線路圖就制作完成了。圖片估計上傳到微信上就不是原圖了,又會變模糊,但是實際看起來還是比較清楚的。

到此這篇關(guān)于Python爬蟲爬取屬于自己的地鐵線路圖的文章就介紹到這了,更多相關(guān)Python爬取地鐵線路圖內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Python實現(xiàn)把json格式轉(zhuǎn)換成文本或sql文件
這篇文章主要介紹了Python實現(xiàn)把json格式轉(zhuǎn)換成文本或sql文件,本文直接給出代碼實例,需要的朋友可以參考下2015-07-07
Python中利用原始套接字進行網(wǎng)絡(luò)編程的示例
這篇文章主要介紹了Python中利用原始套接字進行網(wǎng)絡(luò)編程的示例,使用sock_raw接受和發(fā)送數(shù)據(jù)包可以避開網(wǎng)絡(luò)協(xié)議的諸多限制,需要的朋友可以參考下2015-05-05
關(guān)于Qt6中QtMultimedia多媒體模塊的重大改變分析
如果您一直在 Qt 5 中使用 Qt Multimedia,則需要對您的實現(xiàn)進行更改。這篇博文將嘗試引導您完成最大的變化,同時查看 API 和內(nèi)部結(jié)構(gòu)2021-09-09
關(guān)于pytorch求導總結(jié)(torch.autograd)
這篇文章主要介紹了關(guān)于pytorch求導總結(jié)(torch.autograd),具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2023-06-06

