说明:仅供学习使用,请勿用于非法用途,若有侵权,请联系博主删除
作者:zhu6201976
一、需求背景
因业务发展,需获取全美(或任意国家)所有POI(标记点)信息,包括mark_id、mark_name、address、number、country、state、city、industry、category、url等信息。
二、实现方式
1. google map API
文档地址:https://developers.google.com/maps/documentation/places/web-service/overview?hl=zh-cn
优点:难度低、爬取速度快、稳定可靠
缺点:流量受限(每月赠送$200 需要更多需付费)、大陆无法注册(不支持中国大陆银行卡)
此处不得不吐糟一点:google为何总要针对我们天朝上国?连一些非洲小国都支持注册,却没有China这个选项!!!
发邮件与官方进行沟通,仍没有得到有效解决(硬性条件:非大陆银行卡/信用卡)
2. 爬虫方式获取
原理:通过瓦片地图,得到任意国家经纬度范围,循环遍历经纬度逐一进行扫描,得到mark_id和mark_name。再根据详情url,获取POI详情即可。
优点:无流量限制、爬取速度快、稳定可靠
缺点:实现难度较大、需要专业分析能力、海量代理池 + 机器
瓦片地图参考资料:https://github.com/iewoai/GoogleMap_Spider
以下是美国瓦片地图缩放层级为22时经纬度范围获取样例代码:
def gen_xy_range_gen(n: int = 1) -> Iterator:
"""
返回地图缩放层级s时 美国瓦片坐标(x,y) 取值范围
:param n: 获取多少个
:return: Iterator
"""
if not 0 < n < 23:
raise ValueError('n must between [1, 22]')
scale = {'x_range': US_X_RANGE, 'y_range': US_Y_RANGE}
for s in range(1, n + 1):
scale_factor = 2 ** (s - 20)
next_x_range = tuple(int(x * scale_factor) for x in scale['x_range'])
next_y_range = tuple(int(y * scale_factor) for y in scale['y_range'])
next_scale = {'s': s, 'x_range': next_x_range, 'y_range': next_y_range}
yield next_scale