研究内容
探究惠州市特定线路的公交停靠信息以及步行信息,通过对数据分析来尝试改善用户体验。
爬取公交线路python代码
写在开头
本文数据的获取是基于百度地图的,进行试验之前需要先去百度官网获取自己的ak
如果要做简单实验的可以私我,我自己有申请了一个,不过申请很简单的,大家自行去试试吧
import pandas as pd
import requests
# 服务地址
host = "https://api.map.baidu.com"
# 接口地址
uri = "/directionlite/v1/transit"
# 此处填写你在控制台-应用管理-创建应用后获取的AK
ak = "请输入key"
地址的经纬度可以去百度拾取坐标网站查询
# 填入起始点地名和经纬度
# 以下数据可以任一更改但是要对应
origins_names = ['港惠新天地东','隆生金山湖中心','华贸天地']
origins = ["23.074823,114.424429",'23.061682,114.450078','23.109777,114.421354']
df = pd.DataFrame()
all_routes_walk=[]
all_routes_longitude=[]
all_routes_latitude=[]
all_bus_name = []
all_routes_duration = []
all_traffic_condition = []
start = []
end = []
最关键的代码!开始抓取
# encoding:utf-8
# 根据您选择的AK以为您生成调用代码
# 检测到您当前的AK设置了IP白名单校验
# 您的IP白名单中的IP非公网IP,请设置为公网IP,否则将请求失败
# 请在IP地址为0.0.0.0/0 外网IP的计算发起请求,否则将请求失败
for origin in range(len(origins)):
params = {
"origin": origins[origin],
"destination": "23.044856,114.446648",
"ak": ak,
}
response = requests.get(url = host + uri, params = params)
if response:
print(origins_names[origin])
a = response.json()
bus_info = a['result']['routes']
起点 = origins_names[origin]
终点 = '印象城'
for route in range(len(bus_info)):
total_5_length = []
duration = a['result']['routes'][route]['duration']
traffic_condition = a['result']['routes'][route]['traffic_condition']
for i in a['result']['routes'][route]['steps']:
if i[0]['type'] == 5:
distance = i[0]['distance']
total_5_length.append(distance)
# print('步行总长度:',sum(total_5_length))
if i[0]['type'] == 3:
print(i[0]['duration'])
name = i[0]['vehicle']['name']
# print(name)
paths = i[0]['path']
longitude= []
latitude = []
for p in paths.split(';'):
xy = p.split(',')
longitude.append(float(xy[0]))
latitude.append(float(xy[1]))
start.append(起点)
end.append(终点)
walk_len = sum(total_5_length)
all_bus_name.append(name)
all_routes_walk.append(walk_len)
all_routes_longitude.append(longitude)
all_routes_latitude.append(latitude)
all_routes_duration.append(duration)
all_traffic_condition.append(traffic_condition)
对爬取后的数据进行存储
df['起点']=start
df['终点'] = end
df['公交路线']=all_bus_name
df['步行总长']=all_routes_walk
df['各路公交耗时时间']=all_routes_duration
df['经过路径经度']=all_routes_longitude
df['经过路径纬度']=all_routes_latitude
df['公交线路拥堵情况']=all_traffic_condition
df.to_csv('印象城公交线路情况.csv',index=False)
爬取结果展示
最后,如果报错了可以看看是否是因为经纬度前后放置位置的问题!
爬取交通实时情况python代码
#导入模块
import pandas as pd
import requests
import os
import time #爬取实时交通数据记录时间
import datetime
from time import strftime,asctime,ctime,gmtime,mktime
import json
import csv
def fers(road_name): #road_name为你要爬取的交通路段名,我这里是'演达大道','三环南路','麦地路','南岸路','四环南路','金山大道','东湖西路','云山西路','长寿路','环城西路','南坛东路','下埔路'
city = '惠州市'
ak = '请填入key' #你自己的ak地址
url = 'http://api.map.baidu.com/traffic/v1/road?road_name={}&city={}&ak={}'.format(str(road_name),city,ak) #爬过数据的人应该都知道这是什么东西吧,哈哈
re=requests.get(url) #返回的原数据
decodejson=json.loads(re.text)
road_traffic_s=decodejson['road_traffic'][0] #获取交通路段拥堵信息 ,这个地方不懂的可以先打印一下看下数据结构
v=road_traffic_s['congestion_sections']
curr_time=datetime.datetime.now()
time_str = datetime.datetime.strftime(curr_time,'%Y-%m-%d %H:%M:%S') #获取当前爬取的时间段
ty=pd.DataFrame(v)
ty['名称']=pd.DataFrame([road_traffic_s['road_name']]*len(v)) #路段名称
ty['时间']=pd.DataFrame([time_str]*len(v)) #记录此刻交通拥堵时间
return ty
def es(road_name):
city = '惠州市'
ak = '请填入key'
url = 'http://api.map.baidu.com/traffic/v1/road?road_name={}&city={}&ak={}'.format(str(road_name),city,ak)
re=requests.get(url) #返回的原数据
res=re.json() #json处理后的数据
decodejson = json.loads(re.text)
description=decodejson['description'] #路段的总体描述性信息
evaluation=decodejson['evaluation'] #交通总体的评估状况
road_traffic=decodejson['road_traffic'][0]
road_data=pd.DataFrame([evaluation])
road_data['road_name']=road_traffic['road_name'] #交通路段名称
curr_time=datetime.datetime.now()
time_str = datetime.datetime.strftime(curr_time,'%Y-%m-%d %H:%M:%S')
road_data['时间']=pd.DataFrame([time_str]) #交通路况时间 #交通路段时间
road_data['路况描述']=description
if not os.path.exists('result.csv'):
road_data.to_csv('result.csv',encoding='gbk',mode='a',index=False,index_label=False) #保存数据
else:
road_data.to_csv('result.csv', encoding='gbk', mode='a', index=False, index_label=False,header=False)
爬取主程序
#设置休眠时间,每5分钟爬取一次实时交通数据
while True:
if __name__ == '__main__':
road_name = ['演达大道','三环南路','麦地路','南岸路','四环南路','金山大道','东湖西路','云山西路','长寿路','环城西路','南坛东路','下埔路']
for i in road_name:
city = '惠州市'
ak = '请填入key'
url = 'http://api.map.baidu.com/traffic/v1/road?road_name={}&city={}&ak={}'.format(str(i),city,ak)
re=requests.get(url) #返回的原数据
decodejson = json.loads(re.text)
road_traffics=decodejson['road_traffic'] #获取交通路段拥堵信息
if len(road_traffics[0])>=2: #对拥堵路段进行详细数据提取,为什么这样写呢,就是因为拥堵时数据长度为2,非拥堵时段长度为1,这真是我观察了好久,不断报错找到的规律啊,我太难了!!!苦啊
get_page(i) #拥堵时段爬取拥堵时段的详细数据,保存一个文件
es(i) #保存描述性数据
else:
es(i) #非拥堵时段,我们只需保存整体的描述性数据就可以啦
time.sleep(300)
爬取结果展示
result.csv
有一些细节需要大家自行去摸索,加油吧!
补充
数据转换
本文对实时交通数据进行了频次统计,并通过纬度和米的转换,把数据变成了纬度以道路中点的经纬度为均值的正太分布经纬度数据,从而为下一篇的密度热力图做数据准备。大家也可以看看有没有别的思路!