Python爬蟲爬取屬于自己的地鐵線路圖
前言:
網(wǎng)上找的地鐵線路圖大多數(shù)都不太清晰,而且有水印,對(duì)本人這種視力不好的人來(lái)說(shuō)看起來(lái)是真的不方便。所以能不能制作屬于自己的地鐵線路圖呢?好不好看無(wú)所謂,主要是高清無(wú)碼,要看清楚各個(gè)站點(diǎn)!想了想,主要還是缺乏站點(diǎn)數(shù)據(jù),有數(shù)據(jù)了圖自然就有了。經(jīng)過(guò)網(wǎng)上查詢,發(fā)現(xiàn)高德地圖上有專門的地鐵線路圖,但是不能導(dǎo)出數(shù)據(jù)或圖片,只好自己想辦法抓取了。下面以西安地鐵線路圖為例介紹方法。
一.高德地圖數(shù)據(jù)爬取
1.爬取思路
首先,谷歌瀏覽器打開 高德地圖官網(wǎng) ,點(diǎn)擊上方菜單欄 地鐵 進(jìn)入地鐵線路網(wǎng)站如下,網(wǎng)址:http://map.amap.com/subway/index.html。
按 F12 或右擊 檢查 進(jìn)入調(diào)試頁(yè)面,點(diǎn)擊 Network
選項(xiàng)。在網(wǎng)頁(yè)上先點(diǎn)擊 西安 ,可以發(fā)現(xiàn)箭頭2出新增兩行響應(yīng)信息,鼠標(biāo)左擊可以發(fā)現(xiàn)箭頭3處出現(xiàn)真實(shí)的請(qǐng)求地址等信息。
復(fù)制請(qǐng)求URL地址(http://map.amap.com/service/subway?_1612234237437&srhdata=6101_drw_xian.json),在瀏覽器新頁(yè)面打開可以看見(jiàn)返回的是 json 數(shù)據(jù),里面包含了各線路站點(diǎn)信息,正是我們想要的。
可以復(fù)制json數(shù)據(jù)在json在線驗(yàn)證網(wǎng)站上進(jìn)行分析,以便于后續(xù)解析數(shù)據(jù)(網(wǎng)址:http://www.json.cn/#)。如下圖所示,顯示的是1號(hào)線灃河森林公園站的相關(guān)信息:中文名稱、經(jīng)緯度(應(yīng)該是火星坐標(biāo)系?)、拼音名稱等。
我們通過(guò)python
爬蟲爬取各線路各站點(diǎn)的 名稱、經(jīng)緯度 信息,導(dǎo)出到文本文件,以供后續(xù)使用。
2.python核心代碼
獲取網(wǎng)頁(yè)內(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']) #線路站點(diǎn)列表 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
保存站點(diǎn)數(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文件并導(dǎo)出圖片
主要思路:調(diào)用Arcpy函數(shù)生成shp文件-——>點(diǎn)轉(zhuǎn)線——>設(shè)置符號(hào)樣式——>導(dǎo)出圖片。
1.文本點(diǎn)生成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) #站點(diǎn)生成線 arcpy.PointsToLine_management(point_shpname, line_shpname)
2.Arcmap設(shè)置樣式
將生成的點(diǎn)shp與線shp矢量文件加載到arcmap當(dāng)中設(shè)置樣式與符號(hào)大小,然后導(dǎo)出地圖為圖片。記得導(dǎo)出地圖時(shí)圖片分辨率選擇為300dpi。
最終,如下圖所示屬于自己的地鐵線路圖就制作完成了。圖片估計(jì)上傳到微信上就不是原圖了,又會(huì)變模糊,但是實(shí)際看起來(lái)還是比較清楚的。
到此這篇關(guān)于Python爬蟲爬取屬于自己的地鐵線路圖的文章就介紹到這了,更多相關(guān)Python爬取地鐵線路圖內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
python單向鏈表的基本實(shí)現(xiàn)與使用方法【定義、遍歷、添加、刪除、查找等】
這篇文章主要介紹了python單向鏈表的基本實(shí)現(xiàn)與使用方法,結(jié)合實(shí)例形式分析了Python單向鏈表的定義、遍歷、添加、刪除、查找等相關(guān)操作技巧,需要的朋友可以參考下2019-10-10Python標(biāo)準(zhǔn)庫(kù)os庫(kù)的常用功能解析
這篇文章主要介紹了Python標(biāo)準(zhǔn)庫(kù)os庫(kù)的常用功能解析,os庫(kù)是Python標(biāo)準(zhǔn)庫(kù)之一,它提供了非常豐富的文件及目錄讀寫的方法2022-07-07python3利用tcp實(shí)現(xiàn)文件夾遠(yuǎn)程傳輸
這篇文章主要為大家詳細(xì)介紹了python3利用tcp實(shí)現(xiàn)文件夾遠(yuǎn)程傳輸,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-07-07Python利用wxPython實(shí)現(xiàn)ocr識(shí)別圖片漢字程序
在這篇博客中,我們將介紹一個(gè)如何使用wxPython構(gòu)建的簡(jiǎn)單OCR識(shí)別圖片漢字應(yīng)用程序,文章的示例代碼講解詳細(xì),感興趣的小伙伴可以學(xué)習(xí)一下2023-08-08jupyter note 實(shí)現(xiàn)將數(shù)據(jù)保存為word
這篇文章主要介紹了jupyter note 實(shí)現(xiàn)將數(shù)據(jù)保存為word,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-04-04Python安裝第三方庫(kù)的方法(pip/conda、easy_install、setup.py)
這篇文章主要介紹了Python安裝第三方庫(kù)(pip/conda、easy_install、setup.py)的相關(guān)知識(shí),本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2023-05-05Tensorflow 如何從checkpoint文件中加載變量名和變量值
這篇文章主要介紹了Tensorflow 如何從checkpoint文件中加載變量名和變量值的操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-05-05python刪除列表元素del,pop(),remove()及clear()
這篇文章主要介紹了python刪除列表元素del,pop(),remove()及clear(),列表元素能增加就可以刪除,這里要給大家介紹的是刪除列表元素,具有一定的參考價(jià)值,需要的小伙伴可以參考一下2022-03-03