爬取全国地铁站点、地铁线路和发车时刻的方法。
一、两种爬取方法概述
(一)html页面爬取
1、 为了收集全国地铁线路的发车时刻信息,刚开始尝试的方法如下:
(1)找到每个城市的地铁官网,如“广州地铁官方网站”
(2)在官网找到首尾班车时刻表,广州的发车时刻数据在http://cs.gzmtr.com/ckfw/fwsj/
(3)使用python爬取网页的表格数据
2、实现细节
主要介绍使用python如何爬取html页面。爬虫用到了webdriver 和BeautifulSoup,以及lxml解析。
(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) #发送请求,加载网页
print("### Handling <" + url + ">")
return browser.page_source #返回网页文本
(2) 读取数据,用lxml解析
html = get_html(url) #获取html页面
bsobj = BeautifulSoup(html, "lxml") #用lxml解析html
tbody = bsobj.find("div", {"id":"zoneService"}).find("tbody") #查找到显示线路信息的表格
(3) 读取表格的各个字段,存入csv文件
(二)高德地图API数据解析
1、html页面爬取方法的工作量很大,需要单独处理每个城市的数据,并且官网提供的数据格式不一,给数据收集带来了很大的困难。使用百度地图搜索从A到B的路线,能看到清晰的地铁换乘方案、路线经过的站点以及首晚班车时刻。我猜想百度一定搜集好了我需要的这些数据,就开始寻找百度是否提供了这样的API接口。在百度搜索之后,我找到了这篇文章:全国地铁线路信息API(含站点早晚班车时间,坐标等),从中选择了“高德地图API”作为接口。
1. 处理思路如下:
(1)修改该接口的城市id,1100和城市名字beijing, 得到30个提供站点名字的服务接口。
http://map.amap.com/service/subway_1469083453978&srhdata=1100_drw_beijing.json
(2)修改该接口的城市id,1100和城市名字beijing, 得到提供站点发车时刻的服务接口。
http://map.amap.com/service/subway?_1469083453980&srhdata=1100_info_beijing.json
(3)关联站点名字和站点发车时刻,得到完整的线路+站点名+首晚发车时刻 的数据
2、实现细节
介绍如何解析高德API接口的数据+如何实现两个表的连接。
(1)urllib 是一个工具包,包含用于处理 Url 的几个模块。urllib.request 用于打开和读写url.
html = urllib.request.urlopen(url)
hjson = json.loads(html.read().decode("utf-8"))
(2) API返回的json格式说明
根据返回的json数据,把地铁线名称、地铁线id、站点名称、站点id以及其他信息存入stations.csv文件,把地铁线id、站点id、收尾班车时刻存入time.csv文件。
(3) 表关联。读取stations.csv,把stationId作为key,stationName作为value存入map,接着读取time.csv,根据map.get(key)方法,得到id对应的名字。然后把line, stationId, stationName, firstTime, endTime, firstTime2, endTime2字段写入新的csv文件。最后的结果如下: