zoukankan      html  css  js  c++  java
  • HtmlUnit+Jsoup 解决爬虫无法解析执行javascript的问题

    本人最近在研究爬虫。作为一个新手。研究了些爬虫框架,发现所有开源的爬虫框架很多,功能也很齐全,但唯独遗憾的是,目前还没有发现那个爬虫对js完美的解释并执行。看了浅谈网络爬虫爬js动态加载网页(二)之后很有感慨,首先对博主的钻研精神季度敬佩。虽然该文中第二和第三种方案不怎么靠谱,但能想到这些方案,说明博主的思维发散性很强,不会局限于单方向钻牛角尖式的思考。不过很遗憾,因为我就是这样的人。我始终觉得博主对于HtmlUnit的了解不够深入(也可能是我的误解)。于是就开始钻牛角尖了。看了HtmlUnit的简介之后,我有一种预感,认为HtmlUnit没理由不能支持Js的自动解释于执行,事实证明了我的想法。 废话多说无益,

    这里拿地址【http://cq.qq.com/baoliao/detail.htm?294064】来测试,通过查看该页面源码,可以发现,该页面文章标题,内容,浏览量都是采用占位符的形式,在页面加载时,通过js替换之,下面代码获取该文章浏览量字段。

    public void testCrawler() throws Exception {  
            /**HtmlUnit请求web页面*/  
            WebClient wc = new WebClient();  
            wc.getOptions().setJavaScriptEnabled(true); //启用JS解释器,默认为true  
            wc.getOptions().setCssEnabled(false); //禁用css支持  
            wc.getOptions().setThrowExceptionOnScriptError(false); //js运行错误时,是否抛出异常  
            wc.getOptions().setTimeout(10000); //设置连接超时时间 ,这里是10S。如果为0,则无限期等待  
            HtmlPage page = wc.getPage("http://cq.qq.com/baoliao/detail.htm?294064");  
            String pageXml = page.asXml(); //以xml的形式获取响应文本  
      
            /**jsoup解析文档*/  
            Document doc = Jsoup.parse(pageXml, "http://cq.qq.com");   
            Element pv = doc.select("#feed_content span").get(1);  
            System.out.println(pv.text());  
            Assert.assertTrue(pv.text().contains("浏览"));  
      
            System.out.println("Thank God!");  
        } 

    附上maven配置:

    <dependency>  
    <!-- jsoup HTML parser library @ http://jsoup.org/ -->  
    <groupId>org.jsoup</groupId>  
    <artifactId>jsoup</artifactId>  
    <version>1.7.2</version>  
    </dependency>  
    <dependency>  
    <groupId>net.sourceforge.htmlunit</groupId>  
    <artifactId>htmlunit</artifactId>  
    <version>2.13</version>  
    </dependency>  

    更多信息请查看个人博客:http://www.iamcoder.net

  • 相关阅读:
    Kubernetes Dashboard不能用谷歌浏览器登录,只能用火狐浏览器登录的问题。
    kubernetes集群(centos7)
    监控java进程是否正常运行
    电脑上文件的后缀名被隐藏,把一个文本文件改成.bat时,默认打开的还是文本。
    光猫&路由器网络配置
    python3查询Excel中A表在B表没有的数据,并保存到新的Excel,这里用的是“xlrd”和“xlwt”
    linux服务开机启动
    python_字符串,元组,格式化输出
    adb命令
    jenkins发送邮件
  • 原文地址:https://www.cnblogs.com/StruggleBird/p/3373350.html
Copyright © 2011-2022 走看看