最近,越来越多开始用python处理空间数据了。
看了B站小旭学长的视频,看了下geopandas的官方文档基本对这个入门了,其实就是用python实现gis的一些功能而已,然后数据结构稍微变了下。实名推荐小旭学长的视频,入门很好哇,而且里面的方法真的可以直接用在科研里面,很棒,很感谢。
之后也会写几个python处理空间数据的文章,不过今天主要是记录下python爬取poi的。我看的书是东南大学秦艺帆、石飞的《地图时空大数据爬取与规划分析教程》,代码也是书里的,我打了下,确认可以跑通。基本思路是是用高德的api接口,拼接url然后获取结果,在将结果整理后保存在本地。不过书里采用了两个api,一个是关键字搜索,另一个是多边形搜索,其中关键字搜索只能获取1000个poi以下的,而多边形搜索则可以获得大量的poi数据。
不过在跑代码抓取poi的时候,当抓取很多的时候,没有一次是完全成功运行的,中间或多或少会报些错,在下面记录几个遇到的错误:

  1. 报错:UnicodeEncodeError: ‘gbk’ codec can’t encode character ‘\xa0’ in position 16: illegal multibyte sequ。解决方法:f = open(outputfile,‘a’)改成f = open(outputfile,‘a’ ,encoding=“utf-8”),打开文件时指定好编码格式就行;
  2. 显示网站超时没有相应,没有找到解决办法;

在报错后不要全部重新运行,通过输出可以看到哪些是成功写入的,哪些是没有成功写入的,成功写入的就不需要重新运行了,在poitype.txt中删除掉这些就可以了,把没成功的接着运行就可以了。但是如果是编码出现错误,建议还是重跑下好,说不定前后文本编码格式不一样就麻烦了,继续跑反而可能带来更大的问题。
此外还要提醒一个,高德给的poitype,要注意是分成大类,中类,小类的,如果跑了已经在poitype写了大类,千万注意不要在写中类和小类了,会出现重复下载的情况,贴一下高德的说明。
分类代码由六位数字组成,一共分为三个部分,前两个数字代表大类;中间两个数字代表中类;最后两个数字代表小类。

若指定了某个大类,则所属的中类、小类都会被显示。

例如:010000为汽车服务(大类)

         010100为加油站(中类)010101为中国石化(小类)010900为汽车租赁(中类)010901为汽车租赁还车(小类)

当指定010000,则010100等中类、010101等小类都会被包含。

当指定010900,则010901等小类都会被包含

书上给的这个代码也不是非常完善,有些地方还可以继续改进,比如读取啥的我个人还是更喜欢用pandas,也更喜欢用excel,csv之类的格式,不喜欢txt,不过这些都是小问题啦,而且由于太懒了,也懒得改动了,有问题了再改吧,哈哈。


下面是代码:

