Flask 6(反爬策略:数据加密、js动态加载)

1、先创建一个库并添加、查询

建一个新的表
在这里插入图片描述
视图
在这里插入图片描述

@blue.route("/addnews/")
def add_news():
    news = News()
    time = datetime.datetime.now()
    news.n_title = "今日全国新增892例"
    news.n_content = "截止今日(%s)全国确诊总人数75571" % time.date()
    db.session.add(news)
    db.session.commit()

    return "添加新闻成功"


@blue.route("/getnews/")
def get_news():
    news_list = News.query.all()
    return render_template("NewsList.html", news_list=news_list)

新建App/templates/NewsList.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<h2>最新消息</h2>
<ul>
    {% for news in news_list %}
        <li>{{ news.n_title }}</li>
        <li>{{ news.n_content }}</li>
    {% endfor %}
    
</ul>
</body>
</html>

迁移

python manage.py db migrate
python manage.py db upgrade

运行

python manage.py runserver -r -d

访问
在这里插入图片描述
在这里插入图片描述

2、反爬策略:数据加密、js动态加载

2.1、先把数据变成js加载

新建news_content.html
把下图这部分代码移到news_content.html中
在这里插入图片描述
在这里插入图片描述

修改视图
在这里插入图片描述
修改NewsList.html
在这里插入图片描述
运行并访问
在这里插入图片描述

2.2、对news_content进行base64加密

视图
在这里插入图片描述

@blue.route("/jiami/")
def jiami():
    news_list = News.query.all()
    news_content = render_template("news_content.html", news_list=news_list)

    # decode("utf-8")的作用是将utf-8转换成unicode编码
    # encode("utf-8")的作用是将unicode编码转换成utf-8

    # 第一次加密
    encode_1 = base64.standard_b64encode(news_content.encode("utf-8")).decode("utf-8")
    # 添加混淆字符
    add_encode_1 = "ComeonWuhan" + encode_1 + "ComeonChina"
    # 第二次加密
    encode_2 = base64.standard_b64encode(add_encode_1.encode("utf-8")).decode("utf-8")

    return render_template("NewsList.html", news_content=news_content, encode_2=encode_2)

NewsList.html
在这里插入图片描述
新建static/js/base64_decode.js 内容如下
在这里插入图片描述

var Base64 = {
    _keyStr: "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=",
    decode: function (e) {
        var t = "";
        var n, r, i;
        var s, o, u, a;
        var f = 0;
        e = e.replace(/[^A-Za-z0-9+/=]/g, "");
        while (f < e.length) {
            s = this._keyStr.indexOf(e.charAt(f++));
            o = this._keyStr.indexOf(e.charAt(f++));
            u = this._keyStr.indexOf(e.charAt(f++));
            a = this._keyStr.indexOf(e.charAt(f++));
            n = s << 2 | o >> 4;
            r = (o & 15) << 4 | u >> 2;
            i = (u & 3) << 6 | a;
            t = t + String.fromCharCode(n);
            if (u != 64) {
                t = t + String.fromCharCode(r)
            }
            if (a != 64) {
                t = t + String.fromCharCode(i)
            }
        }
        t = Base64._utf8_decode(t);
        return t
    },
    _utf8_decode: function (e) {
        var t = "";
        var n = 0;
        var r = c1 = c2 = 0;
        while (n < e.length) {
            r = e.charCodeAt(n);
            if (r < 128) {
                t += String.fromCharCode(r);
                n++
            } else if (r > 191 && r < 224) {
                c2 = e.charCodeAt(n + 1);
                t += String.fromCharCode((r & 31) << 6 | c2 & 63);
                n += 2
            } else {
                c2 = e.charCodeAt(n + 1);
                c3 = e.charCodeAt(n + 2);
                t += String.fromCharCode((r & 15) << 12 | (c2 & 63) << 6 | c3 & 63);
                n += 3
            }
        }
        return t
    },


};
function loop(e){
    return Base64.decode((Base64.decode(e)
        ["\x72\x65\x70\x6c\x61\x63\x65"](/\x43\x6f\x6d\x65\x6f\x6e\x57\x75\x68\x61\x6e/,"")
        ["\x72\x65\x70\x6c\x61\x63\x65"](/\x43\x6f\x6d\x65\x6f\x6e\x43\x68\x69\x6e\x61/,"")))
}

/*
\x72\x65\x70\x6c\x61\x63\x65                  replace的16进制
\x43\x6f\x6d\x65\x6f\x6e\x57\x75\x68\x61\x6e  ComeonWuhan的16进制
\x43\x6f\x6d\x65\x6f\x6e\x43\x68\x69\x6e\x61  ComeonChina的16进制
这里用16进制更容易混淆爬取代码的人,
ComeonWuhan ComeonChina是用来混淆代码用的。
 */

运行并访问
访问之前先清空一下浏览器的缓存,每次有js更改的地方建议都清除一下缓存,不然有可能不能更新js。
在这里插入图片描述
访问:这是成功经过base64加密并用字符串混淆后,再经过js解密过来的字符
在这里插入图片描述

2.3、爬取看看能获取什么数据

写一个爬虫爬取试试

没有安装requests可以先安装一下
pip install requests

在这里插入图片描述

import requests


def get_html():
    respose = requests.get('http://127.0.0.1:5000/jiami/')
    print(respose.content.decode("utf-8"))


if __name__ == "__main__":
    get_html()

在这里插入图片描述
爬取后,我们发现只能获取加密后的字符
在这里插入图片描述
虽然爬取不到直接的数据,但是我们的解密文件base64_decode.js是能被人获取到的
在这里插入图片描述

2.4、隐藏js

写一个能获取js的路由
在这里插入图片描述

@blue.route("/getjs/")
def getjs():
    with open(os.path.join(BASE_DIR,"App/static/js/base64_decode.js"),"r", encoding='UTF-8') as file:
        js = file.read()
    return js

这里的os、BASE_DIR两个导包注意一下
在这里插入图片描述
修改html
在这里插入图片描述
清空浏览器缓存
在这里插入图片描述
运行并访问试试
在这里插入图片描述
右击/getjs/
在这里插入图片描述
我们发现也能打开js
在这里插入图片描述
我们将js的加载也变成动态的
修改html

在这里插入图片描述

<script type="text/javascript">
    document.write('<script type="text/javascript" src="/getjs/?t='+ Date.parse(new Date()) +'"><\/script>');
</script>

修改视图
在这里插入图片描述

@blue.route("/getjs/")
def getjs():

    t = request.args.get('t')
    c = time.time() * 1000

    try:
        t = int(t)
    except:
        return "别改了,改了也获取不了我的js"

    if c > t and c - t < 1000:
        with open(os.path.join(BASE_DIR, "App/static/js/base64_decode.js"), "r", encoding='UTF-8') as file:
            js = file.read()
            return js
    else:
        return "想抓取我js,没门"

运行并访问试试
在这里插入图片描述
获取js
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
用爬虫爬取试试
在这里插入图片描述
只能获取到加密后字符
在这里插入图片描述

2.4.1、番外:爬取这类加密的小技巧

首先我们访问类网站是会看到js里面对应的解密方法
在这里插入图片描述
这里这个方法叫loop()
在这里插入图片描述
在控制台,输入loop
在这里插入图片描述
点进去就能看见js代码
在这里插入图片描述

发布了136 篇原创文章 · 获赞 30 · 访问量 7091

猜你喜欢

转载自blog.csdn.net/a__int__/article/details/104429189
今日推荐