百度地图爬取poi数据(圆形区域检索)

该博客介绍了如何利用Python爬取百度地图的地点检索服务,针对郑州地区药店数据进行抓取。通过设置经纬度范围和圆形区域检索,将数据保存到MongoDB和CSV文件。代码中使用了requests库进行HTTP请求,pymongo库连接MongoDB,并对抓取的每条数据进行了插入操作。同时,还提到了百度地图API的配额限制和可能需要的参数调整。
摘要由CSDN通过智能技术生成

爬取百度地图poi数据

需要用到百度地图的“地点检索”服务,关于“地点检索”和ak的获取请看:百度地图开放平台的服务文档,文档很重要,要仔细看。
因为矩形区域检索是高级权限,不能直接用,所以我用的是圆形区域检索,覆盖地图的范围肯定是不够好的。“地点检索”这个服务给的配额上限是2000次/天(如果没充钱的话),并发值是2,所以一天要控制在这个范围内。之前网上也有说过有400条的限制,现在不是400条了,是100左右,所以用圆形区域检索的话注意半径别太大了,要不爬的就太少了。
我这半径设的是2000米,设定经纬度的范围是郑州部分地方,然后直接把爬下来的数据存到了MongoDB和csv文件中。根据需要自己修改这些值,拼接url然后爬就行了。
代码:

import requests
import time
from urllib.parse import urlencode
import csv
from pymongo import MongoClient
import json

client = MongoClient('mongodb://localhost:27017')
db = client.Test
stu=db.test2

pointlist = []              #要遍历的点
begin_lat = 34.52           #开始和结束的经纬度34.52   
end_lat = 34.90              #34.90   
begin_lon = 113.32           #113.32   
end_lon = 114.0              #114.0    
ak='xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'
headurl = 'http://api.map.baidu.com/place/v2/search?'
query = '药店'

x = int ((end_lat-begin_lat)/0.04 + 1)      #经度和纬度分别遍历几次
y = int ((end_lon-begin_lon)/0.04 + 1)
lat = begin_lat
lon = begin_lon
newpoint = str(lat)+','+str(lon)
pointlist.append(newpoint)                  #存到列表里面
for i in range(x):
    for j in range(y):
        lon += 0.04
        newpoint = str(lat)+','+str(lon)
        pointlist.append(newpoint)
    lon = begin_lon
    lat += 0.04
#print(pointlist)
num = 1
ff = open('D:/药店.csv','w',encoding='utf-8',newline='')

for i in pointlist:                         #遍历列表,每次取一个点,也就是圆心
    url = headurl+'query='+query+'&location='+i+'&radius=2000&output=json&ak='+ak       #拼接url
    #print(url)
    response = requests.get(url=url)
    data = response.json()
    print('data', num ,':','('+i+')')
    result = data['results']
    if result:
        for j in range(len(result)):
            result_x=result[j]
            print(result_x)
            re = stu.insert_one(result_x)
                   #写入数据库
            w = csv.DictWriter(ff, result_x.keys())
            w.writerow(result_x)
    else:
        print('NULL')

    time.sleep(1)
    num += 1

ff.close()

  

我这url没有设定page_size和page_num,这样爬下来的东西就比较少,可以看文档里的参数加上这俩参数,不过page_num一般到6就没有东西了。
代码很水,经纬度的划分也就是大概大概,爬的东西也不多,仅自己记录一下。

评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值