自动检查内容是否更新

小孩马上要上幼儿园了,想第一时间获取相关的信息,又不想隔三差五的去打开网页看,这类简单重复的任务最好让适合让电脑来做了。


解决方案是怎样的呢?先说作废的方案。用wget抓取页面内容,然后通过比较页面的hash值来判断页面是否有修改,但是发现两个问题:

  • wget不支持javascript。现在大部分网页的内容都是动态生成的,不支持javascript是一个硬伤
  • 每次获取网页时,网页内容都包含微小的变化,这些变化基本上都是时间相关的。
    通过这个页面, How to get WGET to download exact same web page html as browser,可以看到替代方案。

最后采用的方案也很简单:以支持javascript的方式抓网页内容、分析是否有修改(目前比较简单的判断是否有指定的字符串)、输出结果。

  • 抓取页面代码,分析是否包含
import java.io.IOException;
import java.net.MalformedURLException;

import com.gargoylesoftware.htmlunit.FailingHttpStatusCodeException;
import com.gargoylesoftware.htmlunit.WebClient;
import com.gargoylesoftware.htmlunit.html.HtmlPage;

public class Crawler {
    public static void main(String[] args) throws FailingHttpStatusCodeException, MalformedURLException, IOException {
        java.util.logging.Logger.getLogger("com.gargoylesoftware").setLevel(java.util.logging.Level.OFF); /* comment out to turn off annoying htmlunit warnings */

        if (args.length < 2) {
            System.out.println("Please input url and keyword");
            return;
        }
        
        String url = args[0];
        String keywords = args[1];
        
        WebClient webClient = new WebClient();
        webClient.getOptions().setJavaScriptEnabled(true);  
        webClient.getOptions().setCssEnabled(false);
        
        HtmlPage page = webClient.getPage(url);
        
        webClient.close();
        
        String pageAsXml = page.asXml();
        if (pageAsXml.contains(keywords)) {
            System.out.println("Updated");
        } else {
            System.out.println("Not-Update");
        }
    }
}
  • 返回是否包含的结果

上面代码末尾的几行,就是判断是否包含指定内容并输出结果的语句。

if (pageAsXml.contains(keywords)) {
    System.out.println("Updated");
} else {
    System.out.println("Not-Update");
}
  • 自动执行

通过Windows的“任务计划程序”,添加一个定时的任务,执行的脚本如下:

cd /D "%~dp0"
set url="http://www.hkedu.sh.cn/HKEdu.Web/Default/InfoList.aspx?SignIn=true&CategoryID=061031a3-f95b-41dd-bee7-8e6634c0011e"
set keyword=2018
java -Dfile.encoding=GBK -classpath ..\bin;..\libs\htmlunit-2.29.jar;..\libs\httpclient-4.5.4.jar;..\libs\httpcore-4.4.7.jar;..\libs\commons-codec-1.10.jar;..\libs\commons-io-2.6.jar;..\libs\commons-lang3-3.7.jar;..\libs\commons-logging-1.2.jar;..\libs\commons-net-3.6.jar;..\libs\commons-text-1.2.jar;..\libs\cssparser-0.9.24.jar;..\libs\htmlunit-core-js-2.28.jar;..\libs\httpmime-4.5.4.jar;..\libs\jetty-client-9.4.8.v20171121.jar;..\libs\jetty-http-9.4.8.v20171121.jar;..\libs\jetty-io-9.4.8.v20171121.jar;..\libs\jetty-util-9.4.8.v20171121.jar;..\libs\jetty-xml-9.4.8.v20171121.jar;..\libs\neko-htmlunit-2.28.jar;..\libs\sac-1.3.jar;..\libs\serializer-2.7.2.jar;..\libs\websocket-api-9.4.8.v20171121.jar;..\libs\websocket-client-9.4.8.v20171121.jar;..\libs\websocket-common-9.4.8.v20171121.jar;..\libs\xalan-2.7.2.jar;..\libs\xercesImpl-2.11.0.jar;..\libs\xml-apis-1.4.01.jar Crawler %url% %keyword% > temp.txt
set /p result=<temp.txt
del temp.txt
if "%result%"=="Updated" msg * Updated

脚本中的url和keyword就是要检查的页面地址和关键字。

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 172,866评论 25 708
  • 我们长大,我们自律,我们有丰富的自我保护经验,肉体受伤的机率越来越小。 夜雨晨起,路面湿滑,骑车的我在研究车子铃铛...
    秋水长天MM阅读 655评论 0 0
  • 知道你不喜欢等待 我还是请求你 等我 等我把攒了几年的情话 都讲给你 等我把所有的温柔 都爱给你 等我把前世欠下的...
    阿狗蛋阅读 163评论 0 0
  • 1、这个世界上总有那么一个人,是你的念想,是你的温暖。 2、在爱的世界里,没有谁对不起谁,只有谁不懂得珍惜谁。 3...
    晗亲脉脉阅读 437评论 0 0