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

    }
}


瀏覽器

以上就是對最近幾天研究的一點總結,比較淺顯,還請高手們不吝賜教。編程語言

相關文章
相關標籤/搜索