备忘:爬取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+'®ion='+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))