介紹爬取全國地鐵站點(diǎn),、地鐵線路和發(fā)車時(shí)刻的方法。 一,、兩種爬取方法概述 (一)html頁面爬取 1,、 為了收集全國地鐵線路的發(fā)車時(shí)刻信息,剛開始嘗試的方法如下: (1)找到每個(gè)城市的地鐵官網(wǎng),,如“廣州地鐵官方網(wǎng)站” (2)在官網(wǎng)找到首尾班車時(shí)刻表,,廣州的發(fā)車時(shí)刻數(shù)據(jù)在http://cs./ckfw/fwsj/ (3)使用python爬取網(wǎng)頁的表格數(shù)據(jù) 2、實(shí)現(xiàn)細(xì)節(jié) 主要介紹使用python如何爬取html頁面,。爬蟲用到了webdriver 和BeautifulSoup,,以及l(fā)xml解析。 (1) 爬取頁面 # 獲取頁面源碼 def get_html(url): browser = webdriver.PhantomJS(executable_path=r"E:/spider/phantomjs-2.1.1-windows/bin/phantomjs.exe") #使用無界面的phantomjs瀏覽器,,封裝瀏覽器信息 browser.get(url) #發(fā)送請(qǐng)求,,加載網(wǎng)頁 print("### Handling <" + url + ">") return browser.page_source #返回網(wǎng)頁文本 (2) 讀取數(shù)據(jù),用lxml解析 html = get_html(url) #獲取html頁面 bsobj = BeautifulSoup(html, "lxml") #用lxml解析html tbody = bsobj.find("div", {"id":"zoneService"}).find("tbody") #查找到顯示線路信息的表格 (3) 讀取表格的各個(gè)字段,,存入csv文件 (二)高德地圖API數(shù)據(jù)解析 1,、html頁面爬取方法的工作量很大,需要單獨(dú)處理每個(gè)城市的數(shù)據(jù),,并且官網(wǎng)提供的數(shù)據(jù)格式不一,,給數(shù)據(jù)收集帶來了很大的困難。使用百度地圖搜索從A到B的路線,,能看到清晰的地鐵換乘方案,、路線經(jīng)過的站點(diǎn)以及首晚班車時(shí)刻。我猜想百度一定搜集好了我需要的這些數(shù)據(jù),,就開始尋找百度是否提供了這樣的API接口,。在百度搜索之后,我找到了這篇文章:全國地鐵線路信息API(含站點(diǎn)早晚班車時(shí)間,坐標(biāo)等),,從中選擇了“高德地圖API”作為接口,。 1. 處理思路如下: (1)修改該接口的城市id,1100和城市名字beijing, 得到30個(gè)提供站點(diǎn)名字的服務(wù)接口。 http://map.amap.com/service/subway_1469083453978&srhdata=1100_drw_beijing.json (2)修改該接口的城市id,1100和城市名字beijing, 得到提供站點(diǎn)發(fā)車時(shí)刻的服務(wù)接口,。 http://map.amap.com/service/subway?_1469083453980&srhdata=1100_info_beijing.json (3)關(guān)聯(lián)站點(diǎn)名字和站點(diǎn)發(fā)車時(shí)刻,,得到完整的線路+站點(diǎn)名+首晚發(fā)車時(shí)刻 的數(shù)據(jù) 2、實(shí)現(xiàn)細(xì)節(jié) 介紹如何解析高德API接口的數(shù)據(jù)+如何實(shí)現(xiàn)兩個(gè)表的連接,。 (1)urllib 是一個(gè)工具包,,包含用于處理 Url 的幾個(gè)模塊。urllib.request 用于打開和讀寫url. html = urllib.request.urlopen(url) hjson = json.loads(html.read().decode("utf-8")) (2) API返回的json格式說明 根據(jù)返回的json數(shù)據(jù),,把地鐵線名稱,、地鐵線id,、站點(diǎn)名稱、站點(diǎn)id以及其他信息存入stations.csv文件,,把地鐵線id,、站點(diǎn)id、收尾班車時(shí)刻存入time.csv文件,。 (3) 表關(guān)聯(lián),。讀取stations.csv,把stationId作為key,,stationName作為value存入map,,接著讀取time.csv,根據(jù)map.get(key)方法,,得到id對(duì)應(yīng)的名字,。然后把line, stationId, stationName, firstTime, endTime, firstTime2, endTime2字段寫入新的csv文件。最后的結(jié)果如下: 文章知識(shí)點(diǎn)與官方知識(shí)檔案匹配,,可進(jìn)一步學(xué)習(xí)相關(guān)知識(shí) Python入門技能樹網(wǎng)絡(luò)爬蟲動(dòng)態(tài)渲染頁面爬取38206 人正在系統(tǒng)學(xué)習(xí)中 ———————————————— 版權(quán)聲明:本文為CSDN博主「jiang_qun」的原創(chuàng)文章,,遵循CC 4.0 BY-SA版權(quán)協(xié)議,轉(zhuǎn)載請(qǐng)附上原文出處鏈接及本聲明,。 原文鏈接:https://blog.csdn.net/jiang_qun/article/details/79431282 |
|