• 百度地图爬虫——获取某区域所有中学附近的网吧数据


    本文思路如下:调用百度地图API获取某区域内所有中学信息,依次获得每个中学的地理坐标,查询该坐标一定半径周围内所有网吧数据,将学校数据和网吧数据依次存入txt文件中。

    一、百度地图API密钥申请

    申请地址:http://lbsyun.baidu.com/apiconsole/key

    需要登陆百度账号,在控制台标签栏下点击创建应用,如下图:

    选择浏览器端和地点检索(其他服务也可以选择),白名单填*即可。

    申请成功后即可看到如下界面,箭头所示即为AK。

    二、主程序编写

    本程序使用Python版本为2.7,其中有些语句在Python3中不能使用,需要注意。

    程序代码如下:

     1 # -*- coding: utf-8 -*-
     2 import urllib,json
     3 
     4 #生成Josn数据
     5 def create_json(url):
     6     url_file = urllib.urlopen(url)
     7     json_file = url_file.read()
     8     json_dict = json.loads(json_file)
     9     return json_dict
    10 #解析Josn数据,并返回为List
    11 def read_json(json_dict,pois_list):
    12     #依次读取Json数据,保存到List中
    13     for text in json_dict["results"]:
    14         poi_list = []
    15         #只获取目标地点的名称和坐标,用于后续计算
    16         poi_list.append(text["name"])
    17         poi_list.append(text["location"])
    18         pois_list.append(poi_list)
    19     return pois_list
    20 
    21 #程序主函数
    22 if __name__ == "__main__":
    23     # 设置URL参数
    24     ak = "OUnZ4Y8Ew74v5mGtdMp2gU9hxkXimMbh" #访问AK,注意可能会被限制
    25     #加Fir前缀的均为首要查询目标数据
    26     Fir_KeyWord = "中学"
    27     Fir_region = "武昌区"
    28     # 加Sec前缀的均为次要查询目标数据
    29     Sec_KeyWord = "网吧"
    30     page_size = 20
    31     Fir_page_num = 0
    32     Fir_url = "http://api.map.baidu.com/place/v2/search?ak=" + str(ak) + "&output=json&query=" + 
    33           str(Fir_KeyWord) + "&region=" + str(Fir_region) + "&page_size=" + str(page_size) + "&page_num=" + str(Fir_page_num)
    34     # 查取URL的信息,并将数据保存在List中
    35     Fir_pois_list = []
    36     Fir_json_dict = create_json(Fir_url)
    37     Fir_pois_list = read_json(Fir_json_dict, Fir_pois_list)
    38     Fir_total = int(Fir_json_dict["total"])  # 记录数据总数
    39     print(str(Fir_region) + "共有" + str(Fir_total) + "" + str(Fir_KeyWord) + "!")
    40     # 将数据写入TXT文件
    41     f = open('result.txt', 'w')
    42     f.write(str(Fir_region) + "共有" + str(Fir_total) + "" + str(Fir_KeyWord) + "! 周边" + str(Sec_KeyWord) + "具体信息如下:
    ")
    43 
    44     #记录数据页数
    45     Fir_Page = Fir_total / page_size + 1
    46     while (Fir_page_num < Fir_Page):
    47         Fir_num = Fir_page_num * page_size  # 定义学校个数
    48         for Fir_poi_list in Fir_pois_list:
    49             Fir_num += 1
    50             f.write(str(Fir_num) + "," + Fir_poi_list[0].encode("utf-8") + "
    ")
    51             # 获取每个学校的经纬度坐标
    52             Sec_location_lat = Fir_poi_list[1]["lat"]
    53             Sec_location_lng = Fir_poi_list[1]["lng"]
    54             # 设置半径为500
    55             radius = 500
    56             Sec_page_num = 0
    57             Sec_url = "http://api.map.baidu.com/place/v2/search?ak=" + str(ak) + "&output=json&query=" + 
    58                       str(Sec_KeyWord) + "&location=" + str(Sec_location_lat) + "," + str(Sec_location_lng) + "&page_size=" + 
    59                       str(page_size) + "&page_num=" + str(Sec_page_num) + "&radius=" + str(radius)
    60             Sec_pois_list = []
    61             Sec_json_dict = create_json(Sec_url)
    62             Sec_pois_list = read_json(Sec_json_dict, Sec_pois_list)
    63             Sec_total = int(Sec_json_dict["total"])  #记录这一学校周边网吧总数
    64             Sec_Page = Sec_total / page_size + 1 #记录数据页数
    65             while (Sec_page_num < Sec_Page):
    66                 Sec_num = Sec_page_num * page_size  # 定义网吧个数
    67                 for Sec_poi_list in Sec_pois_list:
    68                     Sec_num += 1
    69                     f.write(str(Fir_num) + "-" + str(Sec_num) + "," + Sec_poi_list[0].encode("utf-8") + "
    ")
    70                 Sec_page_num += 1
    71                 #再次定义URL,读取后面页面的数据
    72                 Sec_url = "http://api.map.baidu.com/place/v2/search?ak=" + str(ak) + "&output=json&query=" + 
    73                           str(Sec_KeyWord) + "&location=" + str(Sec_location_lat) + "," + str(Sec_location_lng) + "&page_size=" + 
    74                           str(page_size) + "&page_num=" + str(Sec_page_num) + "&radius=" + str(radius)
    75                 Sec_pois_list = []
    76                 Sec_json_dict = create_json(Sec_url)
    77                 Sec_pois_list = read_json(Sec_json_dict, Sec_pois_list)
    78         Fir_page_num += 1
    79         #再次定义URL,读取后面页面的数据
    80         Fir_url = "http://api.map.baidu.com/place/v2/search?ak=" + str(ak) + "&output=json&query=" + 
    81                   str(Fir_KeyWord) + "&region=" + str(Fir_region) + "&page_size=" + str(page_size) + "&page_num=" + str(Fir_page_num)
    82         # 查取URL的信息,并将数据保存在List中
    83         Fir_pois_list = []
    84         Fir_json_dict = create_json(Fir_url)
    85         Fir_pois_list = read_json(Fir_json_dict, Fir_pois_list)
    86 
    87     f.close()
    88     print("Success!")

    由于每次只能读取一个页面的内容,而一个页面内只有20条数据,因此需要判断查询结果是否大于20个,如果结果大于20个,则需要继续读取后续页面的内容。

    本次实验以武昌区为例,查询武昌区内所有中学500米范围内的网吧数据,生成的txt文件内容如下:

  • 相关阅读:
    PKU 学生的反馈 20091
    PKU 学生的反馈 2009 –2
    中国队有进步
    刚发现博客园又遇到了问题
    今日计划
    Delphi中使用多线程
    在老ASP中使用对象的对象生存期问题
    ASP与Javascript
    ASP & VBScript的错误处理
    对前一段时间学习网络和多线程编程的总结
  • 原文地址:https://www.cnblogs.com/MatthewHome/p/10574567.html
Copyright © 2020-2023  润新知