获取高德POI兴趣点的详细信息

  • 一,获取高德地图POI数据
    • 第一步,申请”Web服务API”密钥(Key);
    • 第二步,拼接HTTP请求URL,第一步申请的Key需作为必填参数一同发送;
    • 第三步,接收HTTP请求返回的数据(JSON或XML格式),解析数据。
  • 二,将获取到的所有POI数据作为目录爬取详细信息
    • 第一步,读取Excel文件中的数据
    • 第二步,封装请求头信息
    • 第三部,发送请求获取详细信息
    • 第四步,保存数据
    • 效果展示及总结

思路介绍:

获取高德POI兴趣点主要分为两部分,一,爬取高德地图的想要搜索的兴趣点的数据,比如获取某市的所有桥梁信息,此时获得所有的市区范围内的桥梁信息,二,再用此获得的目录去百度百科爬取词条详细的数据。

一,获取高德地图POI数据

在搜索POI开发文档中可以查看到获取数据信息的方式。

第一步,申请”Web服务API”密钥(Key);

首先找到高德开放平台高德开放平台提供的API接口,这里提供了高德开放的可以适用于各种客户端的获取POI的方式。
找到应用管理 添加一个key, 这个key后面用于发送请求使用。

第二步,拼接HTTP请求URL,第一步申请的Key需作为必填参数一同发送;

发送请求的网址:
https://restapi.amap.com/v3/place/text?keywords=输入的关键字&city=beijing&output=xml&offset=20&page=1&key=<用户的key>&extensions=all
keywords和type可以指定哪一个市区或者什么类型的POI。
在文档中可以获取到不同市区和建筑物种类的代码

拼接url的代码如下,

# 各下级行政区的代码,不要选择市区的代码,否则会出现问题
arr = ['540102', '540103', '540104', '540121', '540122', '540123', '540124', '540127','540202', '540221', '540222', '540223', '540224', '540225', '540226', '540227', '540228', '540229', '540230','540231', '540232', '540233', '540234', '540235', '540236', '540237','540302', '540321', '540322', '540323', '540324', '540325', '540326', '540327', '540328', '540329', '540330','540402', '540421', '540422', '540423', '540424', '540425', '540426','540502', '540521', '540522', '540523', '540524', '540525', '540526', '540527', '540528', '540529', '540530','540531','540602', '540621', '540622', '540623', '540624', '540625', '540626', '540627', '540628', '540629', '540630','542521', '542522', '542523', '542524', '542525', '542526', '542527'
]
# API的URL,在这里进行了结构化处理
url1 = "https://restapi.amap.com/v3/place/text?keywords=桥&types=190307&city="
url2 = "&output=JSON&offset=20&key=4f981956ab23875a4636f9418832e54f&extensions=all&page="# 用于储存数据
x = []
# 用于计数
num = 0
# 190307    地名地址信息  交通地名    桥

第三步,接收HTTP请求返回的数据(JSON或XML格式),解析数据。

官方对返回的POI数据的数量进行了限制,只能最多获取900条。所以逻辑加了一个判断。

# 循环各下级行政区进行POI检索
for i in range(0, len(arr)):# 当前行政区city = arr[i]# 因为官方对API检索进行了45页限制,所以只要检索到45页即可for page in range(1, 46):# 若该下级行政区的POI数量达到了限制,则警告使用者,之后考虑进行POI类型切分if page == 45:print("警告!!POI检索可能受到限制!!")# 构造URLthisUrl = url1 + city + url2 + str(page)# 获取POI数据data = requests.get(thisUrl)sleep(1)# 转为JSON格式s = data.json()# 解析JSONaa = s["pois"]# 若解析的JSON为空,即当前行政区的数据不够45页(即没有达到限制),返回if len(aa) == 0:break# 对每条POI进行存储for k in range(0, len(aa)):s1 = aa[k]["name"]s2 = aa[k]["type"]s3 = aa[k]["adname"]x.append([s1, s2, s3])num += 1print("爬取了 " + str(num) + " 条数据")# 将数据结构化存储至规定目录的xls文件中
c = pd.DataFrame(x)
c.to_csv('./getEXCELS/西藏桥梁汇总.xls', encoding='utf-8-sig')

二,将获取到的所有POI数据作为目录爬取详细信息

第一步,读取Excel文件中的数据

在这里用的是xlrd插件,将获取到的数据作为一个列表进行返回。

import xlrd
# 从Excel中获取名字,组装URL
def getBridgeNames():# 打开一个excelbook = xlrd.open_workbook("getEXCELS/西藏桥梁汇总.xls")# 打开excel中的哪一个sheet页sheet = book.sheet_by_index(0)# 获取名字的一列数据bridge_names = sheet.col_values(1)return bridge_names

第二步,封装请求头信息

随机在列表中拿取一个请求头

