python结合百度api进行地理编码和爬取POI点
最近一直比较忙老师让写一个时空大数据的申请项目书,我这脑子累成狗也不成啊,唉硬着头皮要上,今天偷点空闲一直想爬取百度地图的数据,一直也没做,今天主要爬取了POI点(北京四环以内的吃饭的地方)和利用python结合百度api进行地理编码的小程序,借鉴网上的大神写的,我python本身还不是够,做一些简单的小爬虫可以,仍然需要努力。关于百度api的ak申请打开下面的网址:http://lbsyun.baidu.com/index.php?title=webapi/guide/webservice-placeapi开始来代码
放两张图:
一、关于百度api的一些问题
1、应用类别要选择浏览器
2、Referer白名单:这里面写成通配符即可就是(*)单独一个*
二、调用百度地理编码的全部代码
import pandas as pd
import json
import csv
from urllib.request import urlopen, quote
import requests
#获取城市的地理编码
def getlnglat(address):
url = 'http://api.map.baidu.com/geocoder/v2/'
output = 'json'
ak = '你申请的AK'
add = quote(address) #由于本文城市变量为中文,为防止乱码,先用quote进行编码
uri = url + '?' + 'address=' + add + '&output=' + output + '&ak=' + ak
req = urlopen(uri)
res = req.read().decode() #将其他编码的字符串解码成unicode temp = json.loads(res) #对json数据进行解析 return temp
#print(req)
temp = json.loads(res) #对json数据进行解析
print(temp)
return temp
file = open(r'C:\Users\Administrator\Desktop\高校\point.json','w') #建立json数据文件
with open(r'C:\Users\Administrator\Desktop\高校\university.csv', 'r',encoding='UTF-8') as csvfile: #打开csv
reader = csv.reader(csvfile)
for line in reader: #读取csv里的数据 # 忽略第一行
if reader.line_num == 1: #由于第一行为变量名称,故忽略掉
continue # line是个list,取得所有需要的值
b = line[1].strip() #将第一列city读取出来并清除不需要字符
c= line[4].strip()#将第二列price读取出来并清除不需要字符
lng = getlnglat(b)['result']['location']['lng'] #采用构造的函数来获取经度
lat = getlnglat(b)['result']['location']['lat'] #获取纬度
str_temp = '{"count":' + str(b) +',"lat":' + str(lat) + ',"lng":' + str(lng) + ',"count":' + str(c) +'},'
print(str_temp) #也可以通过打印出来,把数据copy到百度热力地图api的相应位置上
file.write(str_temp) #写入文档
file.close() #保存
这个可以做一些热力图,聚合效果看你需要保存成一定的数据
三、爬取POI点数据
# -*- coding: utf-8 -*-
# Python 2.7
# 提取城市的POI点信息并将其保存至MongoDB数据库
import urllib.request as urllib2
import pandas as pd
import json
from urllib.request import urlopen, quote
left_bottom = [116.282387,39.835862]; # 设置区域左下角坐标(百度坐标系)
right_top = [116.497405,39.996569]; # 设置区域右上角坐标(百度坐标系)
part_n = 2; # 设置区域网格(2*2)
url0 = 'http://api.map.baidu.com/place/v2/search?';
x_item = (right_top[0]-left_bottom[0])/part_n;
y_item = (right_top[1]-left_bottom[1])/part_n;
query = quote('饭店'); #搜索关键词设置,转换中文
ak = '你申请的AK'#百度地图api信令
n = 0; # 切片计数器
file = open(r'C:\Users\Administrator\Desktop\高校\point.json','w') #建立json数据文件
for i in range(part_n):
for j in range(part_n):
left_bottom_part = [left_bottom[0]+i*x_item,left_bottom[1]+j*y_item]; # 切片的左下角坐标
right_top_part = [right_top[0]+i*x_item,right_top[1]+j*y_item]; # 切片的右上角坐标
for k in range(20):
url = url0 + 'query=' + query + '&page_size=20&page_num=' + str(k) + '&scope=1&bounds=' + str(left_bottom_part[1]) + ',' + str(left_bottom_part[0]) + ','+str(right_top_part[1]) + ',' + str(right_top_part[0]) + '&output=json&ak=' + ak;
data = urllib2.urlopen(url);
hjson = json.loads(data.read());
if hjson['message'] == 'ok':
results = hjson['results'];
data=list(map(lambda m:(results[m]["name"],results[m]["address"],results[m]["location"]["lat"],results[m]["location"]["lng"]),range(len(results))))
data=pd.DataFrame(data);
data.to_csv('C:\\Users\\Administrator\\Desktop\\高校\\3.csv',header=False,index=False,mode='a+')
print(data)
n += 1;
print ('第'+str(n)+'个切片入库成功')
这个我存成csv当然你也可以存到数据库中
四、应用
改天更新。。。。