红颜弹指老,刹那芳华-程灵素

我走过山的时候山不说话,我路过海的时候海不说话;

我坐着的毛驴一步一步滴滴答答,我带着的倚天喑哑。

大家说我因为爱着杨过大侠,找不到所以在峨嵋安家;

其实我只是喜欢峨嵋的雾,像十六岁那年绽放的烟花。

我路过海的时候海不说话,我走过山的时候也听不到回答;

我骑的毛驴步步滴滴答答,悠悠飘向远处可从不想要回家。

正当喜乐无忧年韶华如花,远游风尘之色却不似十九风华;

愁思袭人无计回避真牵挂,不知天涯何处有那我思念的他。

没半点音讯怎续风陵夜话,见不到大哥哥愿知他如何行侠;

上少室山想找无色问一下,老禅师亦不知他是在何处为家。

闻琴声似和鸟语交相应答,百鸟朝凤曲难道还有人能抚它?

白衣男子划了一画又一画,不是剑法是痴迷在那棋子围杀。

旁观者清一语道破危难局,我弹奏古曲留下了他独自惊讶;

高歌一曲轻身去不想其它,屈指昆仑三圣闯少林又有何法?

三个老者连骑而来又回转,以为是留书之人却是少林俗家;

他从石亭顶抱着瑶琴落下,教训了青脸人只为他将我威吓;

在亭上听了我和三人对答,其实他也不知名满天下的爹妈;

这人姓何,双名叫作足道,名字谦逊得哪有半点狂妄自大?

琴剑棋三绝技艺冠绝西域,昆仑三圣并非三人就是一个他;

抱着瑶琴到处找我为新曲,丰瞻华美奇妙调和考盘与蒹葭;

伊人难道是我,思慕如霞,右手弹琴左手使剑退敌亦惆杂。

从万里远赶来原为送句话,什么经书是在油中好让觉远拿;

平生足迹未履中土乘此游,路上碰到三个西域少林要比划;

非逼他去了剑圣名头不可,反正上少林寺一番做教我猜岔。

萍聚缘和山花与风的烂漫,我怎会不知自己是他心中的她?

若是真能为我再重弹一曲,或许我大哥哥找不到还有个他;

他那张嘴会说话可真不假,凭片言折服老和尚请我进奉茶;

为我一句话愿意不来打架,比剑嫌霸道青石板上把棋盘划。

觉远擦掉棋盘又将他剑夹,君宝斜击一掌他没能分身招架;

他誓用十招将这少年打发,虽取巧让君宝倒下也算输此架。

足尖一点身已在数丈之外,传完话就走人怎么忘了叫上咱?

挑着张君宝和我觉远迅跑,到深山里面疲累过度圆寂坐化;

让伤心的少年去找我爹妈,自己却不知何去何从心乱如麻。

不是为杨过才在峨眉住下,我喜欢峨眉的雾像那年的烟花;

我身上佩的倚天宝剑暗哑,昆仑何足道心头定未将我丢下;

自少林飘然远去不再回头,他潇洒的身影为何却泪如雨下?

方法内统计耗时的几种方法

1、自己写,计时开始结束使用System.currentTimeMillis()

long start = System.currentTimeMillis();
TimeUnit.SECONDS.sleep(3L);
System.out.println(“method finish , use time ” +(System.currentTimeMillis() – start) + “ms”);

2、使用StopWatch类来实现

StopWatch类有不同的实现,spring有一个,guava也有一个,具体使用根据自己项目的依赖情况。真正使用上基本一致。

使用方式:

System.out.println(“SLAMonitorThread.main() start”);
StopWatch sw = new StopWatch();
sw.start();
TimeUnit.SECONDS.sleep(1L);
sw.split();
System.out.println(
“SLAMonitorThread.main() end. split:” + sw.getSplitTime() + “, ” + sw.toSplitString());
TimeUnit.SECONDS.sleep(1L);
sw.split();
System.out.println(
“SLAMonitorThread.main() end. split:” + sw.getSplitTime() + “, ” + sw.toSplitString());
TimeUnit.SECONDS.sleep(1L);
sw.split();
System.out.println(
“SLAMonitorThread.main() end. split:” + sw.getSplitTime() + “, ” + sw.toSplitString());
TimeUnit.SECONDS.sleep(1L);
System.out.println(“SLAMonitorThread.main() end. end:” + sw.getTime() + “, ” + sw.toString());
long start = System.currentTimeMillis();
TimeUnit.SECONDS.sleep(1L);

两种方式的优缺点:
方式1是不用任何外部依赖就可以实现的,但是缺点也同样明显,每个位置要打印一次的时候,都需要自己计算,并且还要重新拿到开始时间。
方式2则正好相反,需要guava的依赖,但是好处是提供了比较常用的接口支持,在不同的位置统计,并且计算一些东西,比如某一段耗时占比之类的,都可以友好支持。

具体使用时根据自己情况即可。

链家小区坐标爬取

之前已经爬取了链家小区的一些基本信息,主要是列表里的内容。但是这里面没有我最需要的数据之一:小区坐标,于是开始重新找。 首先发现小区详情页面是有地图的,根据经验,如果有地图的定位,在页面上肯定有坐标。地图是百度地图,正好是我需要的百度经纬度坐标体系。 自己找的时候走了一些弯路,但是我觉得这也应该是没有经验的情况下的正确查找路子。 我是首先打开开发者页面,然后看点击地图的时候发起的请求,点击地图,放大缩小,看发起的请求里有没有坐标。遗憾的是没能找到,也许是我漏掉了。但是我知道页面一定有,否则这里调用地图的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]); });至此,获取小区坐标就完成了,然后顺利跑完交差。