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


思路介绍:

获取高德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检索可能受到限制!!")
        # 构造URL
        thisUrl = url1 + city + url2 + str(page)
        # 获取POI数据
        data = requests.get(thisUrl)
        sleep(1)
        # 转为JSON格式
        s = data.json()
        # 解析JSON
        aa = 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 += 1
            print("爬取了 " + 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():
	# 打开一个excel
    book = 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,词条的属性格式不统一导致的无法获取到相同的信息格式。

  • 3
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: 高德POI是指高德地图的兴趣Points of Interest,POI)数据。Python是一种广泛使用的编程语言。那么,Python如何与高德POI数据进行交互呢? 首先,我们可以使用Python的requests库向高德POI接口发送HTTP请求,以获取POI数据。我们需要使用高德的开发者密钥,将其作为参数添加到请求中。通过设置请求的经纬度、半径、关键词等参数,可以获取特定区域、特定类型的POI数据。 接着,我们可以使用Python的json库对返回的JSON格式数据进行解析和处理。通过解析,我们可以获取POI的名称、地址、经纬度、电话等相关信息,并根据需要进行进一步的处理和分析。 在获取POI数据后,我们可以将其展示在地图上,借助Python的地图可视化库(如folium)实现。通过将POI的经纬度坐标添加到地图上,可以方便地查看POI分布情况,并进行可视化分析。 此外,我们还可以使用Python的机器学习和数据挖掘库对POI数据进行分析。例如,可以使用聚类算法对POI进行聚类分析,找出具有相似特征的POI群组。或者,可以使用文本挖掘技术对POI的描述文本进行情感分析,了解用户对POI的评价情况。 总之,Python提供了丰富的工具和库,可以方便地获取、解析和分析高德POI数据。通过Python的强大功能,我们可以更好地利用和分析POI数据,以满足不同领域的需求,如地理信息分析、城市规划等。 ### 回答2: Python 高德POI是一个基于Python编程语言的高德地图兴趣服务接口。POI兴趣Points of Interest),是指地图上的特定地,例如餐馆、商场、景等。 使用Python高德POI,我们可以通过调用相应的接口获得特定位置周边的兴趣信息。首先,我们需要在高德地图开放平台上获取API密钥,然后使用Python的HTTP库发送HTTP请求到高德POI的接口地址,将API密钥和其他参数一起传递给接口。接口会返回一个JSON格式的响应,其中包含了周边兴趣的相关信息,如名称、地址、经纬度等。 在Python中使用高德POI可以实现很多功能,比如查找指定位置附近的餐馆,或者根据用户输入的关键词搜索特定类型的兴趣。我们可以根据返回的兴趣信息,对其进行处理和分析,比如绘制地图、计算距离等。 Python高德POI的使用非常灵活,我们可以根据自己的需求定制特定的功能。此外,高德POI也提供了批量操作接口,允许我们一次性获取多个位置周围的兴趣信息,方便进行大规模的数据处理和分析。 总而言之,Python高德POI是一个强大的工具,能够帮助我们在Python环境中轻松实现与高德地图相关的兴趣服务。无论是进行实时地理位置数据处理,还是进行地理信息系统开发,Python高德POI都能够提供便捷而高效的解决方案。 ### 回答3: Python高德POI是一个用于访问和使用高德地图的Python库。POI代表兴趣(Point of Interest),它是指地图上的特定位置或区域,如酒店、餐厅、景等。 使用Python高德POI,我们可以通过API获取各种POI详细信息。首先,我们需要在高德地图开发者平台上申请一个API密钥。然后,我们可以使用该密钥访问高德地图的API。 要使用Python高德POI,我们首先需要安装它的库文件。可以使用pip命令在命令行中运行"pip install amap"来安装。安装好之后,我们可以在Python脚本中导入amap模块,然后使用其中的函数和类进行地图操作。 例如,我们可以使用amap的search函数在指定的城市中搜索特定类型的POI。我们可以指定查询关键词和城市名称,并设置一些可选参数,如搜索半径、搜索结果数量等。执行查询后,我们可以获取到符合条件的POI的信息,如名称、地址、坐标等。 除了搜索,Python高德POI还提供了其他功能,如地周边搜索、路径规划等。我们可以使用amap的相关函数来实现这些操作,以满足不同的需求。 总的来说,Python高德POI是一个强大的工具,可以帮助我们在Python中方便地访问和使用高德地图的POI数据。无论是开发地图导航应用程序,还是进行地理位置分析,都可以使用Python高德POI来简化我们的工作,并提供丰富的地图数据支持。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值