城市POI数据爬取-百度地图版

简介: 目前百度地图的最新版为地图检索V2.0服务。详细介绍可以通过开发文档-web服务Api-地点检索V2.0获取。

1 API说明


目前百度地图的最新版为地图检索V2.0服务。详细介绍可以通过开发文档-web服务Api-地点检索V2.0获取。

5dd709d40d634e57bfe39a0f1e7cd800.png



64a46517f4cc452c9e43c78069543175.png


在使用API前需要提前注册账号获取ak。对于免费账号:目前的每日访问次数是100次,最多可以获取2000条数据。

如不需讲解仅需要下载代码:链接直达


2 代码分块讲解


2.1 空表头建立

首先构建一个新的csv文件,用于存储后续我们爬到的API数据。


import requests
import pandas as pd
header = [['province', 'city', 'area', 'name', 'lng', 'lat']]
out = pd.DataFrame(header)
save_path = '文件保存路径与文件名'
out.to_csv(save_path, mode='a', header=False,index=False, encoding='ANSI')


在后面我们需要保存API的省市区以及名称、经纬度信息,因此前面在建立空表时先将表头建立好。


2.2 构建请求与网页访问

本次以行政区划区域检索为例,希望检索某市的全部温泉商户。


query = '温泉'  # 检索关键字
region = '281'  # 检索行政区划区域(增加区域内数据召回权重,如需严格限制召回数据在区域内,请搭配使用city_limit参数)
city_limit = 'true'  # 区域数据召回限制,为true时,仅召回region对应区域内数据。
page_size = '20'  # 单次召回POI数量,默认为10条记录,最大返回20条。
page_num = '0'  # 分页页码,默认为0,0代表第一页
ak = '你的ak'
url = f'https://api.map.baidu.com/place/v2/search?query={query}&region={region}&city_limit={city_limit}&' \
      f'page_size={page_size}&page_num={page_num}&coord_type=1&output=json&ak={ak}'


对于构造的url,前面https://api.map.baidu.com/place/v2/search?为产品信息,不需更改。后面的参数可以根据个人需求设置,并可按任意顺序组合。可设置的参数有:


273ee8b9d8fc4915a428ca11c3e2f4d1.png


94d2cd87dc534035ba28ecb1dadf9fb5.png


71adbd4be56742e7a02185a4f7cc2f3e.png





本次我们根据需求设置了多个参数构建了url,其中5个考虑到可能日后会多次修改,以变形式存在,其余的直接写进了url之中。如果不确定url是否正确可以使用print将其打印出来,用浏览器访问这个url来测试。如果访问正常,其返回内容应该是类似下面的json格式信息:




4ae505761ad843daab04fc9f7f4ea813.png


对于json格式信息的查看,建议使用JSON-handle等插件进行阅读,其层次结构会更加直观。



ad8d44fbddac4e60b6d769edccb24bd8.png


确认url可以访问后,访问网址并保存网址返回的json格式数据。


html = requests.get(url)  # 获取url
data = html.json()  # 通过json()解析数据
html.close()  # 关闭网页链接
count = data['total']
page_total = int(count/20)+1]
1


在total中,表示此次访问共可以返回的数据数量,因为我们设置了每页返回20条数据,所以经过简单的计算便可得出总页数,用于后续的循环中。


保存爬取的结果

num = 0  # 计数器
try:
    for page_num in range(page_total):
        url = f'https://api.map.baidu.com/place/v2/search?query={query}&region={region}&city_limit={city_limit}&' \
              f'page_size={page_size}&page_num={page_num}&coord_type=1&output=json&ak={ak}'
        html = requests.get(url)  # 获取url
        data = html.json()  # 通过json()解析数据
        html.close()  # 关闭网页链接
        for i in range(20):
            province = data['results'][i]['province']
            city = data['results'][i]['city']
            area = data['results'][i]['area']
            name = data['results'][i]['name']
            lng = data['results'][i]['location']['lng']
            lat = data['results'][i]['location']['lat']
            information = [[province, city, area, name, lng, lat]]
            out = pd.DataFrame(information)
            out.to_csv(save_path, mode='a', header=False,index=False, encoding='ANSI')
            num = num + 1
            print('当前获取第' + str(num) + '条数据中。')
except Exception as e:
    print('获取完成')
    print('结束代码:', str(e))



在最外层使用了一个try-except结构,因为在爬取到最后时,一页可能不满20条数据,即产生报错。如果这是全部程序不加这个结构也没问题,但是如果程序外部有嵌套,建议加上以保证程序正常运行。

这段代码有两层循环,第一层是遍历不同的页数,第二层是遍历每页各条数据进行保存。每读取一条数据后,使用追加的方式保存在csv文件中。


3 完整代码


'''
使用的是百度开发者平台地图检索功能
用于爬取营口市的洗浴数据
'''
import requests
import pandas as pd
# 构建表头
header = [['province', 'city', 'area', 'name', 'lng', 'lat']]
out = pd.DataFrame(header)
save_path = 'F:\代码包\产品中心代码\温泉POI结果.csv'
out.to_csv(save_path, mode='a', header=False,index=False, encoding='ANSI')# 构建请求并计算所需页码
query = '温泉'  # 检索关键字
region = '281'  # 检索行政区划区域(增加区域内数据召回权重,如需严格限制召回数据在区域内,请搭配使用city_limit参数)
city_limit = 'true'  # 区域数据召回限制,为true时,仅召回region对应区域内数据。
page_size = '20'  # 单次召回POI数量,默认为10条记录,最大返回20条。
page_num = '0'  # 分页页码,默认为0,0代表第一页
ak = '你的ak'
url = f'https://api.map.baidu.com/place/v2/search?query={query}&region={region}&city_limit={city_limit}&' \
      f'page_size={page_size}&page_num={page_num}&coord_type=1&output=json&ak={ak}'
