代码:
# -*- coding: utf-8 -*-
"""
Created on Thu Sep 5 23:27:32 2019
@author: 16534
"""
import requests
import pandas as pd
import json
import time
#初始API的URL
url="https://restapi.amap.com/v3/traffic/status/rectangle?key=3112295ad0404c2da3b4dca3a5465b01&extensions=all&rectangle="
#设定整个网格左下角坐标的经纬度值
#baselng=108.772376
baselng=121.2
#baselat=34.177000
baselat=31.1
#设定每个网格单元的经纬度宽
widthlng=0.05
widthlat=0.04
#用于储存数据
x=[]
#用于标识交通态势线段
num=0
#爬取过程可能会出错中断,因此增加异常处理
try:
#循环每个网格进行数据爬取,在这里构建了3X3网格
for i in range(0,5):
#设定网格单元的左下与右上坐标的纬度值
#在这里对数据进行处理,使之保留6位小数(不保留可能会莫名其妙出错)
startlat=round(baselat+i*widthlat,6)
endlat=round(startlat+widthlat,6)
for j in range(0,5):
#设定网格单元的左下与右上坐标的经度值
startlng=round(baselng+j*widthlng,6)
endlng=round(startlng+widthlng,6)
#设置API的URL并进行输出测试
locStr=str(startlng)+","+str(startlat)+";"+str(endlng)+","+str(endlat)
thisUrl=url+locStr
print(thisUrl)
#爬取数据
data=requests.get(thisUrl)
s=data.json()
a=s["trafficinfo"]["roads"]
#注意,提取数值需要使用XXX.get()的方式来实现,如a[k].get('speed')
#若使用a[k]['speed']来提取,或会导致KeyError错误
for k in range(0,len(a)):
s2=a[k]["polyline"]
s3=s2.split(";")
for l in range(0,len(s3)):
s4=s3[l].split(",")
x.append([a[k].get('name'),a[k].get('status'),a[k].get('speed'),num,float(s4[0]),float(s4[1])])
num=num+1
#若爬取网格较多,可使用time.sleep(秒数)来避免高德的单秒API调用次数的限制
except Exception as e:
pass
#将数据结构化存储至规定目录的CSV文件中
c = pd.DataFrame(x)
#c.to_csv('E:/maptrafficstate/BigRoads.csv',encoding='utf-8-sig')
c.to_csv('E:/Anaconda/webservice-2019-06-01/BigRoads.csv',encoding='utf-8-sig')