自动检查内容是否更新

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


解决方案是怎样的呢?先说作废的方案。用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=

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

你可能感兴趣的:(自动检查内容是否更新)