在网上找了很多关于爬取百度POI的文章,但是对“全量”的做法并没有得到最终的解决方案,自己写了一个,但还是不能实现全量POI抓取,能够达到至少50%的信息抓取。
注意:这里所指“全量”是能够达到100%的POI信息获取。
以下是自己写的代码可直接复制粘贴使用,只针对重庆主城区的。

# -*- coding: utf-8 -*-
#-----------------采集全重庆范围内的POI兴趣点-------------------
import requests
import json
import xlrd
import pandas as pd
import pymysql
import time

def sleeptime(day=1): # 默认参数智能放最后
return day * 24 * 3600

def get_Region():
#'重庆市渝中区',
region = ['重庆市渝中区','重庆市江北区','重庆市渝北区','重庆市沙坪坝区','重庆市九龙坡区',
'重庆市南岸区','重庆市巴南区','重庆市北碚区','重庆市大渡口区']

lng_lat = {'重庆市渝中区':'29.525375,106.494032,29.582745,106.602727', #重庆市渝中区的矩形区域左下角和右上角的经纬度(可参看百度文档对矩形区域的解释)
'重庆市江北区':'29.571878,106.440282,29.689841,106.896587', #左下:106.440282,29.571878
'重庆市渝北区':'29.575192,106.434211,30.051651,106.993128', #右上106.993128,30.051651
'重庆市沙坪坝区':'29.497572,106.261671,29.755899,106.51607', #106.275683,29.497572
'重庆市九龙坡区': '29.248442,106.275683,29.574961,106.553261',
'重庆市南岸区':'29.476615,106.542511,29.614757,106.803882',
'重庆市巴南区':'29.118686,106.520931,29.735054,107.062741',
'重庆市北碚区':'29.66131,106.29192,30.109513,106.720972',
'重庆市大渡口区':'29.344094,106.403174,29.509104,106.532859'}

#'重庆市渝中区':'29.525375,106.494032,29.582745,106.602727', #右上 106.597337,29.578724
# '重庆市江北区':'29.571878,106.440282,29.689841,106.896587', #左下:106.440282,29.571878
# '重庆市渝北区':'29.575192,106.434211,30.051651,106.993128', #右上106.993128,30.051651
# '重庆市沙坪坝区':'29.497572,106.261671,29.755899,106.51607', #106.275683,29.497572
#'重庆市九龙坡区':'29.248442,106.275683,29.574961,106.553261'#, #106.275683,29.248442,106.553261,29.574961
# '重庆市南岸区':'29.476615,106.542511,29.614757,106.803882',
# '重庆市巴南区':'29.118686,106.520931,29.735054,107.062741',
# '重庆市北碚区':'29.66131,106.29192,30.109513,106.720972',
# '重庆市大渡口区':'29.344094,106.403174,29.509104,106.532859'}#各行政区左下右上经纬度
return region,lng_lat

#
# 左下角: [29.547183, 106.545379]
# 右上角: [29.5560735, 106.559716]

def get_Keyword():
#path =r'E:\Project\电子围栏\Data\兴趣点.xlsx'
#data = pd.read_excel(path,sheet_name='keyword2')
data = ['酒店','公司']
return data

def get_ak():#改成你自己的ak
ak = ['xYhFWBgDCF12nPU5v2pMue5uN14d****',
'nryXXcwxdwGws64qmB9jFE29yY6P****',
'tP4RTTuWu0Rds81Hvm0Mn9QXajBs****',
'GP12Wh7S1pM1oa4oNyib7xByol5X****']
return ak

def get_Url(data,region,lng_lat,aks,connect):

url_POI = 'http://api.map.baidu.com/place/v2/search?'
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/53.0.2785.143 Safari/537.36'
}
ak_num = 0
ak = aks[ak_num]
payload = {'output': 'json'}
payload['ak'] = ak
payload['city_limit'] = 'true' #区域数据限制(只返回指定区域的信息)
payload['scope'] = '2' # 返回详细信息,1或空为基本信息
payload['page_size'] = '20' #每一页最多返回20个兴趣点
for i in range(len(region)):
payload['region'] = region[i] #指定行政区域名称
trapeze = lng_lat[region[i]].split(',') #指定行政区的左下右上经纬度 trapeze 经纬度格

#以下是将一个行政区(大矩形)划分为多个矩形网格,获取大于400个兴趣点的返回值
left_bottom = [trapeze[0],trapeze[1]] #左下角坐标
right_top = [trapeze[2],trapeze[3]] #右上角坐标
part_n = 20; #网格切割数量,20*20=400 可根据行政区域的大小调整网格数量

