我的第一个Pyhton程序:通过百度地图API自动查询路况

  1. 说明
  2. 功能
  3. 准备
  4. Python程序
  5. 解释
    1. 导入依赖的库
    2. 定义两个函数
    3. 主要功能实现
    4. 定时与写入文本
  6. 存在的问题
  7. 效果
  8. 题外话

说明

——人生苦短,我学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+'&center='+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

💰

×

Help us with donation

github