Java之Jsoup庫:網絡爬蟲的基本使用

下面以http://news.csdn.net/news.html爲爬蟲示例網站進行分析,F12查看網頁佈局,效果以下:
從圖中分析知,待扒的單個數據以unit爲標籤,即一個unit標籤對應一個對象。
下面定義Jsoup幫助類,getRootElements()返回須要解析的對象的根標籤,這裏須要返回document.getElementsByClass("unit")。
anaylizeRootElement(Element rootElemen)方法中將指定的rootElemen解析成須要的對象。
package com.coca.android_unity_lab.joke;

import com.coca.unity_dev_utils.android.log.UtilsLog;
import com.coca.unity_dev_utils.android.log.UtilsLogFactory;
import com.coca.unity_dev_utils.java.UtilsCollections;

import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;

import java.util.List;

/**
* Created by Administrator on 2016/6/16.
*/
public abstract class JsoupHelper {
private static final UtilsLog lg = UtilsLogFactory.getLogger(JsoupHelper.class);
private Document document;

public JsoupHelper setDocument(Document document) {
this.document = document;
return this;
}

public void startAnaylizeByJsoup() {
Elements rootElements = getRootElements(document);
lg.e("開始使用Jsoup分析數據:analizeJsoup,共有數據量:" + rootElements.size());
for (Element rootElement : rootElements) {
anaylizeRootElement(rootElement);
}
}

/**
* 獲取解析的根目錄集合
*
* @param document
* @return
*/
public abstract Elements getRootElements(Document document);

/**
* 根據每一個根佈局生成對應的java對象
*
* @param rootElement
* @return
*/
public abstract void anaylizeRootElement(Element rootElement);
}
具體使用方式以下:
jsoupHelper = new JsoupHelper() {
@Override
public Elements getRootElements(Document document) {
return document.getElementsByClass("unit");
}

@Override
public void anaylizeRootElement(Element rootElement) {
JokeAdapterEntity entity = new JokeAdapterEntity();
Element contentElement = JsoupHelper.paraseElement(rootElement, UtilsCollections.createListThroughMulitParamters("h1", "a"));
entity.setContent(contentElement.text());

Element imageElement = JsoupHelper.paraseElement(rootElement, UtilsCollections.createListThroughMulitParamters("dl", "dt", "a", "img"));
if (imageElement != null) {
lg.e("捕獲到的數據:" + imageElement.attr("src"));
entity.setImgUrl(imageElement.attr("src"));
}
adapter.addDataResource(0, entity);
}
};
調用方式以下,
jsoupHelper.setDocument(Jsoup.parse(response)).startAnaylizeByJsoup();
 下面給出遞歸搜索至指定標籤的方法:
/**
* 遞歸解析標籤
* @param element
* @param tags 標籤的依次搜索規則
* @return
*/
public static Element paraseElement(Element element, List<String> tags) {
if (UtilsCollections.isCollectionNotEmpty(tags)) {
String parseTag = tags.get(0);
Elements elements = element.getElementsByTag(parseTag);

boolean isElementsNotEmpty = elements != null && elements.size() > 0;
lg.e("解析標籤:" + parseTag + ",Size is " + (isElementsNotEmpty ? elements.size() : 0));
if (isElementsNotEmpty) {
return paraseElement(elements.first(), tags.subList(1, tags.size()));
} else {
lg.e("該標籤下的Element集合爲空,return null");
return null;
}
} else {
lg.e("找到指定元素");
return element;
}
}






相關文章
相關標籤/搜索