x_item = (float(right_top[0]) - float(left_bottom[0])) / part_n; #纬度平均分割大小
print(x_item)
y_item = (float(right_top[1]) - float(left_bottom[1])) / part_n; #经度平均分割大小
print(y_item)
for key in range(len(data['keyword'])):
payload['query'] = data['keyword'][key] #指定查询关键字
#print(data['keyword'][key])
for ii in range(part_n): # 遍历横向网格
for jj in range(part_n): # 遍历纵向网格
#以下left_bottom_part、right_top_part认真理解
left_bottom_part = [float(left_bottom[0]) + ii * x_item, float(left_bottom[1]) + jj * y_item]; #切片的左下角坐标
right_top_part = [float(right_top[0]) - (part_n-1-ii) * x_item, float(right_top[1]) - (part_n-1-jj) * y_item]; # 切片的右上角坐标
for page_num in range(20): #接口最多返回20页
payload['page_num'] = page_num
payload['bounds']=str(left_bottom_part[0]) + ',' + str(left_bottom_part[1]) + ',' + \
str(right_top_part[0])+','+str(right_top_part[1])
#print(payload)
try:
content = requests.get(url_POI,params=payload,headers=headers).json()
#print(content)
if content['status'] == 0: #能够正常返回值
if content['results']:
storeTomysql(content, data['keyword'][key], connect,region[i])#存放数据库
else:
break
else:
if content['status'] == 302: # 如果ak配额用完
print('第' + str(ak_num) + '个ak配额用完,自动调用下一个····')
ak_num = ak_num+1
if ak_num>(len(aks)-1):
print('今天ak已用完,明天再继续吧。。。')
time.sleep(sleeptime()) #程序休眠24小时
ak_num = 0
ak = aks[ak_num]
payload['ak']=ak
content = requests.get(url_POI, params=payload, headers=headers).json()
if content['status']==0:
if content['results']:
storeTomysql(content,data['keyword'][key],connect,region[i])
else:
break #为空则跳出本层循环
else:pass
else:
ak = aks[ak_num]
payload['ak'] = ak
content = requests.get(url_POI, params=payload, headers=headers).json()
if content['status']==0:
if content['results']:
storeTomysql(content,data['keyword'][key],connect,region[i])
else:
break
else:pass
else:
pass #其他错误
# print(content)

except Exception as e:
print(e)

def mysql_Detail():
# 使用的mysql数据库
connect = pymysql.Connect(host='localhost', port=3306, user='root', passwd='更改为你的密码',
db='addr_trans', charset='utf8')
return connect

def storeTomysql(content,Key_word,connect,region):
#在 content 中提取详细信息
# print('test01')
cursor = connect.cursor()
# if content['results']:
for h in range(len(content['results'])): # 遍历返回地点
name = content['results'][h]['name']
lng = content['results'][h]['location']['lng']
lat = content['results'][h]['location']['lat']

if 'area' in content['results'][h].keys():
area = content['results'][h]['area']
else:
area = None
if 'address' in content['results'][h].keys():
address = content['results'][h]['address']
else:
address = None
if 'province' in content['results'][h].keys():
province = content['results'][h]['province']
else:
province = None
if 'city' in content['results'][h].keys():
city = content['results'][h]['city']
else:
city = None
if 'telephone' in content['results'][h].keys():
telephone = content['results'][h]['telephone']
else:
telephone = None
if 'uid' in content['results'][h].keys():
uid = content['results'][h]['uid']
else:
uid = None
if 'street_id' in content['results'][h].keys():
street_id = content['results'][h]['street_id']
else:
street_id = None
if content['results'][h]['detail'] == 1:
if 'type' in content['results'][h]['detail_info'].keys():
type0 = content['results'][h]['detail_info']['type']
else:
type0 = None
if 'tag' in content['results'][h]['detail_info'].keys():
tag = content['results'][h]['detail_info']['tag']
else:
tag = None
else:
type0 = None
tag = None

if area == region[3:]:#区域相符才存数据
try:
sql = "insert into poi_full(keyword,name0,lng,lat,address,province,city,area,telephone,uid,street_id,type0,tag) " \
"VALUES ('%s','%s','%s','%s','%s','%s','%s','%s','%s','%s','%s','%s','%s')"
data0 = (Key_word,name,lng,lat,address,province,city,area,telephone,uid,street_id,type0,tag)
cursor.execute(sql % data0)
connect.commit()
except Exception as e:
print(e)
else:pass
cursor.close()

if __name__ == "__main__":
aks = get_ak()
keyword = get_Keyword()
region,lng_lat = get_Region()
connect = mysql_Detail()
get_Url(keyword, region, lng_lat,aks,connect)
connect.close()

---------------------
作者:Seven_047
来源:CSDN
原文:https://blog.csdn.net/Seven_047/article/details/81476924
版权声明:本文为博主原创文章,转载请附上博文链接!

