ajax动态网页抓取学习总结

最近对网页的抓取进行了一些研究,针对于ajax生成的数据在源码中是没法呈现出来的,经过普通的网页爬取是采集不到的,所以须要一些特殊的处理。经过上网查找资料以及调查,在此简单的总结一下。我用的编程语言是Javahtml

1.对于简单的或者对性能要求不高的状况,咱们能够经过一些工具来模拟浏览器来实现。如:CasperjsHtmlUnit等。java

最近简单的研究了一下casperjs,对于官方的文档我表示写的不太详细,对于初学者学习来说,我以为是有必定难度的并且对于它的传播来讲也是不利的。可是仍是感受挺有意思的。咱们能够按照他的语法来获得Document,甚至咱们能够经过写jsjquery的代码来实现内容的提取。而后经过java来调用这些脚本,将结果返回。或者咱们能够直接调用它将完整的网页源码返回,而后经过模板来统一解析咱们想要的结果。不过这种状况在网页的抓取上是秒级的。所以这种状况不能保证其性能。node

2.第二种是对网页进行分析,模拟规则来提取所需的内容。jquery

对于这一块对于初学抓取的咱们来讲,是有必定的难度的。并且对于网页的发出的请求,咱们是须要借助一些工具的,如httpwatch。好比,你想对天猫的价格进行分析,能够先经过httpwatch来分析网页的请求,而后再定位到价格数据的请求连接,最后经过它来模拟请求获得数据,这样咱们就提取到咱们想要的内容了。web

使用httpclient来爬取网页的内容是很快的,抓取效率在毫秒级。所以,从效率角度采用这种方式比较合适。可是从灵活性的角度来考虑问题的话,可能会有必定的限制。ajax


补充:htmlunit 加载动态网页以提取天猫价格为例编程

package com.asiainfo.test;

import java.io.IOException;
import java.net.MalformedURLException;

import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.select.Elements;
import org.junit.Test;

import com.gargoylesoftware.htmlunit.BrowserVersion;
import com.gargoylesoftware.htmlunit.FailingHttpStatusCodeException;
import com.gargoylesoftware.htmlunit.NicelyResynchronizingAjaxController;
import com.gargoylesoftware.htmlunit.ProxyConfig;
import com.gargoylesoftware.htmlunit.WebClient;
import com.gargoylesoftware.htmlunit.WebClientOptions;
import com.gargoylesoftware.htmlunit.html.HtmlElement;
import com.gargoylesoftware.htmlunit.html.HtmlPage;

public class HttpUnitTest {
    String url = "http://detail.tmall.com/item.htm?spm=0.0.0.0.HkxFxe&id=520129049356";

    @Test
    public void test2() {

        // 指定浏览器,并指定浏览器模拟的版本;注:指定了浏览器的版本了以后,解析js就不报错了
        WebClient webClient = new WebClient(BrowserVersion.CHROME);

        // webclient参数载体
        WebClientOptions clientOptions = webClient.getOptions();
        ProxyConfig proxyConfig = new ProxyConfig();
        proxyConfig.setProxyHost("proxy.asiainfo.com");
        proxyConfig.setProxyPort(8080);

        // 设置webClient的相关参数
        clientOptions.setJavaScriptEnabled(true);
        clientOptions.setCssEnabled(false);
        clientOptions.setTimeout(10000);
        clientOptions.setThrowExceptionOnScriptError(false);
        clientOptions.setProxyConfig(proxyConfig);
        webClient.setAjaxController(new NicelyResynchronizingAjaxController());

        // 模拟浏览器打开一个目标网址
        HtmlPage rootPage;
        try {
            rootPage = webClient.getPage(url);
            // body html信息
            HtmlElement htmlElement = rootPage.getBody();
            String xmlContent = htmlElement.asXml();
            System.out.println(xmlContent);

            // 测试js生成的部分是否加载成功 注:天猫的价格是动态生成的
            Document doc = Jsoup.parse(xmlContent);
            Elements select = doc.select(".tm-price");
            if (select != null && select.size() > 0) {
                String text = select.get(0).text();
                System.out.println(text);
            }

        } catch (FailingHttpStatusCodeException e) {
            e.printStackTrace();
        } catch (MalformedURLException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }

    }
}


浏览器

以上就是对最近几天研究的一点总结,比较浅显,还请高手们不吝赐教。编程语言

相关文章
相关标签/搜索