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

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

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

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

我們通過python爬蟲爬取各線路各站點的 名稱、經緯度 信息,導出到文本文件,以供后續(xù)使用。
2.python核心代碼
獲取網頁內容:
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數據:
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("經度:", 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
保存站點數據(站名稱、經緯度):
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("寫入文件完成!")
爬取完成后,生成的數據如下:

二.生成shp文件并導出圖片
主要思路:調用Arcpy函數生成shp文件-——>點轉線——>設置符號樣式——>導出圖片。
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設置樣式
將生成的點shp與線shp矢量文件加載到arcmap當中設置樣式與符號大小,然后導出地圖為圖片。記得導出地圖時圖片分辨率選擇為300dpi。

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

到此這篇關于Python爬蟲爬取屬于自己的地鐵線路圖的文章就介紹到這了,更多相關Python爬取地鐵線路圖內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
關于Qt6中QtMultimedia多媒體模塊的重大改變分析
如果您一直在 Qt 5 中使用 Qt Multimedia,則需要對您的實現進行更改。這篇博文將嘗試引導您完成最大的變化,同時查看 API 和內部結構2021-09-09

