最近花了大概两个月时间学习python以及爬虫,初见成效,完成了一个基于高德api的全类poi爬取小项目,特此分享。关于高德api的使用可以在此查看:搜索POI 2.0-API文档-开发指南-Web服务 API | 高德地图API (amap.com)

(关于我的各项方法以及py文件命名方面可能不是很规范,欢迎大家批评指正)

主方法(获取数据,插入数据库,查询数据是否已爬取(方便随时停止随时开始)):

from db_base import get_sub_cat
from get_data import get_data
from pgsql_insert import handle_data, insert_list
from get_adcode import get_adcode
from get_list_from_pg import get_listdef main_poi():table_name = '**_**'  # 你需要插入数据的表list_adcode = get_adcode() # 获取需要爬取的区域的for i in range(len(list_adcode)):adcode = list_adcode[i]f = "adcode"tn = "base.adcode_for_get"list_judge = get_list(f, tn)if adcode in list_judge: # 判断区域是否已爬取print("该区已爬取,跳过")else:list_num_cat = ['01', '02', '03', '04', '05', '06', '07', '08', '09','10', '11', '12', '13', '14', '15', '16', '17', '18']# 高德poi分类统共18个大类,用于生成请求条件for a in range(len(list_num_cat)):list_types_test = get_sub_cat(list_num_cat[a])types = ''for b in range(len(list_types_test)):types = types + list_types_test[b] + '|'code_adcode = types + adcodef_ca = "code_adcode"tn_ca = "base.code_adcode_for_get"list_judge_ca = get_list(f_ca, tn_ca)if code_adcode in list_judge_ca: # 判断某区某类是否已爬取print("该条数据已爬取,跳过")else:list_poi = get_data(types, adcode)handle_data(table_name, list_poi) # 插入poi数据方法data = types + adcodetn1 = 'code_adcode_for_get'tf = 'code_adcode'insert_list(tn1, tf, data) # 插入types+adcode数据用来记录该数据已爬取tf1 = 'adcode'insert_list(tn, tf1, adcode) # 插入adcode数据记录该区域已爬取print("爬取完成")

获取网页数据方法:

import requests
from db_base import get_sub_catdef get_data(types, adcode):list_result_poi = []  # 最终返回值作为插入数据库的数据list_amap_key = [] # 可去高德申请key,建议多申请几个,一个号一天可以请求5000次i = 0key = list_amap_key[i]count = '25' # 由于高德每次请求每页最多给25条poi信息,故利用其进行实现分页的查询for j in range(1, 100):if count == '25':page_num = jurl = "  https://restapi.amap.com/v5/place/text?" \"key={}&types={}&region={}&page_num={}" \"&citylimit=true&extensions=all&show_fields=navi,business&page_size=25" \.format(key, types, adcode, page_num)print(url)r = requests.get(url)js = r.json() # 将网页数据转为jsonstatus = js['status']if status == '1': # 判断请求是否成功count = js['count']re = js['pois']list_result_poi.append(re)elif status == '0': # 请求失败则换keyi = i + 1key = list_amap_key[i]return list_result_poi # 最后以一个列表字典的形式返回

获取adcode(关于adcode可见相关下载-Web服务 API | 高德地图API (amap.com)):

import psycopg2def get_adcode(): # 可根据你输入的是省还是市来获取下级区域的adcodeconn = psycopg2.connect() # 数据库信息city = input("请输入你要查询的城市(请输入省或者市并在后面加上省或市):")curs = conn.cursor()select_sql1 = "select adcode from base.base_poi_city where name = " + "'" + city + "'"curs.execute(select_sql1)adcode1 = curs.fetchall()[0][0]if adcode1[2:6] != '0000':adcode2 = str(int(int(adcode1)/100))elif adcode1[2:6] == '0000':adcode2 = str(int(int(adcode1)/1000))curs.close()curs = conn.cursor()select_sql2 = "select adcode from base.base_poi_city where adcode like " + "'" + adcode2 + "%'"curs.execute(select_sql2)data = curs.fetchall()curs.close()conn.close()list_sub_poi = []for i in range(len(data)):re = data[i][0]if re[4:6] != '01' and re[4:6] != '00':list_sub_poi.append(re)return list_sub_poi

获取poi分类(关于poi分类可见上面链接):

import psycopg2def get_sub_cat(num_cat):conn = psycopg2.connect() # 数据库信息curs = conn.cursor()select_sql1 = "select code from base.base_poi_cat where code like'" + num_cat + "%'"  # SQL语句选取行业分类编号codecurs.execute(select_sql1)data = curs.fetchall()curs.close()conn.close()list_sub_poi = []for a in range(len(data)):re = data[a][0]list_sub_poi.append(re) # 将获取到的poi编码生成为一个列return list_sub_poi

插入数据库方法:

