Python调用百度地图API批量获取小区的周报配套信息,并存入mysql数据库

一、了解百度地图API

1.1 申请百度AK

访问百度地图API需要一个信令(AK),打开百度地图开放平台,点击右上角“控制台”,即进入了百度地图的开发界面。 中间填写相关信息申请。
选择“创建应用”-应用类型勾选“浏览器端”–勾选所用到的服务(一般全选即可),此时就创建好了应用账号,得到“AK”。

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

打开百度地图API的POI模块,网址:http://lbsyun.baidu.com/index.php?title=webapi/guide/webservice-placeapi,这个页面详细介绍了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、数据库表根据自己的设置修改,不要盲目照抄数据库表名密码等。
下面贴出数据库里的数据结果
Python调用百度地图API批量获取小区的周报配套信息,并存入mysql数据库_第1张图片

你可能感兴趣的:(爬虫)