前端JS将文字替换成伪类标签防爬虫的一个方法

话不多说 思路就是
把重要的信息转换成伪类标签 显示出来 把原有的文字删除
本来还担心替换成伪类标签后字体什么的会改变 伪类标签很好的继承了样式
上代码

但是呢 很遗憾 你还是要过接口 这个方法可以作为中转 比如你和后端商量好规则 你发送你生成的class 去取得要隐藏的对应得数据 然后再渲染出来 而不是通过一个接口直接渲染出来

一开始我觉得这样是可以防爬的 后来我自己爬了下 只靠前端的JS修改是不行的 异步直接返回数据爬你的接口 直接渲染的话JS没法影响 只能前后端一起配合混淆数据 来增加难度

/**
@param {String} -- cls 当前要替换的标签名  比如我要替换所有p 标签下的 span 的字为伪类标签 就是  CreatePseudoClass( {cls: 'p span'} );
*/
function CreatePseudoClass( option ){
            if( !(this instanceof CreatePseudoClass) ){
                return new CreatePseudoClass( option );
            }
            this.defaults = {
                cls: 'p strong' // 传递的默认参数
            }
            this.result = $.extend( {}, this.defaults, option  );
            this.init();
        }
        CreatePseudoClass.prototype = {
            constructor: CreatePseudoClass,
            init: function(){
                var self = this,
                $items = $(self.result.cls),
                 // 获取生成的样式表 注意了 这是精华 这种方式生成的样式表在控制台中是看不到里面的样式的 就是个空的 <style></style> 但是里面确实是有样式标签的  我还为了隐藏生成的样式表里的内容这个东西研究了好久 基础不扎实啊 嘿嘿
                sheet = self.addSheet();
                for( var i = 0, l = $items.length; i < l; i++ ){
                    (function(i){
                        var $item = $items.eq(i);
                            $itemText = $item.text(),
                            newName = self.getEnglish(),
                            // 产生一些随机数啥的  来混淆写爬虫的人 确实我感觉没啥卵用
                            itemTagName = Array.prototype.join.call( newName, parseInt( Math.random()*100) ),   
                            newClass = itemTagName + parseInt( Math.random()*10000 ) ;
                        $item.text('');
                        // 给当前的这个添加产生伪类的样式
                        $item.addClass(newClass);
                        // 添加样式信息
                        self.addRule(sheet, newClass, $itemText)
                    })(i)
                }
            },
            // 获取随机英文
            getEnglish(){
                var result = [];
                for( var i = 0; i < 4; i++ ){
                var ranNum = Math.ceil(Math.random() * 25); //生成一个0到25的数字
                    //大写字母'A'的ASCII是65,A~Z的ASCII码就是65 + 0~25;然后调用String.fromCharCode()传入ASCII值返回相应的字符并push进数组里
                    result.push( String.fromCharCode( 65 + ranNum ) );
                }
                return result.join( '' );
            },
            // 添加样式表
            addSheet: function(){
                var style = document.createElement("style");
                document.head.appendChild(style);
                return style.sheet;
            },
            addRule: function(sheet, newClass, $itemText){
            // 判断兼容性
                typeof sheet.addRule == 'function' ? sheet.addRule('.' + newClass+':before', 'content: "'+$itemText+'"') : 
                                                     sheet.insertRule('.' + newClass + ':before {content: "'+$itemText+'"}' , 0);
            }
        }

demo图 别嫌丑 嘿嘿

dom结构图
dom结构

生成的效果图
可以看到 文字本替换成了伪类标签 而且增加了两个看起来是空的样式表(我初始化了两次方法)
这里写图片描述

还是把demo代码贴出来吧 嘿嘿

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>防抓取</title>
    <style>
        p strong{color: #eb6120; background: black}
    </style>
</head>
<body>
    <p class="red">1111</p>
    <p>
        <span>尚泽大都会 </span><strong class="123xx">168元</strong>
    </p>
    <p>
        <span>尚泽大都会1 </span><strong  class="12xx3">18元</strong>
    </p>
    <p>
        <span>尚泽大都会2 </span><strong  class="12xx3">14568元</strong>
    </p>
    <p><a href="baidu.com">baidu</a></p>
    <p><a href="baidu.com">baidu</a></p>
    <p><a href="baidu.com">baidu</a></p>
    <p><a href="baidu.com">baidu</a></p>
    <p><a href="baidu.com">baidu</a></p>
    <script src="http://libs.baidu.com/jquery/2.0.0/jquery.min.js"></script>
    <script>
        function CreatePseudoClass( option ){
            if( !(this instanceof CreatePseudoClass) ){
                return new CreatePseudoClass( option );
            }
            this.defaults = {
                cls: 'p strong'
            }
            this.result = $.extend( {}, this.defaults, option  );
            this.init();
        }
        CreatePseudoClass.prototype = {
            constructor: CreatePseudoClass,
            init: function(){
                var self = this,
                $items = $(self.result.cls),
                 // 获取生成的样式表 注意了 这是精华 这种方式生成的样式表在控制台中是看不到里面的样式的 就是个空的 <style></style> 但是里面确实是有样式标签的  我还为了隐藏生成的样式表里的内容这个东西研究了好久 基础不扎实啊 嘿嘿
                sheet = self.addSheet();
                for( var i = 0, l = $items.length; i < l; i++ ){
                    (function(i){
                        var $item = $items.eq(i);
                            $itemText = $item.text(),
                            newName = self.getEnglish(),
                            // 产生一些随机数啥的  来混淆写爬虫的人 确实我感觉没啥卵用
                            itemTagName = Array.prototype.join.call( newName, parseInt( Math.random()*100) ),   
                            newClass = itemTagName + parseInt( Math.random()*10000 ) ;
                        $item.text('');
                        // 给当前的这个添加产生伪类的样式
                        $item.addClass(newClass);
                        // 添加样式信息
                        self.addRule(sheet, newClass, $itemText)
                    })(i)
                }
            },
            // 获取随机英文
            getEnglish(){
                var result = [];
                for( var i = 0; i < 4; i++ ){
                var ranNum = Math.ceil(Math.random() * 25); //生成一个0到25的数字
                    //大写字母'A'的ASCII是65,A~Z的ASCII码就是65 + 0~25;然后调用String.fromCharCode()传入ASCII值返回相应的字符并push进数组里
                    result.push( String.fromCharCode( 65 + ranNum ) );
                }
                return result.join( '' );
            },
            // 添加样式表
            addSheet: function(){
                var style = document.createElement("style");
                document.head.appendChild(style);
                return style.sheet;
            },

            addRule: function(sheet, newClass, $itemText){
                // 判断兼容性
                typeof sheet.addRule == 'function' ? sheet.addRule('.' + newClass+':before', 'content: "'+$itemText+'"') : 
                                                     sheet.insertRule('.' + newClass + ':before {content: "'+$itemText+'"}' , 0);
            }
        }
       CreatePseudoClass({})
       CreatePseudoClass({cls: 'p a'})

    </script>
</body>
</html>

还能优化和修改 谢谢大佬指点

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值