import random
user_agents = ['Mozilla/5.0 (Windows NT 6.1; rv:2.0.1) Gecko/20100101 Firefox/4.0.1','Mozilla/5.0 (Windows; U; Windows NT 6.1; en-us) AppleWebKit/534.50 (KHTML, like Gecko) Version/5.1 Safari/534.50','Opera/9.80 (Windows NT 6.1; U; en) Presto/2.8.131 Version/11.11','Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US) AppleWebKit/525.19 (KHTML, like Gecko) Chrome/1.0.154.50 Safari/525.19','Mozilla/5.0 (Windows; U; Windows NT 6.0; de) AppleWebKit/525.13 (KHTML, like Gecko) Chrome/0.2.149.27 Safari/525.13']
def get_header():header = {'User-Agent': random.choice(user_agents)}return header

第三部,发送请求获取详细信息

这里存在一个问题:(暂未解决)
百度百科上对于不同的关键字,搜索到的词条的格式可能不同,比如搜索柳梧大桥和搜索拉萨大桥的词条的格式会存在不同再或者就是遇见百度百科没有资料的关键字。
而在获取页面的时候没有办法统一格式导致的有些信息无法取到,比如图片中的 有的属性叫桥长,但是在另一个里面属性为长度。


解析词条的代码如下,最终以一个列表返回所有的数据。

def getInfo(url, bridge_name):# 获取代理ip# proxies = ipGetter.ipGet()# 拿到网页text数据html_text = requests.get(url, headers=getHeaders.get_header()).text# print(html_text)# 加载进内存用来解析网页html数据html_data = etree.HTML(html_text)# 获取词条属性信息base_title = html_data.xpath('//dl[contains(@class,"basicInfo")]/dt//text()')base_info = html_data.xpath('//dl[contains(@class,"basicInfo")]/dd')# 存放基础信息的列表info = []for element in base_info:info.append(''.join(str.strip() for str in element.xpath('.//text()')))# 将基础信息存放到字典里info_dict = dict(zip(base_title, info))# 创建一个列表 存放本次url的获取到的信息# 加入中文名tmp_info = [bridge_name]# 英文名english_name = info_dict.get("外文名", "")tmp_info.append(english_name)# 始建时间build_time = info_dict.get("始建时间", "")tmp_info.append(build_time)# 投用时间use_time = info_dict.get("投用时间", "")tmp_info.append(use_time)# 所属地区address = info_dict.get("所属地区", "")tmp_info.append(address)# 类型bridge_type = info_dict.get("类\xa0\xa0\xa0\xa0型", "")tmp_info.append(bridge_type)# 长度length = info_dict.get("长\xa0\xa0\xa0\xa0度", "")tmp_info.append(length)# 宽度width = info_dict.get("宽\xa0\xa0\xa0\xa0度", "")tmp_info.append(width)# 车道规模lane_size = info_dict.get("车道规模", "")tmp_info.append(lane_size)# 设计速度speed = info_dict.get("设计速度", "")tmp_info.append(speed)# 起止位置start_stop_position = info_dict.get("起止位置", "")tmp_info.append(start_stop_position)# 途径线路route = info_dict.get("途经线路", "")tmp_info.append(route)# 管理机构manage_org = info_dict.get("管理机构", "")tmp_info.append(manage_org)# 获取简介content_text = html_data.xpath('//div[@class="lemma-summary"]//text()')if len(content_text) == 0 :tmp_info.append("")else:content = ''.join([con.strip() for con in content_text])tmp_info.append(content)# 获取img图片信息try:img = "https://baike.baidu.com" + html_data.xpath('//a[@class="more-link"]/@href')[0]tmp_info.append(img)except Exception as e:tmp_info.append("")# 加入到列表汇总bridge_info.append(tmp_info)

第四步,保存数据

将获取到的数据保存在excel中

# 保存数据
def saveData(dataList, savePath):# 建立一个excel文档book = xlwt.Workbook(encoding='utf-8', style_compression=0)# 建立一个sheet页sheet = book.add_sheet("西藏桥梁汇总", cell_overwrite_ok=True)cols = ["中文名", "英文名", "始建时间", "投用时间", "所属地区", "类型", "长度", "宽度", "车道规模", "设计速度", "起止位置", "途径线路", "管理机构", "简介", "图片链接"]# 写入标题行for i in range(15):sheet.write(0, i, cols[i])# 写入数据for i in range(0, len(dataList)):data = dataList[i]for j in range(15):sheet.write(i+1, j, data[j])book.save(savePath)

效果展示及总结

最终的excel文档的样式为:

空值导致的原因可能有:
1,词条在百度百科不存在。
2,该属性在词条中不存在。
3,该属性在词条中的名称不相同。

存在的问题主要有:
1,词条不存在的关键字信息如何获取。
2,词条的属性格式不统一导致的无法获取到相同的信息格式。

