Python POI公交数据爬取

本文介绍了如何使用Python从高德开放平台爬取重庆公交线路数据,进行数据清洗,然后将坐标转换为.shp文件格式。内容包括请求头URL构造、批量获取数据、数据清洗、坐标转换等步骤。
摘要由CSDN通过智能技术生成
基于高德开放平台的重庆公交数据爬取

1.公交数据爬取

​ 高德开放平台数据获取需要三步骤:1.申请“Web服务API”密匙(key);2.组成请求头URL;3.接受请求返回的数据(JSON)并解析数据

1.1 请求头URL

  • 密匙申请

    ​ 首先需要申请高德开发者账号,再在个人主页的【应用管理】—>【我的应用】页面创建新应用,点击“添加新Key”,输入"gongjiao",服务平台选择“Web服务”,提交完成密匙申请

  • 请求头URL组成

    <‘https://restapi.amap.com/v3/place/text?key=97ddbeeea64e8ad2c106f5c008a554b7&keywords=长寿102路(古佛–圣天湖)&types=&city=重庆&children=1&offset=20&page=1&extensions=all’>

1.2 数据获取

  • 导入库

    import requests
    import json
    import pandas as pd 
    import time
    from lxml import etree
    
  • 请求返回数据

    r = requests.get(url).text
    rt = json.loads(r)    #将获取的字符串转化为json数据
    rt                    
    

在这里插入图片描述

图1.1 浏览器查看的json数据
  • 获取目标信息

    dt = {
         } 
    dt['name'] = rt['buslines'][0]['name']               #获取公交线名键值对
    dt['polyline'] = rt['buslines'][0]['polyline']         #获取公交线折点坐标键值对
    dt['basic_price'] = rt['buslines'][0]['basic_price']    #获取公交线价格键值对
    
    st_name = []
    st_coords = []
    for i in rt['buslines'][0]['busstops']:       #获取公交站点名,站点坐标
        st_name.append(i['name'])
        st_coords.append(i['location'])
    dt['station_name'] = st_name
    dt['station_coords'] = st_coords
    dm = pd.DataFrame([dt])    #将数据转为dataframe格式
    dm
    

    在这里插入图片描述

    图1.2 部分数据

1.3 批量获取重庆公交线路数据

1.3.1 定义公交数据爬取函数–下载线路数据

def get_dt(city,line):        #定义公交线路数据抓取函数,参数城市名,公交线路名
    url = 'https://restapi.amap.com/v3/bus/linename?s=rsv3&extensions=all&key=97ddbeeea64e8ad2c106f5c008a554b7&output=json&city={}&offset=1&keywords={}&platform=JS'.format(city,line)
    r = requests.get(url).text       #制定格式化的请求头
    rt = json.loads(r)    #将获取的字符串转化为json数据
    try:                  #尝试是否进行
        if rt['buslines']:   #如果有rt中有“buslines”这个键进行
            print('data avalible..')
            if len(rt['buslines'])== 0:  #如果有“buslines”为空进行
                print('no data in list...')
            else:                        #不为空进行
                dt = {
   } 
                dt['name'] = rt['buslines'][0]['name']               #获取公交线名键值对
                dt['polyline'] = rt['buslines'][0]['polyline']         #获取公交线折点坐标键值对
                dt['basic_price'] = rt['buslines'][0]['basic_price']    #获取公交线价格键值对
                st_name = []                                        #获取公交站名键值对
                st_coords = []                                    #获取公交站点坐标键值对
                for i in rt['buslines'][0]['busstops']:
                    st_name.append(i['name'])
                    st_coords.append(i['location'])
                dt['station_name'] = st_name
                dt['station_coords'] = st_coords
                dm = pd.DataFrame([dt])
                return(dm)
        else:
            pass
    except:
        print('error...try it again...')
        time.sleep(2)
        get_dt(city,line)

1.3.2 定义下载这个城市所有公交线的列表函数

​ 这里用到公交线路名网址:'http://chongqing.gongjiao.com/lines_6.html’可先查看网页构成、以及查看网页源代码。

def get_lines(cityE,city):    #定义城市线路名爬取函数,参数城市名(拼音),城市名(中文) 
    lst = []
    for i in range(1,10):
        url = 'http://{}.gongjiao.com/lines_{}.html'.format(cityE,i)
        r = requests.get(url)
爬取POI数据,你可以使用Python中的requests和BeautifulSoup库。以下是一个简单的步骤: 1. 选择一个POI数据源,例如高德地图或百度地图,并确定你要爬取的城市和分类。 2. 使用requests库向该数据源发送请求,并传递城市和分类参数。例如,你可以使用以下代码向高德地图发送请求: ```python import requests city = '北京市' category = '餐饮服务' url = f'https://restapi.amap.com/v3/place/text?key=你的高德地图API密钥&keywords={category}&city={city}&offset=25&page=1&extensions=all' response = requests.get(url) ``` 在这个例子中,你需要将`你的高德地图API密钥`替换为你自己的API密钥。 3. 解析响应数据。如果响应是JSON格式的,你可以使用Python的json库将其转换为Python对象。如果响应是HTML格式的,你可以使用BeautifulSoup库解析它。例如,如果你要爬取百度地图的POI数据,你可以使用以下代码: ```python from bs4 import BeautifulSoup city = '北京市' category = '餐饮' url = f'https://map.baidu.com/?qt=s&wd={category}&c={city}&rn=10&pn=0&ie=utf-8&oue=1&from=webmap&da_par=direct' response = requests.get(url) soup = BeautifulSoup(response.text, 'html.parser') items = soup.select('div[class="search-item"]') ``` 在这个例子中,`select`方法用于选择HTML中具有`class`属性为`search-item`的元素。 4. 提取所需的数据。一旦你解析了响应数据,你需要从中提取所需的POI数据。这通常涉及到使用一些字符串操作,例如查找特定的HTML标记或分离特定的JSON键。例如,如果你要从高德地图的响应中提取POI的名称和坐标,你可以使用以下代码: ```python import json data = json.loads(response.text) pois = data['pois'] for poi in pois: name = poi['name'] location = poi['location'] print(name, location) ``` 在这个例子中,我们首先将响应数据转换为Python对象,然后从中提取`pois`键的值,并遍历每个POI,提取其名称和坐标。 希望这能帮到你开始爬取POI数据
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值