备忘:爬取poi代码

import sys
import time
import requests  
ty=sys.getfilesystemencoding()  #获取文件系统的编码形式
 
#基本参数设置:

ak='****************************' #替换为自己的key
place = r'公交站' #设为需要的poi
region='沧州市新华区'#设为需要的地区
print ('*******************{}POI开始获取****************'.format(place))
urls=[] #声明一个数组列表
for i in range(0,5):#里面的数字修改,以确定爬取的页数
    page_num=str(i)
    url=URL = 'http://api.map.baidu.com/place/v2/search?query='+place+'&region='+region+'&page_size=20&page_num='+str(page_num)+'&output=json&ak='+ak
    urls.append(url)
print ('url列表读取完成')
 
total_before = 0 
total = 0 # 获取总条数
label = 0 # 查看是否获取到数据的标志
count_20 = 0 # 查看每页超过20条的页数0.0.0.0/0
K = 0 # 运行出错的断点数,代表第多少次循环
 
urls = urls[K:] # 防止出现意外,比如在百度地图获取的数据达到上限,就会终止服务,这里的K主要是为了从当前断点处继续爬取,所以需要根据自己程序终止断点设置;
count_xunhuan = len(urls) # 循环次数
count_xunhuan2 = count_xunhuan # 还剩循环次数,主要让自己知道大概有多少循环,每次都打印下,对程序运行时间有个大致了解;

 
# 4. 创建文件以及将爬取到的数据读入文件
 
f=open(r''+place+'.csv','a',encoding='utf-8') # 根据爬取的POI类型创建文件
print("+++++++++++爬取需循环{}次++++++++++++".format(count_xunhuan))
h=1
for url in urls:
    #time.sleep(0.5) # 为了防止并发量报警,设置了一个10秒的休眠。认证后就不需要了
    html = requests.get(url) # 获取网页信息
    data = html.json() # 获取网页信息的json格式数据
    total_before = total
    h+=1
    print(h)
    for item in data['results']: 
        jname = item['name'] # 获取名称
        jlat = item['location']['lat'] # 获取纬度
        jlon = item['location']['lng'] # 获取经度
        jadd = item['address'] # 获取详细地址
        jpro = item['province'] # 获取所在省
        jcity = item['city'] # 获取所在城市
        jarea = item['area'] # 获取所在区或县
        j_str = jname + ',' + str(jlat) + ',' + str(jlon) + ',' + jadd + ',' + jpro + ',' + jcity + ',' + jarea + '\n' # 以逗号格式,将数据存入一个字符串
        f.write(j_str) # 将数据以行的形式写入CSV文件中
        total = total + 1 # 获取的数据记录数
        label = 1 # 表示每个小网格是否爬取到数据,如果为1,则表示获取到数据,执行下面的if语句,如果为0,则表示没有获取到数据;
    count_xunhuan2 = count_xunhuan2 - 1 # 循环次数减一,方便查看了解循环进度
    if label == 1:
        print("需循环{}次, 已循环{}次, 还剩{}次循环结束".format(count_xunhuan, count_xunhuan-count_xunhuan2, count_xunhuan2))
        print('新增{}条数据'.format(total-total_before))
        if total-total_before == 20:
                count_20 = count_20 + 1 
        print("---------已获取{}条数据----------".format(total))
    label = 0
print("每页新增超过20条的页数:{}".format(count_20))
f.close()
print ('*****************{}POI获取完成******************'.format(place))

 

posted @ 2023-09-23 11:08  Victooor_swd  阅读(37)  评论(0编辑  收藏  举报