全国地铁数据爬取-python

介绍爬取全国地铁站点、地铁线路和发车时刻的方法。

一、两种爬取方法概述

 (一)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格式说明

全国地铁数据爬取-python_第1张图片

根据返回的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文件。最后的结果如下:

全国地铁数据爬取-python_第2张图片

你可能感兴趣的:(全国地铁数据爬取-python)