【爬虫】慎用Jsoup中的Element.toString

问题背景

        最近一个爬虫类的项目,在自测时发现CPU占用异常高(2核4G 10个URL/s的速率爬取),几乎是打满了,所以开始去排查过高的原因

找到阻塞的线程

         通过jconsole来分析

        可以看到 pool-1070-thread-3 线程的总阻止数为 82,说明是阻塞在了该线程,从而定位到代码:

    public XPath(Element el) {
        String tagName = el.tagName();
        Element parent = el.parent();
        this.selfElement = el;

        if (parent != null && !parent.tagName().toLowerCase().matches("html")) {

            Elements childrenList = parent.children();
            //父节点下有子节点
            if (CommonUtils.isNotNull(childrenList)) {
                int inx = 0;
                //按序遍历该节点的父节点下的所有子节点,用于标注出当前节点的下标,div[2]
                for (Element child : childrenList) {
                    if (StringUtils.equals(selfElement.toString(), child.toString()) && tagName.equalsIgnoreCase(child.tagName())) {
                        this.index = inx;
                        break;
                    } else if (tagName.equalsIgnoreCase(child.tagName())) {
                        //相同的tag下标才+1
                        inx++;
                        continue;
                    }

                }
            }
            //向上递归的方式初始化,直到html
            this.parent = new XPath(parent);
        }

        this.tagName = tagName;


    }

发现这里没必要用element的toString方法来判断,当前节点与兄弟节点是否相等。直接用 == 判断即可。

        修改后,问题解决,cpu消耗正常

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值