Python爬蟲——城市公交、地鐵網站和線路資料擷取

來源:互聯網
上載者:User

標籤:ice   地鐵   gcj02   速度   test   大量   pen   點擊   eid   

  本篇博文為博主原創,轉載請註明。

  城市公交、地鐵資料反映了城市的公用交通,研究該資料可以挖掘城市的交通結構、路網規劃、公交選址等。但是,這類資料往往掌握在特定部門中,很難擷取。互連網地圖上有大量的資訊,包含公交、地鐵等資料,解析其資料反饋方式,可以通過Python爬蟲採集。閑言少敘,接下來將詳細介紹如何使用Python爬蟲爬取城市公交、地鐵網站和資料。

  首先,爬取研究城市的所有公交和地鐵線路名稱,即XX路,地鐵X號線。可以通過圖吧公交、公交網、8684、本地寶等網站擷取,該類網站提供了按數字和字母劃分類別的公交線路名稱。Python寫個簡單的爬蟲就能採集,可參看WenWu_Both的文章,博主詳細介紹了如何利用python爬取8684上某城市所有的公交網站資料。該博主採集了網站詳細的資訊,包括,但是缺少了公交網站的座標、公交線路座標資料。這就讓人抓狂了,沒有空間座標怎麼落圖,怎麼分析,所以,本文重點介紹的是網站座標、線路的擷取。

  以圖吧公交為例,點擊某一公交後,出現該路公交的詳細網站資訊和地圖資訊。博主頓感興奮,覺得馬上就要成功了,各種抓包,發現並不能解析。可能博主技術所限,如有大神能從中抓到網站和線路的座標資訊,請不寧賜教。這TM就讓人絕望了啊,到嘴的肥肉吃不了。

  天無絕人之路,嘗試找找某地圖的API,發現可以調用,通過解析,能夠找到該資料的後台地址。熟悉前端的可以試試,博主前端也就只會個hello world,不獻醜了。這是一種思路,實踐證明是可以的。

  地圖API可以,那麼通過地圖抓包呢?開啟某圖首頁,直接輸入某市公交名稱,通過抓包,成功找到網站和線路資訊。具體抓包資訊如所示,busline_list中詳細列出了網站和線路的資訊,其中有兩條,是同一趟公交不同方向的資料,略有差別,需注意。找到入口過後,接下來爬蟲就要大顯身手了。

  主要爬取代碼如下,其實也很簡單,主函數如下。首先需要構建傳入的參數,主要的包括路線名稱,城市編碼,地理範圍,縮放尺度。地理範圍可以通過座標拾取器擷取,參數經url編碼後,發送請求,判斷返回資料是否符合要求(註:可能該線路地圖上停運或不存在,也可能是訪問速度過快,反爬蟲機制需要人工驗證,博主爬取的時候碰到過,所以後面設定了隨機休眠)。接下來,就是解析json資料了。代碼中的extratStations和extractLine,就是提取需要的欄位,怎麼樣,是不是很簡單。最後,就是儲存了,網站和路線分別儲存。

 1 def main(): 2     df = pd.read_excel("線路名稱.xlsx",) 3     BaseUrl = "https://ditu.amap.com/service/poiInfo?query_type=TQUERY&pagesize=20&pagenum=1&qii=true&cluster_state=5&need_utd=true&utd_sceneid=1000&div=PC1000&addr_poi_merge=true&is_classify=true&" 4     for bus in df[u"線路"]: 5         params = { 6             ‘keywords‘:‘11路‘, 7             ‘zoom‘: ‘11‘, 8             ‘city‘:‘610100‘, 9             ‘geoobj‘:‘107.623|33.696|109.817|34.745‘10         }11         print(bus)12         paramMerge = urllib.parse.urlencode(params) 13         #print(paramMerge)14         targetUrl = BaseUrl + paramMerge15         stationFile = "./busStation/" + bus + ".csv"16         lineFile = "./busLine/" + bus + ".csv"17         18         req = urllib.request.Request(targetUrl)19         res = urllib.request.urlopen(req)20         content = res.read()21         jsonData = json.loads(content)22         if (jsonData["data"]["message"]) and jsonData["data"]["busline_list"]:23             busList = jsonData["data"]["busline_list"] ##busline 列表24             busListSlt = busList[0] ## busList共包含兩條線,方向不同的同一趟公交,任選一趟爬取25             26             busStations = extratStations(busListSlt)27             busLine = extractLine(busListSlt)28             writeStation(busStations, stationFile)29             writeLine(busLine, lineFile)30             31             sleep(random.random() * random.randint(0,7) + random.randint(0,5)) #設定隨機休眠32         else:33             continue

  附上博主的解析函數:

 1 def extratStations(busListSlt): 2     busName = busListSlt["name"] 3     stationSet = [] 4     stations = busListSlt["stations"] 5     for bs in stations: 6         tmp = [] 7         tmp.append(bs["station_id"]) 8         tmp.append(busName) 9         tmp.append(bs["name"])10         cor = bs["xy_coords"].split(";")11         tmp.append(cor[0])12         tmp.append(cor[1])13         wgs84cor1 = gcj02towgs84(float(cor[0]),float(cor[1]))14         tmp.append(wgs84cor1[0])15         tmp.append(wgs84cor1[1])16         stationSet.append(tmp)17     return stationSet18 19 def extractLine(busListSlt):20     ## busList共包含兩條線,備忘名稱21     keyName = busListSlt["key_name"]22     busName = busListSlt["name"] 23     fromName = busListSlt["front_name"]24     toName = busListSlt["terminal_name"]25     lineSet = []26     Xstr = busListSlt["xs"]27     Ystr = busListSlt["ys"]28     Xset = Xstr.split(",")29     Yset = Ystr.split(",")30     length = len(Xset)31     for i in range(length):32         tmp = []33         tmp.append(keyName)34         tmp.append(busName)35         tmp.append(fromName)36         tmp.append(toName)37         tmp.append(Xset[i])38         tmp.append(Yset[i])39         wgs84cor2 = gcj02towgs84(float(Xset[i]),float(Yset[i]))40         tmp.append(wgs84cor2[0])41         tmp.append(wgs84cor2[1])42         lineSet.append(tmp)43     return lineSet

  爬蟲採集未經處理資料如下:

  以下是某一條公交網站和線路的處理後的資料展示。由於不同的地圖商採用不同的座標系,會有不同程度的偏差,需要座標糾偏。下一步,博主將詳細介紹如何批量將這些網站和座標進行座標糾正和向量化。

 

 

Python爬蟲——城市公交、地鐵網站和線路資料擷取

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.