import json
import urllib
import importlib
import sys
import os
import basics
importlib.reload(basics)
<module 'basics' from 'C:\\Users\\Administrator\\Desktop\\兴趣点数据采集与分析\\basics.py'>
# 关键字搜索,每次最多返回1000个POI信息,适合数量较少的POI类型
def getPOIKeywords(poitype,citycode):POIList = []for page in range(1 , 46):url = "https://restapi.amap.com/v3/place/text?key="+ak+"&keywords=&types="+poitype+"&city="+citycode+\"&children=l&offset=20&page="+str(page)+"&extensions=all"json_obj = urllib.request.urlopen(url)json_data = json.load(json_obj)try:pois = json_data['pois']except Exception as e:print("错误",url)print(e)continueif (pois != []):for j in range(0,len(pois)):poi_j = pois[j]id = poi_j['id']lon = float(poi_j['location'].split(',')[0])lat = float(str(poi_j['location']).split(',')[1])name = poi_j['name']poi = basics.PointWithAttr(id,lon,lat,poitype,name)POIList.append(poi)return POIList
#范围搜索,将行政区划分为num个子区域,用以无遗漏采集POI
def getPOIPolygon(poitype,citycode,num):POIList = []# 获取citycode对应的行政边界districtBoundryUrl = "http://restapi.amap.com/v3/config/district?key="+ak+"&keywords="+citycode+"&subdistrict=0&extensions=all"json_obj=urllib.request.urlopen(districtBoundryUrl)json_data=json.load(json_obj)districts = json_data['districts']polyline = districts[0]['polyline']center = districts[0]['center']pointscoords = polyline.split(';')newlinelength=int(len(pointscoords) / num)  # 每个子区域的点数目# 将行政区域划分为num个子区域,获得每个子区域的poiboundryMarks = [] # 标记行政区域的划分点for i in range(0,len(pointscoords) , newlinelength):boundryMarks.append(i)boundryMarks.append(len(pointscoords) - 1)for i in range(0 , len(boundryMarks) - 1):firstMark = boundryMarks[i]lastMark = boundryMarks[i+1]newboundry = [center] #新的多边形划分子区,从中心开始for j in range(firstMark , lastMark+1):newboundry.append(pointscoords[j])newboundry.append(center)  #最后回到center,达到闭合# newboundryStr是多边形的边界newboundryStr = "|".join(newboundry)for page in range(1,46):url="http://restapi.amap.com/v3/place/polygon?key="+ak+"&polygon="+newboundryStr+"&keywords=&types="+poitype+ \"&offset=20&page="+str(page)+"&extensions=all"json_obj=urllib.request.urlopen(url)json_data=json.load(json_obj)try:pois=json_data['pois']except Exception as e:print("错误" , url)print(e)continueif (pois != []):for j in range(0,len(pois)):poi_j=pois[j]id=poi_j['id']lon=float(poi_j['location'].split(',')[0])lat=float(str(poi_j['location']).split(',')[1])name=poi_j['name']poi=basics.PointWithAttr(id,lon,lat,poitype,name)POIList.append(poi)return POIList
# 将poi写入txt文件ok
def writePOIs2File(POIList,outputfile):f = open(outputfile,'a' ,encoding="utf-8")for i in range(0 , len(POIList)):f.write(POIList[i].id+";"+POIList[i].name+";"+POIList[i].type+';'+str(POIList[i].lon)+';'+str(POIList[i].lat)+"\n")f.close()
# 密钥ak
ak='' ##自己的密钥
# 将采集的POI数据保存在output_directory文件夹里
output_directory="C:\\Users\\Administrator\\Desktop\\兴趣点数据采集与分析\\"
if not os.path.exists(output_directory+"poi\\"):os.mkdir(output_directory+"poi\\")
try:typefile=open(output_directory+"poitype.txt",'r')
except Exception as e:print('错误提示:请将poitype.txt复制到'+output_directory+"下")
poitypeList=typefile.readlines()
for poitype in poitypeList:  # 遍历各种类型,并下载每种类型的poipoitype=poitype.split('\n')[0]  # 去掉换行符#行政区域编码citycode
#     citycodes={'玄武区':'320102','秦淮区':'320104','建邺区':'320105','古楼区':'320106','浦口区':'320111','栖霞区':320113,\
#                '雨花台区':'320114','江宁区':'320115'}citycodes={'义乌市':'330782'}for citycode in citycodes.values():  # 遍历行政区域编码,将各个行政区域的poi都下载下来#调用关键字搜索的getPOIKeywords函数,获取POI数量较少的案例POIList = getPOIKeywords(poitype , citycode)# 关键字搜索返回POI数量大于900个,则调用多边形搜索# getPOIPolygon函数,获取POI数量较多的类别if (len(POIList)>=900):POIList = []POIList=getPOIPolygon(poitype,citycode,6)outputfile1=output_directory+"poi\\"+poitype+"_"+citycode+"_polygon.txt"f=open(outputfile1,'w',encoding="utf-8")f.close()print(citycode , poitype,len(POIList))writePOIs2File(POIList,outputfile1)else:outputfile = output_directory+"poi\\"+poitype+"_"+citycode+"_keywords.txt"f=open(outputfile,'w',encoding="utf-8")f.close()print(citycode,poitype,len(POIList))writePOIs2File(POIList,outputfile)
# 合并poitype类型的文本文件
basics.mergetxt(output_directory+"poi\\",output_directory+"final.txt")
330782 070000 5410
330782 090000 880
330782 120000 2235
330782 130000 4392
330782 140000 4068
330782 150000 4675
330782 170000 5416

