博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
百度地图爬虫——获取某区域所有中学附近的网吧数据
阅读量:4671 次
发布时间:2019-06-09

本文共 4537 字,大约阅读时间需要 15 分钟。

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

一、百度地图API密钥申请

申请地址:

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

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

申请成功后即可看到如下界面,箭头所示即为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_dict10 #解析Josn数据,并返回为List11 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_list20 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 = 2031     Fir_page_num = 032     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) + "具体信息如下:\n")43 44     #记录数据页数45     Fir_Page = Fir_total / page_size + 146     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 += 150             f.write(str(Fir_num) + "," + Fir_poi_list[0].encode("utf-8") + "\n")51             # 获取每个学校的经纬度坐标52             Sec_location_lat = Fir_poi_list[1]["lat"]53             Sec_location_lng = Fir_poi_list[1]["lng"]54             # 设置半径为50055             radius = 50056             Sec_page_num = 057             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 += 169                     f.write(str(Fir_num) + "-" + str(Sec_num) + "," + Sec_poi_list[0].encode("utf-8") + "\n")70                 Sec_page_num += 171                 #再次定义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 += 179         #再次定义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文件内容如下:

转载于:https://www.cnblogs.com/MatthewHome/p/10574567.html

你可能感兴趣的文章
linux驱动开发框架
查看>>
python生成器
查看>>
flannel vxlan工作基本原理及常见排障方法
查看>>
曼昆经济学原理(微经部分)笔记整理
查看>>
React 入门
查看>>
eclipse plugins
查看>>
更改TFS项目中的SharePoint网站端口
查看>>
C#属性
查看>>
大道至简 第二章 读后随笔
查看>>
Python多线程报错之RuntimeError
查看>>
EOS1.1版本新特性介绍
查看>>
EOS生产区块:解析插件producer_plugin
查看>>
重新打包system.img
查看>>
MySQL user表详解
查看>>
Http常见状态码
查看>>
centos7 安装pip
查看>>
Java之JDBC①
查看>>
date()---求N个月后的1号
查看>>
机器学习九大挑战(转载)
查看>>
加密流量分析
查看>>