访问百度地图API需要一个信令(AK),打开百度地图开放平台,点击右上角“控制台”,即进入了百度地图的开发界面。 中间填写相关信息申请。
选择“创建应用”-应用类型勾选“浏览器端”–勾选所用到的服务(一般全选即可),此时就创建好了应用账号,得到“AK”。
打开百度地图API的POI模块,网址:http://lbsyun.baidu.com/index.php?title=webapi/guide/webservice-placeapi,这个页面详细介绍了Place API的请求参数及返回数据的情况。
我们已经有经纬度坐标,选取周边检索模式获取数据。还有矩形检索和城市检索等,可根据自己的情况选取。
参考前文《利用Python爬取安居客中小区数据,并将结果导入msql数据库》中已经获得的小区数据,将根据小区数据的经纬度来获取周边配套。
直接上脚本
# -*- 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)
1、最好多申请几个ak,如果百度是对调用次数做了限制的;
2、已经设置了打印i值,中间如有报错,请自行修改for i in range(len(data)) 里的代码如(for i in range(233,len(data)) ),不需要重新运行;
3、数据库表根据自己的设置修改,不要盲目照抄数据库表名密码等。
下面贴出数据库里的数据结果