本篇博文也博主原创,转载请注明。

  城市公交、地铁数量体现了市之公共交通,研究该数量可以挖城市的交通结构、路网规划、公交选址等。但是,这类数据往往掌握在一定部门中,很不便取得。互联网地图上生大气之音讯,包含公交、地铁等数据,解析其数量反馈方式,可以经Python爬虫采集。闲言少叙,接下去将详细介绍如何采取Python爬虫爬取城市公交、地铁站点和数量。

  首先,爬取研究都的具有公交与地铁线名称,即XX路,地铁X号线。可以通过图吧公交、公交网、8684、本地宝等网站取得,该类网站提供了按数字和字母划分类别的公交线路名称。Python写个简单的爬虫就能够收集,可参照WenWu_Both的文章,博主详细介绍了哪使python爬取8684齐有城市具备的公交站点数据。该博主采集了站点详细的音,包括,但是缺少了公交站点的坐标、公交线路坐标数据。这就是叫人抓捕狂了,没有空间坐标怎么抱图,怎么分析,所以,本文重点介绍的凡站点坐标、线路的得。

json 1

  以图吧公交吧例,点击某平等公交后,出现该路公交的事无巨细站点信息以及地图信息。博主顿感兴奋,觉得就快要成功了,各种抓包,发现并无克分析。可能博主技术所界定,如发大神能从中抓及站点以及路线的坐标信息,请不宁赐教。这TM就深受丁到底了哟,到嘴的肥肉吃不了。

json 2

  天无绝人之路,尝试寻找找某地图的API,发现可调用,通过分析,能够找到该数量的后台地址。熟悉前端的可试行,博主前端也尽管光见面只hello
world,不孝敬丑了。这是一样种思路,实践证明是得的。

json 3

  地图API可以,那么通过地图抓包吗?打开某贪图主页,直接输入某市公交名称,通过抓包,成功找到站点及线路信息。具体抓包信息一旦下图所显示,busline_list中详尽列有了站点以及路线的信,其中起少久,是同一遍公交不同倾向的多寡,略有差距,需留意。找到入口过后,接下去爬虫就假设大显身手了。

json 4

  主要爬取代码如下,其实呢颇简短,主函数如下。首先需要构建传入的参数,主要的牢笼路线名称,城市编码,地理范围,缩放尺度。地理范围可透过坐标拾取器获取,参数经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 + paramMerge
15         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 stationSet
18 
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

  爬虫采集原始数据如下:

json 5

  以下是某平等漫漫公交站点和线的处理后底数据展示。由于不同的地图商采用不同的坐标系,会生不同档次之不是,需要坐标纠偏。下同样步,博主将详细介绍如何批量以这些站点和坐标进行坐标纠正及矢量化。

 json 6

 

相关文章

网站地图xml地图