链家小区坐标爬取

之前已经爬取了链家小区的一些基本信息,主要是列表里的内容。但是这里面没有我最需要的数据之一:小区坐标,于是开始重新找。 首先发现小区详情页面是有地图的,根据经验,如果有地图的定位,在页面上肯定有坐标。地图是百度地图,正好是我需要的百度经纬度坐标体系。 自己找的时候走了一些弯路,但是我觉得这也应该是没有经验的情况下的正确查找路子。 我是首先打开开发者页面,然后看点击地图的时候发起的请求,点击地图,放大缩小,看发起的请求里有没有坐标。遗憾的是没能找到,也许是我漏掉了。但是我知道页面一定有,否则这里调用地图的api进行定位的时候显然是不行的。 在我查看源码,从详情页整理小区数据的时候,偶然看到,我不需要的一部分数据里:附近门店 的信息里,隐藏着小区的坐标。如下图所示

很开心,这么容易就找到了。 于是写代码,将这部分数据洗出来,代码如下: countStr = locationInfoItem.selectFirst(“span[class=xiaoquInfoContent]”).text();String locationInfo = locationInfoItem.selectFirst(“span[class=xiaoquInfoContent]”).selectFirst(“span[class=actshowMap]”).attr(“xiaoqu”); locationInfo = locationInfo.replace(“[“, “”).replace(“]”, “”); entity.setLocationJingDu(locationInfo.split(“,”)[0]);entity.setLocationWeiDu(locationInfo.split(“,”)[1]);由于前面已经跑完小区的基本信息了,小区详情页面的地址也已经保存下来了,于是直接把这些数据重新跑一遍,根据详情页面爬取坐标数据,以为于是就完事儿了 然而,到最后发现,总是有那么百十个小区,解析总是失败的。观察日志,发现请求是正常的并且成功的,如果是被反爬虫了按照我这换ip的频率,也不应该一直失败的,肯定代码原因咯。 没办法,debug大法。调试到获取坐标这块的时候,异常了,仔细观察发现,有的小区是没有附近的门店的!没有的时候,我的解析坐标的部分就会异常。 那咋办?找到一个正常的页面,然后找到附近门店那里的坐标数字,然后全页面搜索,果然不服所望,还有个地方存着坐标!如图所示

然后到没有附近门店的页面去验证,果然也有!这下好了。 改代码对 附近门店 这里做个判断,如果是  暂无门店信息 ,那就去找js标签,然后从中提取坐标。因为比较好找,我的数据又比较少,懒得用正则了,直接split完事儿。上代码 Elements scriptElements = doc.select(“script”); String shopLatLng = “”; for (Element element : scriptElements) {    shopLatLng = element.html();    if (shopLatLng.contains(“resblockPosition”)) {       break;    } }shopLatLng = shopLatLng.split(“require\\(\\[‘ershoufang/xiaoquDetail/index’], function\\(main\\) \\{\n” +”  main\\(“)[1].split(“\\);\n” +”\\}\\);”)[0]; ResBlock resBlock = JsonUtil.of(shopLatLng,ResBlock.class); Optional.ofNullable(resBlock).ifPresent(x->{   entity.setLocationJingDu(x.getResblockPosition().split(“,”)[0]);    entity.setLocationWeiDu(x.getResblockPosition().split(“,”)[1]); });至此,获取小区坐标就完成了,然后顺利跑完交差。