python poi爬取相关推荐

  1. python爬虫百度地图_零基础掌握百度地图兴趣点获取POI爬虫(python语言爬取)(基础篇)...

    实现目的:爬取昆明市范围内的全部中学数据,包括名称.坐标. 先进入基础篇,本篇主要讲原理方面,并实现步骤分解,为python代码编写打基础. 因为是0基础开始,所以讲得会比较详细. 如实现目的所讲,爬 ...

  2. Python之爬取百度地图兴趣点(POI)数据

    关于爬虫系列,前三篇文章分别讲了三个简单案例,分别爬取了<你好,李焕英>电影豆瓣热门短评.58同城在售楼盘房源信息以及安居客网二手房小区详情页数据.通过前三个案例,相信大家都对爬虫有了简单 ...

  3. 零基础掌握百度地图兴趣点获取POI爬虫(python语言爬取)(基础篇)

    实现目的:爬取昆明市范围内的全部中学数据,包括名称.坐标. 先进入基础篇,本篇主要讲原理方面,并实现步骤分解,为python代码编写打基础. 因为是0基础开始,所以讲得会比较详细. 如实现目的所讲,爬 ...

  4. python爬虫——爬取马蜂窝景点翻页文字评论

    python爬虫--爬取马蜂窝景点翻页文字评论 使用Chrome.python3.7.requests库和VSCode进行爬取马蜂窝黄鹤楼的文字评论(http://www.mafengwo.cn/po ...

  5. python requests 爬取数据

    python requests 爬取数据 import requests from lxml import etree import time import pymysql import json h ...

  6. python每隔一段时间保存网页内容_利用Python轻松爬取网页题库答案!教孩子不怕尴尬了!...

    大家有没有遇到这种令人尴尬的情况:"好不容易在网上找到需要的资源数据,可是不容易下载下来!"如果是通过一页一页的粘贴复制来下载,真的让人难以忍受,特别是像我这种急性子,真得会让人窒 ...

  7. 在当当买了python怎么下载源代码-python爬虫爬取当当网

    [实例简介]python爬虫爬取当当网 [实例截图] [核心代码] ''' Function: 当当网图书爬虫 Author: Charles 微信公众号: Charles的皮卡丘 ''' impor ...

  8. python自动搜索爬取下载文件-python批量爬取下载抖音视频

    本文实例为大家分享了python批量爬取下载抖音视频的具体代码,供大家参考,具体内容如下 import os import requests import re import sys import a ...

  9. python爬虫代码实例-Python爬虫爬取百度搜索内容代码实例

    这篇文章主要介绍了Python爬虫爬取百度搜索内容代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 搜索引擎用的很频繁,现在利用Python爬 ...

最新文章

  1. python办公自动化excel_简直出神入化,教你用Python控制Excel实现自动化办公
  2. Python网络爬虫与信息提取(三)(正则表达式的基础语法)
  3. iOS开发之自定义弹出的键盘
  4. 用PHP获取土豆网视频FLV地址
  5. mysql---CV出现的中英文符号错误
  6. 模拟鱼群的matlab算法,IFSA人工鱼群算法
  7. 会员制玩法解说 JAVA会员制商城系统开发
  8. 英语语法总结--形容词和副词
  9. 【实验技术笔记】细胞表型检测之细胞凋亡(Hoechst染色 + PI染色 + TUNEL 染色 + Annexin V-PI 双染)
  10. 安装SQL2000,出现以前的某个程序安装已在安装计算机上创建挂起的文件操作(完美解决)
  11. 即时通讯-Netty篇
  12. 利用ODI将Oracle US7ASCII编码的数据库迁移至UTF8编码数据库
  13. 爱情没有了,生活仍在继续
  14. 华为的鸿蒙os,鸿蒙OS明天正式发布,十大特性,能拯救暴跌80%的华为手机吗?...
  15. BPF-JIT中bug归类
  16. Android 架构之长连接技术
  17. C#参数详解一(形参和实参)
  18. hdfs Trash回收站配置 java操作trash不生效解决
  19. 这些前端大厂面试题你会做吗?每日10题大厂面试题(七)
  20. 解决Win7下苹果笔记本键盘不亮问题

热门文章

  1. 大样本伯努利占比假设检验
  2. 乱七八糟介绍一款文献检索网站,web of science
  3. 【Asp.net】静态网页与动态网页
  4. 各个raid对比:性能和运行速度和读写方面
  5. altium designer 中的top/bottom solder和top/bottom paste mask
  6. 64位windows下32位进程一例卡死分析
  7. PorterDuffXfermode使用
  8. *苏轼_江城子*密州出猎
  9. Linux下闹钟函数alarm的常见用法
  10. 攻防世界misc——适合作为桌面壁纸