html = requests.get(url)  # 获取url
data = html.json()  # 通过json()解析数据
html.close()  # 关闭网页链接
count = data['total']
page_total = int(count/20)+1
# 保存结果
num = 0  # 计数器
try:
    for page_num in range(page_total):
        url = f'https://api.map.baidu.com/place/v2/search?query={query}&region={region}&city_limit={city_limit}&' \
              f'page_size={page_size}&page_num={page_num}&coord_type=1&output=json&ak={ak}'
        html = requests.get(url)  # 获取url
        data = html.json()  # 通过json()解析数据
        html.close()  # 关闭网页链接
        for i in range(20):
            province = data['results'][i]['province']
            city = data['results'][i]['city']
            area = data['results'][i]['area']
            name = data['results'][i]['name']
            lng = data['results'][i]['location']['lng']
            lat = data['results'][i]['location']['lat']
            information = [[province, city, area, name, lng, lat]]
            out = pd.DataFrame(information)
            out.to_csv(save_path, mode='a', header=False,index=False, encoding='ANSI')
            num = num + 1
            print('当前获取第' + str(num) + '条数据中。')
except Exception as e:
    print('获取完成')
    print('结束代码:', str(e))




相关文章
|
easyexcel Java 测试技术
读取Excel还用POI?试试这款开源工具EasyExcel
读取Excel还用POI?试试这款开源工具EasyExcel
518 0
|
3月前
|
人工智能 Linux API
OpenClaw全自动小红书运营实战:从0到1全流程部署、技能配置与内容自动化发布指南
在内容自动化运营场景中,OpenClaw(Clawdbot)凭借高度可扩展的Skill体系与多任务执行能力,可实现从热点追踪、文案创作、封面生成到笔记发布、互动管理的全流程自动化。本文基于2026年最新环境,完整讲解如何通过阿里云轻量服务器或本地Windows11/macOS/Linux部署OpenClaw,安装并配置小红书运营Skill,完成Cookie登录、内容生成、笔记发布、数据监控,并接入阿里云百炼Coding Plan免费大模型与QMD记忆优化系统,实现低成本、7×24小时无人值守小红书运营。全文无营销词汇,所有命令可直接复制,零基础用户也能快速跑通全流程。
2844 9
|
Cloud Native Docker 容器
云原生之使用docker部署qbittorrent
云原生之使用docker部署qbittorrent
1323 2
云原生之使用docker部署qbittorrent
|
算法 Python
Python计算基尼系数实践笔记(案例+代码+视频+列表推导式)
Python计算基尼系数实践笔记(案例+代码+视频+列表推导式)
2623 0
Python计算基尼系数实践笔记(案例+代码+视频+列表推导式)
|
5月前
|
数据采集 人工智能 自然语言处理
一文读懂LLM微调:新手必知的原理、误区与场景化应用方案
本文深入浅出讲解LLM微调原理与实操,涵盖新手必知的核心概念、常见误区及场景化应用方案。通过类比“学霸特训”,解析微调与提示词区别,推荐轻量级LoRA方法,提供从数据准备、环境搭建到模型训练、效果评估的完整步骤,并附实用工具与避坑指南,助力AI初学者快速掌握定制化模型技能,实现个人或企业级AI应用落地。
|
8月前
|
数据可视化 数据挖掘 5G
DataChat 2.0 使用说明
DataChat 2.0是一款为电信行业打造的智能数据分析Agent,旨在帮助用户快速从原始数据中提取业务洞察、发现潜在问题、生成可视化报告与可执行建议。
253 0
|
SQL 人工智能 自然语言处理
如何诱导AI犯罪-提示词注入
我们用到的大模型基本把政治类信息、犯罪相关信息都已屏蔽。但是,黑客依旧可以使用提示词诱导和提示词注入的方式对大模型进行攻击。
如何诱导AI犯罪-提示词注入
|
Java 应用服务中间件 网络性能优化
Java 生成证书:使用 OpenSSL
Java 生成证书:使用 OpenSSL
|
机器学习/深度学习 数据采集 算法框架/工具
深度学习中的模型优化:以卷积神经网络为例
【7月更文挑战第31天】在深度学习的海洋中,卷积神经网络(CNN)如同一艘强大的航船,承载着图像识别与处理的重要任务。本文将扬帆起航,深入探讨如何通过各种技术手段优化CNN的性能,从数据预处理到模型正则化,再到超参数调整,我们将一一解析这些策略如何提升CNN的效率和准确度。文章还将通过实际代码示例,展示如何在Keras框架中应用这些技术,确保理论与实践的结合,为读者提供一套完整的优化工具箱。
437 4
|
自然语言处理
什么是大模型的局限性?
【7月更文挑战第25天】什么是大模型的局限性?
3435 3