python爬虫——城市(北京市)公交路线、公交站点及坐标(二)

上接(一)。。。。获取公交站点坐标是调用百度地图API实现的,使用的服务是地点检索服务(又名Place API)中的矩形区域检索,将北京市行政区或分为3km*3km的子区域,遍历区域列表

基于API的爬虫步骤

        1、在网站注册开发者账户用户名,获得相应的开发者密钥

        2、在网站的API帮助说明文档中找到自己需要使用的API

                确认API请求的限制次数

                确认调用API需要使用的参数

        3、在联网状态下,编写代码正确调用该API

        4、从API返回的内容(常见为JSON格式)中获取所需属性

        5、将获取的内容存储到本地(文件或数据库)

一、百度地图开放平台

        登录百度账号,进入控制台,创建应用,获得秘钥AK,使用相应服务即可

《python爬虫——城市(北京市)公交路线、公交站点及坐标(二)》

二、读文档找API

        百度地图WEB服务API中的地点检索服务(Place API)可以获得某一区域(圆形/矩形/城市关键字)poi数据,阅读文档,获取请求url及参数,了解返回参数意义。

《python爬虫——城市(北京市)公交路线、公交站点及坐标(二)》

三、调用API,编写代码

        编写代码过程遇到问题,百度地图API只能返回最多400条数据,意味着当你的检索范围很大,即使地点超过400个也只能返回400个,会造成数据的丢失,搜索很久,看到有用网格数据进行解决,还有划分大的矩形为小矩形的集合方法。网格数据实在没有也搞不懂,采用第二种方法。

        将大的矩形区域通过坐标递归划分为相等的小矩形区域,遍历小矩形区域

        《python爬虫——城市(北京市)公交路线、公交站点及坐标(二)》

四、从json中获取内容

        json数据结构清楚,提取内容不赘述。。。

五、存储文件

        文件较少,写入txt

六、将公交站点信息与公交站点坐标匹配

        能力有限,使用Excel匹配的,之后即可获取完整线路、站点及坐标

# coding =’utf-8′
import requests
import json

#loc_1和loc_2是城市行政区左下坐标和右上坐标
loc_1 =[39.466285,115.22885]
loc_2 = [41.156249,117.510115]

#步长根据测试选择相对合适的值
step = 0.03
#for循环嵌套,获取loc_2与loc_1间步长0.03的矩形区域列表
loc_fin = []
for a in range(1,int((loc_2[0]-loc_1[0])/step+1)+1):
    for b in range(1,int((loc_2[1]-loc_1[1])/step+1)+1):
        lat_1 = round((loc_1[0]+step*a),6)
        lon_1 = round((loc_1[1]+step*b),6)
        lat_2 = round((lat_1-step),6)
        lon_2 = round((lon_1-step),6)
        loc_fin.append(str(lat_2)+”,”+str(lon_2)+’,’+str(lat_1)+’,’+str(lon_1))
#print(loc_fin)
#for循环遍历loc_2与loc_1的矩形区域列表
for loc in loc_fin:
    url = ‘http://api.map.baidu.com/place/v2/search?’
    params = {
        ‘query’:’公交车站$地铁站’,
        ‘bounds’:loc,
        ‘output’:’json’,
        ‘page_size’:’20’,
        ‘ak’:’G4r***************oT4ho’
        }
    http_page = requests.get(url,params)
    result = http_page.json()
    total = result[‘total’]
    #剔除空值,total值大于400输出调小step
    if total > 0 and total < 400:
        result_list = result[‘results’]
        for a in result_list:
            name = a[‘name’]
            lat = a[‘location’][‘lat’]
            lng = a[‘location’][‘lng’]
            info = name+’,’+str(lat)+’,’+str(lng)+’\n’
            with open(‘city_bus_site_poi.txt’,’a’) as f:
                f.write(info)
            print(info)
    elif total != 0 and total >400:
        with open(‘city_bus_site_poi.txt’,’a’) as f:
            f.write(‘Please decrease the value of step!’+’\n’)     


    原文作者:MiguelCoco
    原文地址: https://blog.csdn.net/data_yin/article/details/79759614
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