基于jsoup的爬虫升级版

本文介绍了如何从基于html字符串截取的爬虫升级到使用jsoup的爬虫,强调了jsoup在实用性上的优势。文章详细阐述了通过jsoup获取网页数据的流程,包括获取html源码、解析节点和提取所需数据。还展示了关键代码,如getDataFromDocument方法,并以电脑壁纸爬取为例进行了单元测试。
摘要由CSDN通过智能技术生成

上篇文章基于html字符串截取模式的爬虫,在实际使用过程中存在较大的使用限制,为此简单研究了下基于jsoup模式的爬虫,相对于字符串截取,在实用性上也有很大的优势。

梳理了下jsoup获取指定数据的大概流程如下:

  1. 通过网址URL得到html源码信息
  2. 将源码转义为对象类型
  3. 通过获取其中的node节点集合,进行指定数据的解析获取
  4. 将所需数据封装返回即可。

以下是根据梳理的流程进行的对应编码信息

/**
     * 根据网址解析指定数据并返回结果
     * @param url 要请求的网址
     * @param mark 要获取的数据解析条件
     * @return
     * @throws IOException
     */
    public static List<HtmlFilterResponse> getHtmlValueListFromUrl(String url, HtmlFilterRequest mark) throws IOException {
        //获得一个和网站的链接,注意是Jsoup的connect
        Connection connect = Jsoup.connect(url);
        //获得该网站的Document对象
        Document document = connect.get();
        return getDataFromDocument(document, mark);
    }

其中getDataFromDocument方法是获取指定数据的方法,HtmlFilterRequest和HtmlFilterResponse分别代表入参和出参,两者代码如下:

@Data
public class HtmlFilterRequest {

    /**
     * 要筛选的全部数据范围key定义
     * 示例:.book-img-text ul li
     */
    private String elementsTagRangeKey;
    /**
     * 要筛选的数据范围key定义
     * 示例:.book-mid-info h2 a
     */
    private String textTagRangeKey;
    /**
     * 筛选对应标签的第一个值key定义
     * 示例:.total p,筛选出  总字数 信息
     */
    private String textTagRangeFirstKey;
    /**
     * 筛选对应标签的最后一个值key定义
     * 示例:.total p,筛选出  总推荐 信息
     */
    private String textTagRangeLastKey;
    /**
     * 多属性部分的配置
     */
    private List<TagAttrRange> multiTagAttrRangeList;
    /**
     * 筛选对应标签下的html信息
     */
    private String htmlTagRangeKey;

    /**
     * 要筛选的数据范围key定义-结果数据前缀
     * 示例:.book-mid-info h2 a
     */
    private String preTextTag;
    /**
     * 筛选对应标签的第一个值key定义-结果数据前缀
     * 示例:.total p,筛选出  总字数 信息
     */
    private String preTextTagFirst;
    /**
     * 筛选对应标签的最后一个值key定义-结果数据前缀
     * 示例:.total p,筛选出  总推荐 信息
     */
    private String preTextTagLast;


    /**
     * 筛选对应标签下的html信息-结果数据前缀
     */
    private String preHtmlTag;


    /**
     * 要筛选的数据范围key定义-结果数据后缀
     * 示例:.book-mid-info h2 a
     */
    private String sufTextTag;
    /**
     * 筛选对应标签的第一个值key定义-结果数据后缀
     * 示例:.total p,筛选出  总字数 信息
     */
    private String sufTextTagFirst;
    /**
     * 筛选对应标签的最后一个值key定义-结果数据后缀
     * 示例:.total p,筛选出  总推荐 信息
     */
    private String sufTextTagLast;


    /**
     * 筛选对应标签下的html信息-结果数据后缀
     */
    private String sufHtmlTag;
}

@Data
public class TagAttrRange {
    /**
     * 要定位的标签位置
     * 示例:.book-mid-info h2 a【class=book-mid-info下的h2标签里面的a标签】
     */
    private String tagRangeKey;
    /**
     * 要筛选的属性
     * 配套tagRangeKey示例:title【class=book-mid-info下的h2标签里面的a标签里面的title属性值】
     */
    private String tagRangeAttrKey;
    /**
     * 取值结果的前缀内容
     */
    private String preTagAttrVal;
    /**
     * 取值结果的后缀内容
     */
    private String sufTagAttrVal;

    /**
     * 取值类型
     */
    private HtmlValueTypeEnum hvtEnum;
}

public enum HtmlValueTypeEnum {
    /**
     * 文本
     */
    TEXT,
    /**
     * 第一个值
     */
    FIRST_TEXT,
    /**
     * 最后一个值
     */
    LAST_TEXT,
    /**
     * html信息
     */
    HTML,
    /**
     * 标签属性值
     */
    ATTR_VALUE

}
@Data
public class HtmlFilterResponse {
    /**
     * 将html内容以文本格式显示,并保持原格式
     */
    private String rootPlainText;

    /**
     * 获得标签里面的文本内容
     * 示例:<a><span>123</span></a>
     * 假设获取a标签下的文本&
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

code世界

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值