python 爬取全量百度POI的更多相关文章

  1. Python 爬取陈都灵百度图片

    Python 爬取陈都灵百度图片 标签(空格分隔): 随笔 今天意外发现了自己以前写的一篇爬虫脚本,爬取的是我的女神陈都灵,尝试运行了一下发现居然还能用.故把脚本贴出来分享一下. import req ...

  2. python 爬取全本免费小说网的小说

    这几天朋友说想看电子书,但是只能在网上看,不能下载到本地后看,问我有啥办法?我找了好几个小说网址看了下,你只能直接在网上看,要下载txt要冲钱买会员,而且还不能在浏览器上直接复制粘贴.之后我就想到py ...

  3. 百度地图POI数据爬取,突破百度地图API爬取数目“400条“的限制11。

    1.POI爬取方法说明 1.1AK申请 登录百度账号,在百度地图开发者平台的API控制台申请一个服务端的ak,主要用到的是Place API.检校方式可设置成IP白名单,IP直接设置成了0.0.0.0 ...

  4. python爬取某个网页的图片-如百度贴吧

    python爬取某个网页的图片-如百度贴吧 作者:vpoet mail:vpoet_sir@163.com 注:随意copy,不用告诉我 #coding:utf-8 import urllib imp ...

  5. Python 爬取途虎养车 全系车型 轮胎 保养 数据

    Python 爬取途虎养车 全系车型 轮胎 保养 数据 2021.7.27 更新 增加标题.发布时间参数 demo文末自行下载,需要完整数据私聊我 2021.2.19 更新 增加大保养数据 2020. ...

  6. 没有内涵段子可以刷了,利用Python爬取段友之家贴吧图片和小视频(含源码)

    由于最新的视频整顿风波,内涵段子APP被迫关闭,广大段友无家可归,但是最近发现了一个"段友"的app,版本更新也挺快,正在号召广大段友回家,如下图,有兴趣的可以下载看看(ps:我不 ...

  7. python爬取网站数据保存使用的方法

    这篇文章主要介绍了使用Python从网上爬取特定属性数据保存的方法,其中解决了编码问题和如何使用正则匹配数据的方法,详情看下文     编码问题因为涉及到中文,所以必然地涉及到了编码的问题,这一次借这 ...

  8. Python 爬取 热词并进行分类数据分析-[解释修复+热词引用]

    日期:2020.02.02 博客期:141 星期日 [本博客的代码如若要使用,请在下方评论区留言,之后再用(就是跟我说一声)] 所有相关跳转: a.[简单准备] b.[云图制作+数据导入] c.[拓扑 ...

  9. Python爬取微信小程序(Charles)

    Python爬取微信小程序(Charles) 本文链接:https://blog.csdn.net/HeyShHeyou/article/details/90045204 一.前言 最近需要获取微信小 ...

随机推荐

  1. C++为啥要使用new

    1.为什么要有new? 为什么要有new?为什么要动态创建对象?为什么有时候不用new,有时候又用new,比如: // Cocos2d-x3.x的Value类,大家都很熟悉了 Value v = Va ...

  2. UML基础 UML对象图解析

    本节向大家介绍一下UML对象图方面的内容,主要包括UML对象图概念介绍,表示法和用途等,希望通过本节的介绍大家对UML对象图有全面的认识,下面让我们一起来学习吧. UML对象图简介 对象图(Objec ...

  3. Linux CentOS Nginx安装配置

    Nginx("engine x")是一款是由俄罗斯的程序设计师Igor Sysoev所开发高性能的 Web和 反向代理 服务器,也是一个 IMAP/POP3/SMTP 代理服务器. ...

  4. 桥接模式(Bridge)

    1.概念 桥接模式将抽象部分与它的实现部分分离,使它们都可以独立地变化,属于结构性模式的一种. 2.模式结构 Abstraction(抽象类):定义抽象接口,拥有一个Implementor类型的对象引 ...

  5. Oracle Index 索引无效原因

    索引无效原因 最近遇到一个SQL语句的性能问题,修改功能之前的运行时间平均为0.3s,可是添加新功能后,时间达到了4~5s.虽然几张表的数据量都比较大(都在百万级以上),但是也都有正确创建索引,不知道 ...

  6. HDU1160(KB12-J DP)

    FatMouse's Speed Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) ...

  7. 【 js 基础 】【读书笔记】作用域和闭包

    一.编译过程 常见编译性语言,在程序代码执行之前会经历三个步骤,称为编译. 步骤一:分词或者词法分析 将由字符组成的字符串分解成有意义的代码块,这些代码块被称为词法单元. 例子:  var a = 2 ...

  8. PHP定界符<<<eof 使用

    PHP是一个Web编程语言,在编程过程中难免会遇到用echo来输出大段的html和javascript脚本的情况,如果用传统的输出方法 ——按字符串输出的话,肯定要有大量的转义符来对字符串中的引号等特 ...

  9. css3 flex弹性盒子布局梳理,打通任督二脉

    挺早就接触了css的flex布局,深入使用也就是在近期移动端开发.老来多健忘,只能自己梳理一下知识点,当做温故知新吧. ,请原谅小白的才疏学浅,写的不到位的地方请指正. flex属性用于设置或检索弹性 ...

  10. python 生成器 和生成器函数 以及各种推导式

    一.生成器    本质就是迭代器. 我们可以直接执⾏__next__()来执⾏ 以下⽣成器 一个一个的创建对象 创建生成器的方式: 1.生成器函数 2.通过生成器 表达式来获取生成器 3.类型转换(看 ...