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当然你也可以存到数据库中

四、应用

改天更新。。。。

猜你喜欢

转载自blog.csdn.net/weixin_40184249/article/details/81489131