1. import xlrd # 读xlsx
  2. import xlsxwriter # 写xlsx
  3. import urllib.request # url请求,Python3自带,Python2与3中urllib的区别见:http://blog.csdn.net/Jurbo/article/details/52313636
  4. import os # 创建output文件夹
  5. import glob # 获取文件夹下文件名称
  6. import time # 记录时间
  7. import json # 读取json格式文件
  8.  
  9. def xlsx_merge(folder,header,filename):
  10. fileList = []
  11. for fileName in glob.glob(folder + "*.xlsx"):
  12. fileList.append(fileName)
  13. fileNum = len(fileList)
  14. matrix = [None] * fileNum
  15. for i in range(fileNum):
  16. fileName = fileList[i]
  17. workBook = xlrd.open_workbook(fileName)
  18. try:
  19. sheet = workBook.sheet_by_index(0)
  20. except Exception as e:
  21. print(e)
  22. nRows = sheet.nrows
  23. matrix[i] = [0]*(nRows - 1)
  24. nCols = sheet.ncols
  25. for m in range(nRows - 1):
  26. matrix[i][m] = [""]* nCols
  27. for j in range(1,nRows):
  28. for k in range(nCols):
  29. matrix[i][j-1][k] = sheet.cell(j,k).value
  30. fileName = xlsxwriter.Workbook(folder + filename + ".xlsx")
  31. sheet = fileName.add_worksheet("merged")
  32. for i in range(len(header)):
  33. sheet.write(0,i,header[i])
  34. rowIndex = 1
  35. for fileIndex in range(fileNum):
  36. for j in range(len(matrix[fileIndex])):
  37. for colIndex in range (len(matrix[fileIndex][j])):
  38. sheet.write(rowIndex,colIndex,matrix[fileIndex][j][colIndex])
  39. rowIndex += 1
  40. print("已完成%d个文件的合并"%fileNum)
  41. fileName.close()
  42.  
  43. def poi_by_adcode_poicode(folder,city_file = "city",poi_file = "poi",merge_or_not = 1):
  44. city_file = city_file
  45. poi_file = poi_file
  46. merge_or_not = merge_or_not
  47. header_full = ["id","name","type","typecode","biz_type","address","location","tel","pname","cityname","adname","rating","cost"] #返回结果控制为base时,输出的POI标签类别
  48. header = ["id","name","type","typecode","biz_type","address","location","tel","pname","cityname","adname"]
  49. offset = 25 # 实例设置每页展示10条POI(官方限定25条,实际测试可以为50)
  50. # 读取列表
  51. folder_sheet = xlrd.open_workbook(folder + "input/" + "folder.xlsx").sheet_by_index(0)
  52. folder_list = folder_sheet.col_values(0)
  53. folder_code_list = folder_sheet.col_values(1)
  54. city_sheet = xlrd.open_workbook(folder+ "input/" + city_file + ".xlsx").sheet_by_index(0)
  55. city_list =city_sheet.col_values(0)
  56. city_code_list = city_sheet.col_values(1)
  57. poi_type_sheet = xlrd.open_workbook(folder+ "input/" + poi_file + ".xlsx").sheet_by_index(0)
  58. poi_type_list = poi_type_sheet.col_values(1)
  59. total_work = (city_sheet.nrows - 1) * (poi_type_sheet.nrows - 1) # 指示工作总量
  60. city_col_index = 1 # 用于记录上次已经读取到的行数
  61. work_index = 1
  62. print(time.strftime('%Y-%m-%d %H:%M:%S',time.localtime(time.time())) + ":抓取开始!")
  63. for folder_index in range(1,len(folder_list)): # 区分地级市
  64. output_folder = folder + folder_list[folder_index] +"/" # 创建输出路径
  65. if os.path.isdir(output_folder):
  66. pass
  67. else:
  68. os.makedirs(output_folder)
  69. for city_index in range(city_col_index,len(city_list)): # 对行政区
  70. if folder_code_list[folder_index][0:4] == city_code_list[city_index][0:4]: # 如果前四数字相同,则在该地级市目录下写入,否则退出循环
  71. for poi_type_index in range(1,len(poi_type_list)): # 对兴趣点类别
  72. workbook_file = output_folder + str(city_list[city_index]) + str(poi_type_list[poi_type_index]) + ".xlsx"
  73. if os.path.exists(workbook_file):
  74. print(str(city_list[city_index]) + str(poi_type_list[poi_type_index]) + " 已存在")
  75. else:
  76. workbook =xlsxwriter.Workbook(workbook_file) # 新建工作簿
  77. sheet = workbook.add_worksheet("result") # 新建工作表
  78. for col_index in range(len(header_full)):
  79. sheet.write(0,col_index,header_full[col_index]) # 写表头
  80. row_index = 1
  81. for page_index in range(1, 101): # 制定行政区和兴趣点类别后,POI信息已固定, 现针对页数写入
  82. try:
  83. 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"
  84. # 请求的结构化url地址如上,见:http://lbs.amap.com/api/webservice/guide/api/search/
  85. data = json.load(urllib.request.urlopen(url))["pois"]
  86. for i in range(offset):
  87. for col_index in range(len(header)):
  88. sheet.write(row_index, col_index, str(data[i][header[col_index]])) # 写入简略表头内容
  89. sheet.write(row_index,len(header),str(data[i]["biz_ext"]["rating"])) # 写入详细表头内容
  90. sheet.write(row_index,len(header) + 1,str(data[i]["biz_ext"]["cost"]))
  91. row_index += 1
  92. except:
  93. break
  94. workbook.close()
  95. work_index = (city_index - 1) * len(poi_type_list) + poi_type_index
  96. print(time.strftime('%Y-%m-%d %H:%M:%S',time.localtime(time.time())) + ":" + str(city_list[city_index]) + " " + str(poi_type_list[poi_type_index]) + " 已获取!进度:%.3f%%" %(work_index / total_work *100))
  97. city_col_index += 1
  98. else:
  99. break
  100. print(time.strftime('%Y-%m-%d %H:%M:%S',time.localtime(time.time())) + "" + folder_list[folder_index] + "已完成!")
  101.  
  102. if merge_or_not == 1:
  103. if os.path.exists(output_folder + folder_list[folder_index] + ".xlsx"):
  104. pass
  105. else:
  106. xlsx_merge(output_folder, header_full, folder_list[folder_index])
  107. print(time.strftime('%Y-%m-%d %H:%M:%S',time.localtime(time.time())) + ":已对文件进行合并!")
  108. else:
  109. print(time.strftime('%Y-%m-%d %H:%M:%S',time.localtime(time.time())) + ":未进行合并!")
  110. print(time.strftime('%Y-%m-%d %H:%M:%S',time.localtime(time.time())) + ":所有工作完成!")
  111.  
  112. poi_by_adcode_poicode("E:/XXDir/","city", "poi",1)

