比如,我们想要采集医院的数据信息,主要包括经纬度坐标和电话等信息。
首先,我们需要注册百度开发账号,然后创建应用,会得到ak码,在访问数据时需要这个参数。
然后,需要使用requests包,通过request = requests.get(url,params=params) 可以请求到数据
最后,解析请求到的json数据并保存。
json数据格式如下:
{
"status":0,
"message":"ok",
"total":228,
"results":[
{
"name":"辽中县新华医院",
"location":{
"lat":41.518185,
"lng":122.743932
},
"address":"北一路57号",
"street_id":"4a25f3d22e0206b428201a39",
"telephone":"(024)62308120",
"detail":1,
"uid":"4a25f3d22e0206b428201a39"
}
……
}
完整的代码如下:
import requests
import json
import pandas as pd
def request_hospital_data():
ak="xxxxxxxxxxx" # 换成自己的 AK,需要申请
url = "http://api.map.baidu.com/place/v2/search?query=医疗&page_size=20&scope=1®ion=辽中&output=json&ak="+ak
params = {'page_num':0} # 请求参数,页码
request = requests.get(url,params=params) # 请求数据
total = json.loads(request.text)['total'] # 数据的总条数
# print(total)
total_page_num = (total+19) // 20 # 每个页面大小是20,计算总页码
items = [] # 存放所有的记录,每一条记录是一个元素
for i in range(total_page_num):
params['page_num'] = i
request = requests.get(url,params=params)
for item in json.loads(request.text)['results']:
name = item['name']
lat = item['location']['lat']
lng = item['location']['lng']
address = item.get('address', '')
street_id = item.get('street_id', '')
telephone = item.get('telephone', '')
detail = item.get('detail', '')
uid = item.get('uid', '')
# print(name, lat, lng, address, street_id, telephone, detail, uid)
new_item = (name, lat, lng, address, street_id, telephone, detail, uid)
items.append(new_item)
# 使用pandas的DataFrame对象保存二维数组
df = pd.DataFrame(items, columns=['name', 'lat', 'lng', 'adderss', 'street_id', 'telephone', 'detail', 'uid'])
df.to_csv('liaozhong_hospital_info.csv', header=True, index=False)
request_hospital_data()
此外,我们可以将url中的query参数换其它兴趣点类别,就能获得相应的数据。
比如,query=住宅区,这样可以获取到住宅区的数据。
它的地址是 http://lbsyun.baidu.com/index.php?title=lbscloud/poitags