最近對網頁的抓取進行了一些研究,針對於ajax生成的數據在源碼中是沒法呈現出來的,經過普通的網頁爬取是採集不到的,所以須要一些特殊的處理。經過上網查找資料以及調查,在此簡單的總結一下。我用的編程語言是Java。html
1.對於簡單的或者對性能要求不高的狀況,咱們能夠經過一些工具來模擬瀏覽器來實現。如:Casperjs、HtmlUnit等。java
最近簡單的研究了一下casperjs,對於官方的文檔我表示寫的不太詳細,對於初學者學習來說,我以爲是有必定難度的並且對於它的傳播來講也是不利的。可是仍是感受挺有意思的。咱們能夠按照他的語法來獲得Document,甚至咱們能夠經過寫js、jquery的代碼來實現內容的提取。而後經過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();
}
}
}
瀏覽器
以上就是對最近幾天研究的一點總結,比較淺顯,還請高手們不吝賜教。編程語言