获取高德POI兴趣点的详细信息相关推荐

  1. Python获取高德POI兴趣点数据 以及高德的两个坑 示例抓取成都市餐饮服务大类

    POI数据,英文全称Point of Intersesting,中文的意思是兴趣点,指的是在地图上有意义的点:比如商店.酒吧.加油站.医院.车站等.POI数据能够赋能时空行为.城市规划.地理信息等研究 ...

  2. Android获取酷狗音乐歌曲详细信息

    Android获取酷狗音乐歌曲详细信息 一.目标 二.实现方案 三.最终方案 四.网易云音乐 五.遗留问题 六.接下来 七.Finally 在<Android获取歌曲详细信息>一文中,介绍 ...

  3. Android获取网易云音乐歌曲详细信息

    Android获取网易云音乐歌曲详细信息 一.目标 二.实现方案 三.最终方案 四.遗留问题 五.接下来 六.Finally 在<Android获取歌曲详细信息>一文中,介绍了几种获取网易 ...

  4. WinPcap笔记(3):获取已安装设备的详细信息

    现在已经知道了如何获取本地设备的基本信息.事实上,WinPcap提供了其它更高级的信息.在函数pcap_findalldevs_ex()返回的pcap_if结构体中,都有一个pcap_addr的结构体 ...

  5. <渗透测试学习指南> 信息收集(三)获取目标应用版本等详细信息

    转载请注明作者和出处: 本章将讲述如何获取目标系统信息.端口信息等详细信息 上一章我们讲到了获取目标真实IP及子域名信息的几种典型方法,但是单靠真实IP和子域名还无法让我们顺利的完成一项渗透测试任务, ...

  6. 怎样获取淘宝/天猫sku详细信息 API数据

    一.接口参数说明: item_sku-获取sku详细信息API接口,包含规格名称.规格图片.优惠价.原价.宝贝标题.库存等,价格低至几厘,详情请加我,或者私聊我,或者是点击更多API调试请移步注册AP ...

  7. Android监控外接USB设备和获取USB等设备的详细信息

    1.通过如下Action监控USB设备的插入或拔出 UsbManager.ACTION_USB_ACCESSORY_ATTACHED;UsbManager.ACTION_USB_ACCESSORY_D ...

  8. 如何快速获取淘宝商品的详细信息?看这里就够了

    taobao.item_get 公共参数 名称 类型 必须 描述 key String 是 调用key(必须以GET方式拼接在URL中) secret String 是 调用密钥 api_name S ...

  9. 获取linux详细信息,通过编程获取Linux文件系统使用的详细信息

    去年的操作系统课程设计,我做了一个基于linux到任务管理器.大部分需要到系统信息都是从linux下 的一个伪文件系统/proc中读出的.大家都知道,此文件系统只存在内存当中,而不占用外存空间.它以文 ...

最新文章

  1. python性能分析之line_profiler模块-耗时,效率 时间
  2. js数组 sort方法的分析
  3. 解决windows版 duet display无法正常连接 【看完就会】
  4. Linux下对文件操作时出现乱码怎么办?
  5. 【Android】 Android adb常见问题整理
  6. JLBH示例2 –协调遗漏的会计处理
  7. Android精准计步器
  8. Linux网络协议栈:中断下半部处理
  9. 时钟分频中的计数值问题
  10. 列车停站方案_高速铁路列车停站方案与运行图协同优化理论和方法
  11. 2021-09-07218. 天际线问题
  12. reduce python3_Python3的高阶函数:map,reduce,filter
  13. 【工具推荐】之桌面软件
  14. 10折交叉验证深入理解
  15. 第05篇:Mybatis的SQL执行流程分析
  16. 自学单片机是否先学c语言,学习单片机一定要先学好C语言再去学单片机吗
  17. 未实施内容安全策略 (CSP)
  18. 以文搜图,多种语言也不成问题(CLIP 支持中文)
  19. flutter onPressed onTap等手势检测及触摸事件处理
  20. 以代码绘制圣诞,过快乐圣诞节!

热门文章

  1. 国产完美替换MLX90393三轴霍尔传感器
  2. java 获取换行符_Apache POI从XWPFRun获得换行符
  3. VirtualBox虚拟机转换到VMware中,用VMware打开VirtualBox虚拟机
  4. 天创速盈:拼多多店铺评分如何提升?关键点解析
  5. python推箱子文档_python实现推箱子游戏
  6. jdk32位安装包下载_神灯商户数据采集软件下载_神灯商户数据采集软件 v5.0.0 官方版...
  7. Linux-Fedora 25 Python 3.5开发环境配置Eclipse+Pydev
  8. 【极客大挑战 2019】BuyFlag
  9. 硬件3合1智能移动电源(三星NOTE7是怎样爆炸的?)
  10. 利用canvas绘制图片加水印