1、如果是将数据储存在excel中(存储在数据库中时,不用考虑),最好将结果分阶段保存成单独文件并及时输出时间和进度。

2、可以通过判断以前保存的文件是否存在达到断点续爬的目的,也可以通过此方式,实现多主机共享进度(农村人的分布式爬取^-^,通过建立共享文件夹)。

3、做多重循环时,要考虑清楚循环之间的步骤应该置哪个循环之下。

4、通过将复杂的功能拆分成多个小的功能,可以更好的完成一段复杂代码的编写。

5、尽可能将实现的功能编写成函数和库,以便下次调用。

Python——阶段总结(一)的更多相关文章

  1. 11、python阶段测试

    1.执行Python脚本的两种方式 如果想要永久保存代码,就要用文件的方式 如果想要调试代码,就要用交互式的方式 2.Pyhton单行注释和多行注释分别用什么? 单行注释:# 多行注释: '' &qu ...

  2. Python阶段复习 - part 4 - 用户登录程序

    简易版: #!/usr/bin/env python # _*_ coding:UTF-8 _*_ # __auth__:Dahlhin import sys userinfo = r'userinf ...

  3. Python阶段复习 - part 3 - Python函数

    利用函数打印9*9乘法表 def cheng(num): for i in range(1,num+1): for j in range(1,i+1): print('{0} * {1} = {2}' ...

  4. Python阶段复习 - part 2 - Python序列/持久化

    1. 把一个数字的list从小到大排序,然后写入文件,然后从文件中读取出来文件内容,然后反序,在追加到文件的下一行中 >>> import json >>> imp ...

  5. Python阶段复习 - part 1 - Python基础练习题

    1.实现1-100的所有的和 # 方法1: sum = 0 for i in range(1,101): sum += i print(sum) # 方法2: num1 = int(input('请输 ...

  6. Python学习 —— 阶段综合练习一

    Python 阶段综合练习一 综合之前的函数.数据结构.流程控制等,做以下实例练习:(建议先不要看代码,自己先试着写:代码仅供参考,有多种实现方法) 1. 定义 is_Even 函数,传一 int 参 ...

  7. Python中函数、类、模块和包的调用

    初学python阶段,大多数人对函数.类.模块和包的调用都搞得不是很清楚,这篇随笔就简单的进行说明. (1)函数 当函数定义好之后,可以直接调用. 比如:def summ(add1,add2),那么 ...

  8. 【目录】Python学习笔记

    目录:Python学习笔记 目标:坚持每天学习,每周一篇博文 1. Python学习笔记 - day1 - 概述及安装 2.Python学习笔记 - day2 - PyCharm的基本使用 3.Pyt ...

  9. day12_雷神_线程总结

    #线程 1. 多线程理论 0.进程只是一个资源单位,用来隔离资源,从执行角度是主线程. 1.多个线程共享一个进程的数据资源: 2.线程开销小: 2. 开线程的两种方式 0. 站在资源的角度,主进程:执 ...

随机推荐

  1. iOS 使用Instruments的工具小结

    使用Instruments的工具 iOSXcodeInstrumentsInstruments是一个官方提供的强大的性能调试工具集. 1.Blank(空模板):创建一个空的模板,可以从Library库 ...

  2. C语言报错:error: expected ‘while’ at end of input } ^

    在建线程池过程当中遇见上图所示错误: 解决方法: Linux中定义: SYNOPSIS #include <pthread.h> void pthread_cleanup_push(voi ...

  3. java中异常处理finally和return的执行顺序

    根据个人亲自测试,得出如下结果: 1.try,catch中有没有return,finnally都会执行,而且是先执行try,catch后,最后执行finnally语句: 2.如果finnally中有r ...

  4. 【学习总结】win7使用anaconda安装tensorflow+keras

    tips: Keras是一个高层神经网络API(高层意味着会引用封装好的的底层) Keras由纯Python编写而成并基Tensorflow.Theano以及CNTK后端. 故先安装TensorFlo ...

  5. MySQL中的用户与授权

    grant all on *.* to root@'192.168.20.49'; grant select on *.* to root@192.168.20.49 ; -- dba 可以查询 My ...

  6. React react-fastclick-alt 移动端点击

    1. Install npm install --save-dev react-fastclick-alt 2. 用法 将元素或者component放在  <FastClick>...&l ...

  7. 使用Crawler框架搭建自己的爬虫框架MyCrawler

    自己写一个爬虫框架的目的: 完美架构 在实际的数据采集编码过程中,发现代码比较乱,抓取数据,存储数据的代码混杂在一起,为了构建比较完美的数据采集框架 敏捷开发 将数据采集进行标准流程化,每个标准流程都 ...

  8. JPA javax.persistence.TransactionRequiredException

    直接说一下解决方案 Dao层,一定要是Dao层. 1 增加Transactional,必须要事务! 2 增加Modifying,告诉jpa这是修改! @Transactional @Modifying ...

  9. Keras 获取中间某一层输出

    1.使用函数模型API,新建一个model,将输入和输出定义为原来的model的输入和想要的那一层的输出,然后重新进行predict. #coding=utf-8 import seaborn as ...

  10. [BJOI2019]勘破神机(斯特林数,数论)

    [BJOI2019]勘破神机(斯特林数,数论) 题面 洛谷 题解 先考虑\(m=2\)的情况. 显然方案数就是\(f_i=f_{i-1}+f_{i-2}\),即斐波那契数,虽然这里求出来是斐波那契的第 ...