baidumap api MySQL_Python调用百度地图API批量获取小区的周报配套信息,并存入mysql数据库的详细操作讲解…

  • Post author:
  • Post category:mysql


一、了解百度地图API

1.1 申请百度AK

访问百度地图API需要一个信令(AK),打开百度地图开放平台,点击右上角“控制台”,即进入了百度地图的开发界面。 中间填写相关信息申请。

选择“创建应用”-应用类型勾选“浏览器端”–勾选所用到的服务(一般全选即可),此时就创建好了应用账号,得到“AK”。

1.2 阅读百度地图API的POI模块

打开百度地图API的POI模块,这个页面详细介绍了Place API的请求参数及返回数据的情况。

我们已经有经纬度坐标,选取周边检索模式获取数据。还有矩形检索和城市检索等,可根据自己的情况选取。

二、python调用百度地图接口

2.1 数据准备

参考前文《利用Python爬取安居客中小区数据,并将结果导入msql数据库》中已经获得的小区数据,将根据小区数据的经纬度来获取周边配套。

2.2 python脚本

直接上脚本

# -*- coding: utf-8 -*-

“””

Created on Wed May 02 17:19:32 2018

@author: Administrator

“””

from bs4 import BeautifulSoup

from collections import Counter

from time import sleep

import MySQLdb

import requests

import time

import math

import re

import sys

reload(sys)

sys.setdefaultencoding(‘utf-8’)

def get_support_info(item,xiaoqu_id,support_class,support_type):

xiaoqu_id=xiaoqu_id

support_class=support_class

support_type=support_type

support_name=item.find(‘name’).text

support_lat=item.find(‘lat’).text

support_lng=item.find(‘lng’).text

address=item.find(‘address’).text

uid=item.find(‘uid’).text

distance=item.find(‘distance’).text

try :

tag=item.find(‘tag’).text

except (ZeroDivisionError,Exception) as e:

tag=u’暂无数据’

print e

pass

try :

tel=item.find(‘telephone’).text

except (ZeroDivisionError,Exception) as e:

tel=u’暂无数据’

print e

pass

#创建时间

created_date=time.strftime(“%Y-%m-%d %H:%M:%S”, time.localtime())

return (xiaoqu_id,support_class,support_type,support_name,support_lat,support_lng,address,

uid,distance,tag,tel,created_date)

def to_sql(data):

conn=MySQLdb.connect(“localhost”,”root”,”tiger”,”test”,charset=”utf8″ )

cursor = conn.cursor()

sql_create_database = ‘create database if not exists test’

cursor.execute(sql_create_database)

# try :

# cursor.select_db(‘test’)

# except (ZeroDivisionError,Exception) as e:

# print e

#cursor.execute(“set names gb2312”)

cursor.execute(”’create table if not exists test.xiaoqu_support(xiaoqu_id bigint(80),

support_class varchar(50),

support_type varchar(50),

support_name varchar(50),

support_lat varchar(20),

support_lng varchar(20),

address varchar(200),

uid varchar(50),

distance bigint,

tag varchar(30),

tel varchar(30),

created_date DATETIME,

primary key (xiaoqu_id,uid));”’)

cursor.executemany(‘insert ignore into test.xiaoqu_support values(%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s);’,data)

conn.commit()

cursor.close()

conn.close()

#

conn=MySQLdb.connect(“localhost”,”root”,”tiger”,”test”,charset=”utf8″ )

cursor = conn.cursor()

sql = ‘select * from xiaoqu’

cursor.execute(sql)

#获取查询结果

data= cursor.fetchall()

infos=[]

for i in range(len(data)) :

xiaoqu_id=data[i][0]

#一级分类

support_class=u’旅游景点’

#其他配套自己根据需求获取,如’交通’,’教育’,’医疗’,’银行’,’购物’,’影剧院’,’旅游景点’等

#二级分类

support_type=[‘旅游景点,公园’,’旅游景点,植物园’,’旅游景点,动物园’,’旅游景点,博物馆’]

ak=[‘***’,’***’] #自己的ak,最好多申请几个

for j in range(len(support_type)) :

url = ‘http://api.map.baidu.com/place/v2/search?query=’+support_class+’&tag=’+support_type[j]+’&location=’+data[i][4]+’,’+data[i][5]+’&radius=3000&output=xml&ak=’+ak[0]+’&scope=2&page_size=20′

soup = BeautifulSoup(requests.get(url).text,”lxml”)

if soup.find(‘status’).text==200 :

url = ‘http://api.map.baidu.com/place/v2/search?query=’+support_class+’&tag=’+support_type[j]+’&location=’+data[i][4]+’,’+data[i][5]+’&radius=3000&output=xml&ak=’+ak[1]+’&scope=2&page_size=20′

soup = BeautifulSoup(requests.get(url).text,”lxml”)

totals=soup.find(‘total’).text

if totals==0 :

continue

page_nums=range(int(math.ceil(float(totals)/20)))

for page_num in page_nums :

url=url+’&page_num=’+str(page_num)

soup = BeautifulSoup(requests.get(url).text,”lxml”)

items=soup.find_all(‘result’)

for item in items :

try:

print “Getting information of the”,i,j,”-th infos.”

infos.append(get_support_info(item,xiaoqu_id,support_class,support_type[j]))

#sleep(0.5)

except Exception,e:

print e

print to_sql(infos)

2.3 注意事项

1、最好多申请几个ak,如果百度是对调用次数做了限制的;

2、已经设置了打印i值,中间如有报错,请自行修改for i in range(len(data)) 里的代码如(for i in range(233,len(data)) ),不需要重新运行;

3、数据库表根据自己的设置修改,不要盲目照抄数据库表名密码等。

下面贴出数据库里的数据结果

dc5dba0c756e1b41f2b9b4d23c2108f2.png



版权声明:本文为weixin_36288711原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。