使用百度地图API获取全国商户信息

百度地图API

百度地图有丰富的API,一些API免费查询次数高达每天10万次。其中Place API提供城市内关键字搜索,返回结果中包含商家名称、地址、电话、经纬度坐标。这样,想获取相关行业在全国范围内的公司信息,只需遍历所有城市搜索关键字,将返回结果整理就好了。

Place API 地址:链接

使用Python调用API

根据百度的介绍,首先申请应用,获取密钥ak。然后将密钥和参数加入URL中,进行访问即可。

Python强大的网络模块让这一切变得相当简单。代码如下:

def getData(region,page_num):
  url = "http://api.map.baidu.com/place/v2/search?"
  param = {}
  param['ak'] = "E4805d16520de693a3fe707cdc962045"
  param['output'] = 'json'
  param['page_num'] = page_num
  param['region'] = region
  param['page_size'] = 3
  param['scope'] =  1
  param['query'] = '电影'

  url += urllib.urlencode(param)

  try:
      request = urllib2.Request(url)
      response = urllib2.urlopen(request)
      json_content = response.read()
  except Exception as e:
      print e
      return e

  return json_content

返回结果如下:

{
    "status":0,
    "message":"ok",
    "total":1778,
    "results":[
        {
            "name":"北京市东宫电影院",
            "location":{
                "lat":39.931657,
                "lng":116.421903
            },
            "address":"北京市东城区隆福寺街47号",
            "street_id":"2527be1e32db5caa4bfc8d84",
            "telephone":"(010)84028490",
            "uid":"2527be1e32db5caa4bfc8d84"
        },
        {
            "name":"首都电影院(金融街店)",
            "location":{
                "lat":39.921497,
                "lng":116.366936
            },
            "address":"北京市金融大街18号金融街购物中心二期地下1层",
            "street_id":"93df0dc3703e2d32892fb5e5",
            "telephone":"(010)66222046",
            "uid":"93df0dc3703e2d32892fb5e5"
        },
        {
            "name":"北京电影学院",
            "location":{
                "lat":39.977425,
                "lng":116.361319
            },
            "address":"西土城路4号",
            "street_id":"e80aad7984e990c3081cc791",
            "telephone":"(010)82048899,82283300",
            "uid":"e80aad7984e990c3081cc791"
        }
    ]
}
这里将地区设置为“北京”,page_size设置为3,所以仅返回三条,一页最多可显示20条,具体的参数配置可参考百度的文档。 ###遍历全国范围内信息 需要注意的地方是:当给出的搜索地区API无法识别的时候,会返回全国省级行政区列表。当给出省级行政区名时,有的会给出市级行政区列表,有的直接给地标信息。比如地区设置为“湖北”,会返回市级行政区列表,设置为“北京“时,则会直接返回地标信息。而且结果中没有明确的标志,也无法完全知道哪些地区名给列表,哪些给地标,这点有些麻烦。 不过通过判断结果中是否有”location”属性进行递归搜索,就能解决这个问题了。如果给定地区为全国,则能搜索到全国的信息了。 代码如下:
def search(region,num):
  print "%s %d"%(region,num)
  json_content = getData(region,0)
  decode = json.loads(json_content)
  if(decode['results'][0].has_key('location') ):
      page_num = num/20
      print 'detail page_num %d : '%(page_num),
      for i in range(0,page_num):
          print " %d"%(i),
          json_content = getData(region,i)
          if(json_content != ''):
              print 1,
              if(saveToDB(region,i,json_content) ):
                  print 1,
              else:
                  print 0,
          else:
              print 0,
  else:
      for row in decode['results']:
          search(row['name'] , row['num'])

这里的代码调用saveToDB函数直接将json字符串保存到数据库里了,方便以后处理。

在学校的网络下,单线程获取大概50000条信息用时12分钟,调用一次获取20条信息。运行记录显示所有调用都成功且信息完整。百度只要求每天不超过10万次调用,不知道速度过快会不会出现调用出错。

总之,百度的地图API使用简单、文档丰富、免费额度大、速度快,是相当不错的资源。