项目背景
我们公司需要去爬取某网站的数据,但是某网站的反爬虫设置太牛逼了,经过调研现有的爬虫框架都无法满足需求。对方的反爬虫机制是这样的:第一次请求会检查你的cookie是否正确,如果不正确会返回一个html给你。找个html包含了一段加密的js脚本,通过这个脚本设置cookie信息,然后再次重复发送请求获取我们需要的数据。cookie本身有超时机制,js脚本也是随机变化的。
经过研究,我们决定采用java+PhantomJs的方式抓取该网站的数据信息。PhantomJs作为一个无界面浏览器,如果执行完请求不能正确关闭线程会导致内存急速消耗的。而我们正是遇到了这样的问题。部分线程因为超时或者其他异常原因,导致PhantomJs线程不能正确的关闭。达到一定的量时会导致系统崩溃。
解决方案
我们的目标就是通过kill掉这一部分不能正常关闭的线程,释放系统内存。
于是我们编写了一个.sh脚本,通过这个脚本定时的kill掉那些超过一定时间仍未关闭的线程。
.sh脚本
#!/bin/bash
p_name=phantomjs
pro="$(ps -A|grep "$p_name"|head -n1)"
time="$(echo $pro|awk '{
split($3,tab,/:/); if (tab[2]+tab[1]*60>=1) {print 1}else{print 0}
}')"
pid="$(echo $pro|awk '{print $1}')"
echo $time
if [ $time = '1' ]
then
kill -9 $pid
fi
备注
在执行脚本的过程中,有的同学也是会提示错误
-bash: ./killPhantomJs.sh: /bin/sh^M: bad interpreter: No such file or directory
这个问题的原因是由于我们的.sh文件是在win环境下编辑后上传到linux执行的。
在linux系统只能执行格式为unix格式的脚本,而win环境下编辑的.sh脚本默认格式为doc格式。
执行vi命令,通过:set ff命令查看文件格式为:fileformat =doc
:set ff
我们需要将脚本的格式改为linux系统能够识别的文件
:set ff=unix
保存退出后,再次执行就不会有错误提示了