说真的,以前找POI数据挺让人头疼的。
做规划的朋友都知道,选址分析、商业布局,都离不开这些点位。但现实是,很多公开数据要么太旧,要么格式乱七八糟,根本没法直接用。
注意,爬数据这事儿,合规性得放第一位。
别一上来就猛爬。需要先看看网站的robots.txt,确认人家允不允许。有些网站会提供官方API,咱们优先使用API,别给人家服务器添负担。爬取频率也得控制,别把人家网站搞崩了。
操作这块儿,Requests加BeautifulSoup咱们就够用了。Scrapy适合大规模爬取,但入门门槛比较高,咱们先不搞那么复杂。
代码大概是这样的。
import requestsfrom bs4 import BeautifulSoupimport pandas as pdimport timeurl = 'https://example.com/poi'resp = requests.get(url, timeout=10)data = []doc = BeautifulSoup(resp.text, 'html.parser')for item in doc.select('.poi'): name = item.select_one('.name').text lat = item['data-lat'] lon = item['data-lon'] data.append({'name': name, 'lat': lat, 'lon': lon}) time.sleep(1) # 控制频率,别太快pd.DataFrame(data).to_csv('pois.csv', index=False)print(f'共获取{len(data)}个POI点位')爬下来的数据一般不能直接用。坐标格式可能不统一,有些点位会有重复,有些字段会缺失。得整理一遍。
import pandas as pddf = pd.read_csv('pois.csv')# 去重df = df.drop_duplicates()# 去除空值df = df.dropna()# 坐标转成浮点数df['lat'] = df['lat'].astype(float)df['lon'] = df['lon'].astype(float)# 导出GeoJSONimport geopandas as gpdfrom shapely.geometry import Pointgdf = gpd.GeoDataFrame(df, geometry=[Point(xy) for xy inzip(df['lon'], df['lat'])])gdf.to_file('pois.geojson', driver='GeoJSON')数据拿到手之后,选址分析就能快速更新了。
比如你想开个便利店,把周边小区、学校、地铁站的POI都爬下来,叠加到一起看看。哪块儿人流量大、哪块儿竞争少,一目了然。
那次帮朋友做选址,爬了三千多个点位,整理完直接扔进QGIS里看。半小时就出了初步方案,比以前手动收集快太多了。
把爬取脚本与数据处理模板存放在一个小脚本中,随时可以复用。