# 以下内容为原创,转载请注明出处
1 import xlrd # 读xlsx
import xlsxwriter # 写xlsx
import urllib.request # url请求,Python3自带,Python2与3中urllib的区别见:http://blog.csdn.net/Jurbo/article/details/52313636
import os # 创建output文件夹
import glob # 获取文件夹下文件名称
import time # 记录时间
import json # 读取json格式文件 # 本函数完成文件合并。单独保存是为了1.方便不同的用途;2.减少内存;3.在应用到其他网站时,可以断点续爬,降低中断风险
def xlsx_merge(folder,header,filename):
fileList = []
for fileName in glob.glob(folder + "*.xlsx"):
fileList.append(fileName)
fileNum = len(fileList)
matrix = [None] * fileNum
for i in range(fileNum):
fileName = fileList[i]
workBook = xlrd.open_workbook(fileName)
try:
sheet = workBook.sheet_by_index(0)
except Exception as e:
print(e)
nRows = sheet.nrows
matrix[i] = [0]*(nRows - 1)
nCols = sheet.ncols
for m in range(nRows - 1):
matrix[i][m] = [""]* nCols
for j in range(1,nRows):
for k in range(nCols):
matrix[i][j-1][k] = sheet.cell(j,k).value
fileName = xlsxwriter.Workbook(folder + filename + ".xlsx")
sheet = fileName.add_worksheet("merged")
for i in range(len(header)):
sheet.write(0,i,header[i])
rowIndex = 1
for fileIndex in range(fileNum):
for j in range(len(matrix[fileIndex])):
for colIndex in range (len(matrix[fileIndex][j])):
sheet.write(rowIndex,colIndex,matrix[fileIndex][j][colIndex])
rowIndex += 1
print("已完成%d个文件的合并"%fileNum)
fileName.close() # 本函数完成获取POI
def poi_by_adcode_poicode(folder,city_file = "city",poi_file = "poi",result_file = "result",merge_or_not = 1):
'''要求:文件为XLSX格式表格。
列表均在表格的第一页,且第一列为名称,第二列为编码。
因为是创建目录,folder要求不为根目录。
要求输入表在目录的input文件夹中,本函数将结果输出到目录下的output文件夹下
'''
city_file = city_file
poi_file = poi_file
result_file = result_file
merge_or_not = merge_or_not
header_full = ["id","name","type","typecode","biz_type","address","location","tel","pname","cityname","adname","rating","cost"]
header = ["id","name","type","typecode","biz_type","address","location","tel","pname","cityname","adname"]
offset = 25 # 实例设置每页展示10条POI(官方限定25条)
output_folder = folder + "output/"
# 创建输出路径
if os.path.isdir(output_folder):
pass
else:
os.makedirs(output_folder)
# 读取列表
city_sheet = xlrd.open_workbook(folder+ "input/" + city_file + ".xlsx").sheet_by_index(0)
poi_type_sheet = xlrd.open_workbook(folder+ "input/" + poi_file + ".xlsx").sheet_by_index(0)
city_list =city_sheet.col_values(0)
city_code_list = city_sheet.col_values(1)
poi_type_list = poi_type_sheet.col_values(1)
# 指示工作完成量
total_work = (city_sheet.nrows - 1) * (poi_type_sheet.nrows - 1)
work_index = 1
print(time.strftime('%Y-%m-%d %H:%M:%S',time.localtime(time.time())) + ":抓取开始!")
for city_index in range(1,len(city_list)):
for poi_type_index in range(1,len(poi_type_list)):
workbook =xlsxwriter.Workbook(output_folder + str(city_list[city_index]) + str(poi_type_list[poi_type_index]) + ".xlsx") # 新建工作簿
sheet = workbook.add_worksheet("result") # 新建“poiResult”的工作表
for col_index in range(len(header_full)):
sheet.write(0,col_index,header_full[col_index]) # 写表头
row_index = 1
for page_index in range(1, 101):
try:
url = "http://restapi.amap.com/v3/place/text?&keywords=&types=" + str(poi_type_list[poi_type_index]) + "&city=" + city_code_list[city_index] + "&citylimit=true&offset=" + str(offset) + "&page="+ str(page_index) + "&key=你的key&extensions=all"
# 请求的结构化url地址如上,见:http://lbs.amap.com/api/webservice/guide/api/search/
data = json.load(urllib.request.urlopen(url))["pois"]
for i in range(offset):
for col_index in range(len(header)):
sheet.write(row_index, col_index, str(data[i][header[col_index]]))
sheet.write(row_index,len(header),str(data[i]["biz_ext"]["rating"]))
sheet.write(row_index,len(header) + 1,str(data[i]["biz_ext"]["cost"]))
row_index += 1
except Exception: break
workbook.close()
print(time.strftime('%Y-%m-%d %H:%M:%S',time.localtime(time.time())) + ":" + city_list[city_index] + " " + poi_type_list[poi_type_index] + " 已获取!进度:%.2f%%" %(work_index / total_work *100))
work_index += 1
print(time.strftime('%Y-%m-%d %H:%M:%S',time.localtime(time.time())) + ":所有地区各类别POI获取完毕")
if merge_or_not == 1:
xlsx_merge(output_folder, header_full, result_file)
print(time.strftime('%Y-%m-%d %H:%M:%S',time.localtime(time.time())) + ":已对文件进行合并!")
else:
print(time.strftime('%Y-%m-%d %H:%M:%S',time.localtime(time.time())) + ":未进行合并!")
print(time.strftime('%Y-%m-%d %H:%M:%S',time.localtime(time.time())) + ":所有工作完成!") # 使用
poi_by_adcode_poicode("E:/test/","city", "poi", "result", 1)

