之前用Python调用谷歌API抓取POI,但是调用API要收费,所以研究了如何免费抓取POI;
由于公司是内网,这里只说下我的抓取方法;
项目采用Python+selenium+browsermobproxy开发;
首先通过调用浏览器,访问谷歌地图;
根据坐标范围计算中心点坐标;
拼接搜索URL:https://www.google.com.hk/maps/search/' + search_key + '/@' + str(zb_center[1]) + ',' + str(zb_center[0]) + ',11z?hl=zh-cn
search_key:你要搜索的关键字
zb_center[1]:中心点坐标Y
zb_center[0]:中心点坐标X
这样就可以获取地图左边的分页数据;
如何获取每个查询结果的真实坐标?
这里说下我遇到过的坑,以免大家走弯路:
(1)访问搜索后,点击等级按钮,放大到19级,获取当前坐标,此法不可行,因为获取的坐标不精准;
(2)直接通过详情页的url获取坐标,此法不可行,因为获取的坐标不精准;
(3)模拟鼠标右键,获取真实坐标,虽然可以获取真实坐标,但是无法找到当前详情项的地图位置,除非截图当前页面,然后通过图片识别找到对应的关键字,然后找到像素坐标,
最后再模拟鼠标点击右键,此过程太复杂,而且不能百分之百保证能获取真实坐标;
(4)打开F12,发现搜索的时候,会调用search方法,返回的JSON文本里面包含了真实坐标,通字符串和正则表达式,去掉前面和后面的干扰文字,最后得到一个完整的JSON,此方法可行;
但是如何获取debug模型下的ajax请求呢?
我们通过browsermobproxy代理软件,在python程序里获取所有的隐式url请求,然后过滤所有的search请求,再requests.get(url)获取json数据,最后存到数据库;