项目 - 学校爬虫项目
说明:学区房项目是私人项目,主要是爬取网络上的学校作为基础数据,给用户综合展示并且作为学区参考。
根据数据结构不同该项目分为爬取学校列表和学校详情两部分。这次出现内存泄露以及CPU飙升至卡死的情况是在爬取学校详情时出现的。该类问题在本地idea调试时不会出现,部署至线上才发生。
具体表现为爬取数据项目开启后不久,cpu使用率直接升至200%左右,不久项目即报错堆内存泄露。
-
解决办法一:启动项目时加大内存Xmx从原先的256m修改至2048m, Xss从128k修改至1024k;
启动后学校从开始拉取20个左右崩溃,坚持到拉取40个左右崩溃。治标不治本,解决失败。 -
解决办法二:从代码中找问题。
1> 经检查,在爬取学校详情中,使用Jsoup解析html时做了大量的css选择器获取数据,在选择css样式时使用了类似下图的css魔法值,因为详情涉及学校详情、学校评论、学校话题等相关数据,所以在优化完该解析类后将类私魔法值写成静态类共200余条。
部署上线后cpu仍然居高不下,在爬取200个学校左右崩溃,感觉快找到事情的真相了2> 继续检查代码,在解析网页获取html的代码中,发现问题。
我使用两种方法获取html数据:
第一种传统的创建httpClient去根据url获取html数据 ,优点没有多余日志,简单粗暴,应用广泛。缺点:无法获取网页上经过js获取数据后再渲染到网页的数据。
第二种WebClient获取,缺点是会打印好多不知所云的日志,至今我还没找到完全关闭这些日志的办法,目前只能关闭一大部分。优点就是可以解析网页上的js数据然后完全获取网页html,再供我继续使用jsoup去解析。就是在使用WebClient后没有调用close处理,参考
链接: Fix HtmlUnit Memory Leak.
目前项目可以正常爬取数据,但是还有遗留问题待解,通过使用分析jvm发现该项目full gc的频率很快,还需要进一步分析dump文件