import traceback
from src.utils import common
import psycopg2
import math
from src.utils import zuobiaozhuanhuan as zbzhdef handle_data(table_name, list_result0): # 插入数据的主要方法,根据自己的需求改conn = psycopg2.connect()cursor = conn.cursor()dict_poi = {"id": "","大类": "","中类": "","小类": "","兴趣点名称": "","百度坐标": "","省名称": "","省代号": "","市名称": "","市代号": "","区县名称": "","区县代号": "","地址": "","地理格ID": "","类型代号": "","电话": "","84坐标": "","更新时间": "",} # 作为数据缓存字典。然后转入数据库中for i in range(len(list_result0)):list_result1 = list_result0[i]for i in range(len(list_result1)):list_result = list_result1[i]"""将高德坐标解密为xy84再将xy84转化为百度坐标"""x_pi = 3.14159265358979324 * 3000.0 / 180.0x = str(list_result['location']).split(',')[0]y = str(list_result['location']).split(',')[1][x0, y0] = zbzh.gcj02_to_wgs84(float(x), float(y)) # 高德加密经纬度(火星)转WGS84方法z = math.sqrt(float(x0) * float(x0) + float(y0) * float(y0)) + 0.00002 * math.sin(float(y0) * x_pi)theta = math.atan2(float(y0), float(x0)) + 0.000003 * math.cos(float(x0) * x_pi)lng = z * math.cos(theta) + 0.0065lat = z * math.sin(theta) + 0.006xy84 = str(x0) + ',' + str(y0)xybaidu = str(lng) + ',' + str(lat)type1 = str(list_result['type'])dict_poi['id'] = list_result['id']dict_poi['大类'] = type1.split(';')[0]dict_poi['中类'] = type1.split(';')[1]dict_poi['小类'] = type1.split(';')[2]dict_poi['兴趣点名称'] = list_result['name']dict_poi['百度坐标'] = xybaidudict_poi['省名称'] = list_result['pname']dict_poi['省代号'] = list_result['pcode']dict_poi['市名称'] = list_result['cityname']dict_poi['市代号'] = list_result['citycode']dict_poi['区县名称'] = list_result['adname']dict_poi['区县代号'] = list_result['adcode']dict_poi['地址'] = list_result['address']dict_poi['84坐标'] = xy84dict_poi['类型代号'] = list_result['typecode']try:dict_poi['地理格ID'] = list_result['navi']['gridcode']except Exception:print('该条无地理格信息')try:dict_poi['电话'] = list_result['business']['tel']except Exception:print('该条无电话信息')try:update_time = common.get_now()sql = ("insert into "+ table_name+ "(ID,BIG_TYPE,MOD_TYPE,SMALL_TYPE,NAME,XY,PNAME,PCODE,CITYNAME,CITYCODE,ADNAME,ADCODE,UPDATE_TIME,ADDRESS,"+ "GRIDCODE,TYPECODE,TEL,XY84)"+ "values("+ "'"+ str(dict_poi["id"])+ "','"+ str(dict_poi["大类"])+ "','"+ str(dict_poi["中类"])+ "','"+ str(dict_poi["小类"])+ "','"+ str(dict_poi["兴趣点名称"])+ "','"+ str(dict_poi["百度坐标"])+ "','"+ str(dict_poi["省名称"])+ "','"+ str(dict_poi["省代号"])+ "','"+ str(dict_poi["市名称"])+ "','"+ str(dict_poi["市代号"])+ "','"+ str(dict_poi["区县名称"])+ "','"+ str(dict_poi["区县代号"])+ "','"+ update_time+ "','"+ str(dict_poi["地址"])+ "','"+ str(dict_poi["地理格ID"])+ "','"+ str(dict_poi['类型代号'])+ "','"+ str(dict_poi['电话'])+ "','"+ str(dict_poi['84坐标'])+ "')")print(sql)cursor.execute(sql)conn.commit()except Exception:print("保存数据出错: {}".format(traceback.format_exc()))conn.commit()print('数据导入成功')cursor.close()def insert_list(table_name, table_feild, data): # 主要用于对已爬取数据记录的插入conn = psycopg2.connect()cursor = conn.cursor()sql = (f"""insert into {table_name} ({table_feild}) values ('{data}')""")cursor.execute(sql)conn.commit()cursor.close()

获取数据展示:

