zoukankan      html  css  js  c++  java
  • 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;
    }
    }








  • 相关阅读:
    SQLServer 错误: 15404,维护计划无法执行
    Axis2 服务器端抛出ServiceClass object does not implement问题解决方法
    领域驱动设计 软件核心复杂性应对之道 读书笔记
    华为实施微服务架构的五大军规
    DDD领域驱动设计基本理论知识总结
    TransactionScope使用说明
    错误:该行已经属于另一个表
    SQL基础之 时间戳
    采用左右值编码来存储无限分级树形结构的数据库表设计
    违反并发性: UpdateCommand影响了预期 1 条记录中的 0 条 解决办法
  • 原文地址:https://www.cnblogs.com/linux007/p/5782720.html
Copyright © 2011-2022 走看看