Python——使用高德API获取指定城指定类别POI并实现XLSX文件合并的更多相关文章

  1. Python——使用高德API获取POI(以深圳南山医疗保健服务POI为例)

    以下内容为原创,转载请注明出处. import xlwt #创建Excel,见代码行8,9,11,25,28:CMD下:运行pip install xlwt进行安装 import urllib.req ...

  2. 【poi】用POI新建一个xlsx文件【或者说将数据存入到xlsx中】/【将数据从xlsx中获取到项目中】

    第一部分:写入xlsx中 使用POI创建一个xlsx文件: 项目结构如下: 具体使用的POI中的 XSSFWorkbook   xlsx对象 Sheet 工作簿对象 Row 行对象 Cell  单元格 ...

  3. Python 操作Zabbix API 获取ERROR级别告警信息并打印

    1.需求:有一个语音合成播报项目,要实时获取zabbix的ERROR级别以上告警信息,将该信息合成语音播报出去.(合成语音及播报已经完成) 2.现实:整理zabbix告警级别,将不太重要的告警放到ER ...

  4. Azure DevOps Server: 使用Rest Api获取拉取请求Pull Request中的变更文件清单

    需求: Azure DevOps Server 的拉取请求模块,为开发团队提供了强大而且灵活的代码评审功能.拉取请求中变更文件清单,对质量管理人员,是一个宝贵的材料.质量保障人员可以从代码清单中分析不 ...

  5. js调用高德API获取所在当前城市

    可以在js代码中直接调用API接口,获取所处当前城市信息,代码如下: <script type="text/javascript"> function getCurre ...

  6. Python 操作Sonqube API 获取检测结果并打印

    1.需求:每次Sonqube检查完毕后,需要登陆才能看到结果无法通过Jenkins发布后直接看到bug 及漏洞数量. 2.demo:发布后,可以将该项目的检测结果简单打印出来显示,后面还可以集成钉钉发 ...

  7. 高德地图API获取天气

    1.建立行政区规划清单表 use edw; drop table if exists dim_prov_city_adcode; create table if not exists dim_prov ...

  8. C/C++ Windows API——获取系统指定目录(转)

    原文地址:C/C++ Windows API——获取系统指定目录 经测试,在win10 VS2017中用wprintf()输出正常,SHGetSpecialFolderPath函数也正常运行 但是用M ...

  9. Python中使用高德API实现经纬度转地名

    场景 高德API提供给开发者们一些常用功能的接口,其中有一种叫地理/逆地理编码能实现 地名查询经纬度和经纬度查地名. 实现 高德API平台: https://lbs.amap.com/ 注册并登陆 找 ...

随机推荐

  1. NPM -- 初探--01

    NPM是随同NodeJS一起安装的包管理工具,能解决NodeJS代码部署上的很多问题,常见的使用场景有以下几种: 允许用户从NPM服务器下载别人编写的第三方包到本地使用. 允许用户从NPM服务器下载并 ...

  2. idea右键无法生成javaclass

    博客转自:https://www.cnblogs.com/zjfjava/p/9219237.html 项目中新建目录之后,要在该目录下新增java Class文件,右键——>New发现无对应选 ...

  3. 写一函数,用来求表达式1+2+3+.....+n的值,并编写主函数

    Description 写一函数,用来求表达式1+2+3+.....+n的值,并编写主函数.n由键盘输入. Input 输入一个整数 Output 输出表达式的值 Sample Input 5 Sam ...

  4. Core官方DI解析(2)-ServiceProvider

    ServiceProvider ServiceProvider是我们用来获取服务实例对象的类型,它也是一个特别简单的类型,因为这个类型本身并没有做什么,其实以一种代理模式,其核心功能全部都在IServ ...

  5. WPF效果(GIS三维续篇)

    去年这个时候简单的摸索了一下三维的GIS相关的东西,也就是仅仅玩耍了一把,这次来点真正用的上的干货效果效果: 1.加载自定义百度样式的瓦片效果 2.加载自定义百度样式的缩放效果 3.快速手动进去咱的大 ...

  6. mysql中将多行数据合并成一行数据

    .1GROUP_CONCAT()中的值为你要合并的数据的字段名; SEPARATOR 函数是用来分隔这些要合并的数据的: ' '中是你要用哪个符号来分隔: 2.必须要用GROUP BY 语句来进行分组 ...

  7. JS 设计模式八 -- 发布订阅者模式

    概念 发布---订阅模式又叫观察者模式,它定义了对象间的一种一对多(一个发布,多个观察)的关系,让多个观察者对象同时监听某一个主题对象,当一个对象发生改变时,所有依赖于它的对象都将得到通知. 优点 1 ...

  8. 小A的柱状图

    链接 [https://ac.nowcoder.com/acm/contest/549/H] 题意 [] 分析 很显然你必须找到该高度下往左右找到第一个高度比该位置小的.这个区间的宽*该高度.就当前能 ...

  9. scala的多种集合的使用(4)之列表List(ListBuffer)的操作

    1.List列表的创建和添加元素 1)最常见的创建list的方式之一. scala> val list = 1 :: 2 :: 3 :: Nil list: List[Int] = List(1 ...

  10. 大神教你如何解决Linux系统80端口被占用

    有Linux在centos下面安装webmail服务遇到80端口被占用的问题,导致无法继续安装,下面详细介绍下Linux如何查看.查找.关闭监听80端口服务以更好的的解决80端口被占用的问题. 一.查 ...