基于高德api的地区全类poi爬取相关推荐

  1. 高德地图api如何不显示logo_Python爬取高德地图POI数据获取「洗浴推拿指南」

    学习交流群 认识高德地图API 打开"高德开放平台",点击"开发文档",在"Web服务"下寻找并点击"搜索API". 我 ...

  2. Crawler:基于urllib+requests库+伪装浏览器实现爬取国内知名招聘网站,上海地区与机器学习有关的招聘信息(2018.4.30之前)并保存在csv文件内

    Crawler:基于urllib+requests库+伪装浏览器实现爬取国内知名招聘网站,上海地区与机器学习有关的招聘信息(2018.4.30之前)并保存在csv文件内 目录 输出结果 设计思路 核心 ...

  3. 使用百度地图POI爬取需要的数据

    目标:爬取阿克苏地区内的所有医院数据. 一.百度地图开放平台注册,获取到AK. (1)在百度地图开放平台完成注册. 这个平台是百度地图为开发者提供接口用的,有很多其他的功能,这里只讲POI爬取相关. ...

  4. 分析智联招聘的API接口,进行数据爬取

    分析智联招聘的API接口,进行数据爬取 一丶简介 现在的网站基本上都是前后端分离的,前端的你看到的数据,基本上都不是HTML上的和数据,都是通过后端语言来读取数据库服务器的数据然后动态的加载数据到前端 ...

  5. 网络爬虫分析实例:基于音悦台网站榜单的数据爬取与分析

    基于音悦台网站榜单的数据爬取与分析 本实验代码:进入 一.研究背景 在互联网发展初期,网站相对较少,信息查找比较容易.然而伴随互联网爆炸性的发展,普通网络用户想找到所需的资料简直如同大海捞针,这时为满 ...

  6. python poi爬取

    最近,越来越多开始用python处理空间数据了. 看了B站小旭学长的视频,看了下geopandas的官方文档基本对这个入门了,其实就是用python实现gis的一些功能而已,然后数据结构稍微变了下.实 ...

  7. python爬取高德地图_爬虫实战:如何爬取高德地图?

    提起高德地图,咱们每一个人都不会陌生,高德地图是一款非常好用的地区服务软件,很多用户在出行的时候都会使用这款软件,日程用来导航,也可以用来打车,一次呼叫多种车型,用户可以在这里获得更好的服务,随时都可 ...

  8. python广深地区房价数据的爬取与分析

    Python房产数据分析 1.数据爬取 2.明确需求与目的 数据预览 提出问题 3.数据预处理 数据清洗 缺失值 异常值(对连续性标签做处理) 异常值(对离散标签做处理) 4.数据分析 问题1.广东省 ...

  9. python爬取南京市房价_基于python的链家小区房价爬取——仅需60行代码

    简介 首先打开相关网页(北京链家小区信息). 注意本博客的代码适用于爬取某个城市的小区二手房房价信息. 如果需要爬取其他信息,可修改代码,链家的数据获取的基本逻辑都差不多. 效果展示 因为只需要60行 ...

  10. 基于Python的bilibili会员购数据爬取

    一.确定好需要爬取的网站 二.右键检查网页源码,找到所需要爬取的数据所在的位置 通过分析链接可得所需要爬取的数据都在这个页面,并且通过链接可以看到不通的页面page和不通的类型type之间都有差别,可 ...

最新文章

  1. Fedora 7 播放器totem
  2. 相同的字符串哈希值一样吗_关于哈希,来看这里!
  3. nginx+awstats多域名日志分析2
  4. 算法建模流程详解及python代码实现
  5. ping 工具开发日记(1)
  6. 读书笔记_打开量化投资的黑箱06
  7. 上海交通大学出版社python教材答案学生信息管理系统_学生信息管理系统任务书...
  8. bandgap带隙基准电路设计,cadence,
  9. 传统人工势场法的MATLAB实现
  10. 我的世界java材质包推荐下载_我的世界材质包排行-Minecraft材质包-我的世界高清材质包下载大全-Minecraft中文分享站...
  11. python 爬取视频ts文件_python爬取视频网站中video标签的m3u8文件与ts文件
  12. 小虎整合:电商浏览器插件工具常用的有哪些?在哪里可以找到?
  13. ARVR | AR技术发展简史(下)
  14. C++读书笔记:多态
  15. linux下载ccle数据,TCGA数据库下载,挖掘,Xena Browser可视化
  16. **将古典融汇到现代(二)一座连接蕴涵式和三段论的桥--皮尔斯逻辑之五**
  17. 【时间之外】10分钟搞懂Python+Tushare+Excel股票分析
  18. 大数据平台架构的层次划分
  19. SQLServer·面试题
  20. Origin C调用NAG库

热门文章

  1. GMap.NET控件使用
  2. Chrome手势插件
  3. Wifi OKC 验证
  4. 2021window10下的IDEA安装
  5. 电脑垃圾太多?这几个清理电脑的软件来看看吗?
  6. 什么是服务器CC攻击,被CC攻击了服务器怎么防护?
  7. webstorm导致CPU占用率高
  8. 零基础语法入门三十一讲[被动语态 (1)]被动语态的构成和含义
  9. ckfinder 配置 php,GitHub - itxq/ckfinder: CkFinder3.5.1 for PHP 优化版 (添加又拍云存储)...
  10. 3D建模和3D渲染吃什么硬件?专业图形显卡和游戏显卡区别