欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Python爬蟲爬取屬于自己的地鐵線路圖

 更新時(shí)間:2022年01月25日 09:55:55   作者:編程簡(jiǎn)單學(xué)  
這篇文章主要介紹了Python爬蟲爬取屬于自己的地鐵線路圖,下面文章主要事根據(jù)自己需要對(duì)地鐵路線進(jìn)行爬取的實(shí)現(xiàn)過(guò)程,需要的小伙伴可以參考一下,希望對(duì)你有所幫助

前言:

網(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)文章

最新評(píng)論