说明
——人生苦短,我学Python。
说学Python说了很久,书买了很多,网上资源也下载和保存了很多,然后依然没有开始动手写过一句python。终于,今天写了第一段我的Python代码。
本文面向Python小白,大神请无视。
推荐使用Spyder
功能
根据百度地图Web API,查询指定地点或区域的路况信息,并记录在txt文件中。根据一天中不同的时段,分别间隔2min、10min和30min自动查询。
准备
1.申请百度地图开发者账号,获得百度地图Web API的AccessKey。
2.准备Python环境
有句名言,学Python的人,一半都被Python的环境劝退了。这是真的,太复杂了。经过不断的摸索和报错,我建议使用Spyder作为Python的集成开发环境(IDE),Spyder是一款科学python开发环境,极度适合习惯Matlab的用户。通过Anaconda Navigator主页中打开。
Python程序
import requests
import sys
import re
from datetime import datetime
import time
def getAK():
f = open('AK.txt','r')
AccessKey = f.read()
f.close()
return AccessKey
def getcenter(address):
AK = getAK()
#url = 'http://api.map.baidu.com/geocoding/v3/?address=烟台市玲珑路与金城路交叉口&output=json&ak='+AK+'&callback=showLocation'
url = 'http://api.map.baidu.com/geocoding/v3/?address='+address+'&output=json&ak='+AK+'&callback=showLocation'
response = requests.get(url)
datas = response.text
numAll = re.findall('\d+',datas)
lng = numAll[1]
lng2 = numAll[2]
lat = numAll[3]
lat2 = numAll[4]
center = str(lat)+'.'+str(lat2)+','+str(lng)+'.'+str(lng2)
return center
AK = getAK()
modeltpye = 1
if modeltpye == 1:
#model 1 center location of given longitude and latitude
address = '烟台市轸大路与澳柯玛大街交叉口'
#address = '烟台市红旗中路与上夼西路'
Center = getcenter(address)
url = 'http://api.map.baidu.com/traffic/v1/around?ak='+AK+'¢er='+Center+'&radius=500&coord_type_input=gcj02&coord_type_output=gcj02'
elif modeltpye == 2:
#model 2 given road and city
roadname = '红旗中路'
city = '烟台市'
url = 'http://api.map.baidu.com/traffic/v1/road?road_name='+roadname+'&city='+city+'&ak='+AK
datatime = datetime.now().strftime("%Y-%m-%d %H_%M_%S")
f = open('data_'+datatime+'.txt','w')
try:
while True:
datatime = datetime.now().strftime("%Y-%m-%d %H:%M:%S")
datatime_H = int(datetime.now().strftime('%H'))
busytime = [6,7,8,10,11,12,13,16,17,18]
cleartime = [0,1,2,3,4,5,23]
if datatime_H in busytime:
timestep = 60*2
elif datatime_H in cleartime:
timestep = 60*30
else:
timestep = 60*10
f.write(datatime)
f.write('\n')
response = requests.get(url)
datas = response.text
count = datas.split("\r\n")
f.write(datas)
f.write('\n')
f.flush()
print(datatime)
time.sleep(timestep)
except KeyboardInterrupt:
print(datatime)
f.close()
解释
导入依赖的库
import requests
import sys
import re
from datetime import datetime
import time
定义两个函数
函数 getAK(),用来获取事先保存在同一目录下的AK.txt文件,文本中实现写入了你的百度AccessKey。通过这种方式让AccessKey适当隐藏一下。
函数 getcenter() 通过给定的地点,从百度API中查询对应的经纬度,默认是BD09:为百度坐标系。
主要功能实现
通过request模块,来实现对链接的访问,以及读取返回的信息。url的构造参考百度Web API的说明。
url = 'http://api.map.baidu.com/geocoding/v3/?address='+address+'&output=json&ak='+AK+'&callback=showLocation'
response = requests.get(url)
datas = response.text
定时与写入文本
通过time.sleep控制程序查询时间间隔,使用try和except循环和中断。
try:
while True:
datatime = datetime.now().strftime("%Y-%m-%d %H:%M:%S")
...
time.sleep(timestep)
except KeyboardInterrupt:
print(datatime)
通过f.open(), f.write()读写文本。并且通过每次写入后添加f.flush()来将缓存及时写入磁盘,这样就可以在运行过程中随时写入和保存,方便查看结果。
存在的问题
由于区分了忙碌时间和空闲时间,忙碌时间查询间隔为2分钟一次,空闲时段查询时间为30分钟一次,其余时间查询间隔为10分钟。
使用time.sleep()来是循环等待对应时间,通过Crt+C来中断循环。但是发现程序进去time.sleep()之后就无法中断,必须等待sleep时间结束,才会中断进程。例如,空闲时段中,按下Ctrl+C无法立刻结束进程,必须等待当前time.sleep(60*30)走完才可以结束。
效果
丢到服务器里面自动跑。
题外话
Python的模式匹配很好用啊,但是正则表达式还没学会。。另外能不能得到百度地图的实时用户数量分布?这样及时不堵车,也能看到车流量。
转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 tinywoody@126.com