爬取百度地图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就没有东西了。
代码很水,经纬度的划分也就是大概大概,爬的东西也不多,仅自己记录一下。