ajax动态网页抓取学习总结

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

1.对于简单的或者对性能要求不高的情况,我们可以通过一些工具来模拟浏览器来实现。如:CasperjsHtmlUnit等。

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

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

对于这一块对于初学抓取的我们来说,是有一定的难度的。而且对于网页的发出的请求,我们是需要借助一些工具的,如httpwatch。比如,你想对天猫的价格进行分析,可以先通过httpwatch来分析网页的请求,然后再定位到价格数据的请求链接,最后通过它来模拟请求得到数据,这样我们就提取到我们想要的内容了。

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


补充: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();
        }

    }
}


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


你可能感兴趣的:(ajax动态网页抓取学习总结)