吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 10010|回复: 76
收起左侧

[Python 转载] Python爬取腾讯漫画

  [复制链接]
漁滒 发表于 2020-8-25 00:22
本帖最后由 aiai 于 2020-8-25 00:22 编辑

首先以《一人之下》第一话为例
[Asm] 纯文本查看 复制代码
https://ac.qq.com/ComicView/index/id/531490/cid/1

打开浏览器F12进行抓包
QQ截图20200824233453.jpg
往下滑动可以看到图片不断的加载出来,所以可能是动态加载的,此时切换到XHR标签
QQ截图20200824233740.jpg
发现除了弹幕,啥都没有,此路行不通。那么直接复制图片的地址在全局搜索
QQ截图20200824233858.jpg
发现除了自身,也都是啥都没有,此路也行不通。图片的地址既没有动态加载,也没有在其他的源代码中,说明地址是被加密放到了某一个地方。
除去图片,js,css这些,剩下有可能的就只有主页了,所以直接看主页的源代码,并且主要关注script标签下的内容
整个主页的源代码中,有可能存放加密数据的就只有倒数后面的一个script标签
[JavaScript] 纯文本查看 复制代码
<script>
    var DATA        = 'eyJjfbe21pYyI6eyJpZCI6NTMxNDkwLCJ0abeXRsZSI6Ilx1NGUwMFx1NGViYVx1NGU0Ylx1NGUwYiIsIm.................................', //省略
        PRELOAD_NUM     = 2,
        NOTICE_TIME     = 15,
        ROAST_SIZE      = 1000,
        ROAST_PRE       = 20,
        ROAST_VIEW      = 20,
        TUCAO_INTERVAL  = 8000,
        DANMU_INTERVAL  = 2000,
        DANMU_TIME      = 10000;
</script>

这里的DATA变量很有可能就是加密的数据,此时需要查找如何解密这段数据,继续在全局中搜索DATA,并且区分大小写
QQ截图20200824234713.jpg


可以看到除了自身以外,就剩下一个js文件内有出现过DATA变量,那么进入到这个js文件里面继续搜索DATA,并且区分大小写
QQ截图20200824234846.jpg
搜索后发现有37处,数量有点多,浏览一遍发现,除了第一个以外,其他都是取DATA变量的值,说明关键在第一个DATA变量,因为还没有解密又怎么取值呢
直接在第一次出现DATA变量的那一行打上断点,然后刷新
QQ截图20200824235301.jpg
可以看到所有的图片地址都在_v变量的下面,继续在全局中搜索_v变量,也是要区分大小写
QQ截图20200824235452.jpg
搜索到13个内容,也是简单的都看一遍,发现除了取值,函数变量以及一些其他的字符串包含这个,剩下的一个在第一个DATA变量上面的立即执行函数里面
[JavaScript] 纯文本查看 复制代码
eval(function(p, a, c, k, e, r) {
            e = function(c) {
                return (c < a ? "" : e(parseInt(c / a))) + ((c = c % a) > 35 ? String.fromCharCode(c + 29) : c.toString(36))
            }
            ;
            if (!"".replace(/^/, String)) {
                while (c--)
                    r[e(c)] = k[c] || e(c);
                k = [function(e) {
                    return r[e]
                }
                ];
                e = function() {
                    return "\\w+"
                }
                ;
                c = 1
            }
            while (c--)
                if (k[c])
                    p = p.replace(new RegExp("\\b" + e(c) + "\\b","g"), k[c]);
            return p
        }("p y(){i=\"J+/=\";O.D=p(c){s a=\"\",b,d,h,f,g,e=0;C(c=c.z(/[^A-G-H-9\\+\\/\\=]/g,\"\");e<c.k;)b=i.l(c.m(e++)),d=i.l(c.m(e++)),f=i.l(c.m(e++)),g=i.l(c.m(e++)),b=b<<2|d>>4,d=(d&15)<<4|f>>2,h=(f&3)<<6|g,a+=7.5(b),w!=f&&(a+=7.5(d)),w!=g&&(a+=7.5(h));v a=u(a)};u=p(c){C(s a=\"\",b=0,d=17=8=0;b<c.k;)d=c.o(b),Q>d?(a+=7.5(d),b++):R<d&&S>d?(8=c.o(b+1),a+=7.5((d&F)<<6|8&r),b+=2):(8=c.o(b+1),x=c.o(b+2),a+=7.5((d&15)<<12|(8&r)<<6|x&r),b+=3);v a}}s B=I y(),T=W['K'+'L'].M(''),N=W['n'+'P'+'e'],j,t,q;N=N.U(/\\d+[a-V-Z]+/g);j=N.k;X(j--){t=Y(N[j])&10;q=N[j].z(/\\d+/g,'');T.11(t,q.k)}T=T.13('');14=16.E(B.D(T));", 62, 70, "|||||fromCharCode||String|c2||||||||||_keyStr|len|length|indexOf|charAt||charCodeAt|function|str|63|var|locate|_utf8_decode|return|64|c3|Base|replace|||for|decode|parse|31|Za|z0|new|ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789|DA|TA|split||this|onc|128|191|224||match|zA||while|parseInt||255|splice||join|_v||JSON|c1".split("|"), 0, {}))
    

接着先将这一段立即执行函数解密一下,使用的是https://wangye.org/tools/scripts/eval/,可以得到下面的js代码
[JavaScript] 纯文本查看 复制代码
function Base() {
    _keyStr = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=";
    this.decode = function(c) {
        var a = "",
        b, d, h, f, g, e = 0;
        for (c = c.replace(/[^A-Za-z0-9\+\/\=]/g, ""); e < c.length;) b = _keyStr.indexOf(c.charAt(e++)),
        d = _keyStr.indexOf(c.charAt(e++)),
        f = _keyStr.indexOf(c.charAt(e++)),
        g = _keyStr.indexOf(c.charAt(e++)),
        b = b << 2 | d >> 4,
        d = (d & 15) << 4 | f >> 2,
        h = (f & 3) << 6 | g,
        a += String.fromCharCode(b),
        64 != f && (a += String.fromCharCode(d)),
        64 != g && (a += String.fromCharCode(h));
        return a = _utf8_decode(a)
    };
    _utf8_decode = function(c) {
        for (var a = "",
        b = 0,
        d = c1 = c2 = 0; b < c.length;) d = c.charCodeAt(b),
        128 > d ? (a += String.fromCharCode(d), b++) : 191 < d && 224 > d ? (c2 = c.charCodeAt(b + 1), a += String.fromCharCode((d & 31) << 6 | c2 & 63), b += 2) : (c2 = c.charCodeAt(b + 1), c3 = c.charCodeAt(b + 2), a += String.fromCharCode((d & 15) << 12 | (c2 & 63) << 6 | c3 & 63), b += 3);
        return a
    }
}
var B = new Base(),
T = W['DA' + 'TA'].split(''),
N = W['n' + 'onc' + 'e'],
len,
locate,
str;
N = N.match(/\d+[a-zA-Z]+/g);
len = N.length;
while (len--) {
    locate = parseInt(N[len]) & 255;
    str = N[len].replace(/\d+/g, '');
    T.splice(locate, str.length)
}
T = T.join('');
_v = JSON.parse(B.decode(T));

可以看到第40行就是解密后的_v变量,第27行就是我们前面的DATA加密数据,那么可以肯定这段就是关键的解密函数,分析一下这段代码
_v是调用了B的decode方法,传入的参数是T,然后T又是从前面T参数和N参数计算出来的,那么我们在console界面分别输入W['DA' + 'TA']和W['n' + 'onc' + 'e']
其中W['DA' + 'TA']就是前面的DATA加密数据,W['n' + 'onc' + 'e']可以在主页源代码中找到
QQ截图20200825000903.jpg QQ截图20200825000959.jpg
先初步尝试获取这两个数据
[Python] 纯文本查看 复制代码
def getdata():
    import requests
    import re
    url = 'https://ac.qq.com/ComicView/index/id/531490/cid/1'
    response = requests.get(url).text
    data = re.findall("(?<=var DATA        = ').*?(?=')", response)[0]
    nonce = re.findall('window\[".+?(?<=;)', response)[0]
    nonce = '='.join(nonce.split('=')[1:])[:-1]
    print(data)
    print(nonce)

但是nonce还是一段js代码,而不是字符串。这里有两种解决方法,第一种是调用nodejs来计算,第二种是使用execjs模块来计算,先以第二种方法介绍
首先安装模块
[Python] 纯文本查看 复制代码
pip install PyExecJS

[Python] 纯文本查看 复制代码
def getdata():
    import requests
    import re
    import execjs
    url = 'https://ac.qq.com/ComicView/index/id/531490/cid/1'
    response = requests.get(url).text
    data = re.findall("(?<=var DATA        = ').*?(?=')", response)[0]
    nonce = re.findall('window\[".+?(?<=;)', response)[0]
    nonce = '='.join(nonce.split('=')[1:])[:-1]
    nonce = execjs.eval(nonce)
    print(data)
    print(nonce)

此时成功获取两个参数。然后根据js代码,可以改写为nodejs调用解密,也可以转写为pythpn代码,那么这里就转写为pythpn代码
[Python] 纯文本查看 复制代码
def getdata():
    import requests
    import re
    import execjs
    import json
    url = 'https://ac.qq.com/ComicView/index/id/531490/cid/1'
    response = requests.get(url).text
    data = re.findall("(?<=var DATA        = ').*?(?=')", response)[0]
    nonce = re.findall('window\[".+?(?<=;)', response)[0]
    nonce = '='.join(nonce.split('=')[1:])[:-1]
    nonce = execjs.eval(nonce)
    T = list(data)
    N = re.findall('\d+[a-zA-Z]+', nonce)
    jlen = len(N)
    while jlen:
        jlen -= 1
        jlocate = int(re.findall('\d+', N[jlen])[0]) & 255
        jstr = re.sub('\d+', '', N[jlen])
        del T[jlocate:jlocate + len(jstr)]
    T = ''.join(T)
    keyStr = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/="
    a = []
    e = 0
    while e < len(T):
        b = keyStr.index(T[e])
        e += 1
        d = keyStr.index(T[e])
        e += 1
        f = keyStr.index(T[e])
        e += 1
        g = keyStr.index(T[e])
        e += 1
        b = b << 2 | d >> 4
        d = (d & 15) << 4 | f >> 2
        h = (f & 3) << 6 | g
        a.append(b)
        if 64 != f:
            a.append(d)
        if 64 != g:
            a.append(h)
    _v = json.loads(bytes(a))
    print(_v)

此时解密后的地址都是_v变量里面了。但是还有一个问题,execjs计算的时候有可能会报错抛出异常,此时需要重新获取源代码计算,下面是完整代码
[Python] 纯文本查看 复制代码
def getdata():
    import requests
    import re
    import execjs
    import json
    url = 'https://ac.qq.com/ComicView/index/id/531490/cid/1'
    while True:
        try:
            response = requests.get(url).text
            data = re.findall("(?<=var DATA        = ').*?(?=')", response)[0]
            nonce = re.findall('window\[".+?(?<=;)', response)[0]
            nonce = '='.join(nonce.split('=')[1:])[:-1]
            nonce = execjs.eval(nonce)
            break
        except:
            pass
    T = list(data)
    N = re.findall('\d+[a-zA-Z]+', nonce)
    jlen = len(N)
    while jlen:
        jlen -= 1
        jlocate = int(re.findall('\d+', N[jlen])[0]) & 255
        jstr = re.sub('\d+', '', N[jlen])
        del T[jlocate:jlocate + len(jstr)]
    T = ''.join(T)
    keyStr = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/="
    a = []
    e = 0
    while e < len(T):
        b = keyStr.index(T[e])
        e += 1
        d = keyStr.index(T[e])
        e += 1
        f = keyStr.index(T[e])
        e += 1
        g = keyStr.index(T[e])
        e += 1
        b = b << 2 | d >> 4
        d = (d & 15) << 4 | f >> 2
        h = (f & 3) << 6 | g
        a.append(b)
        if 64 != f:
            a.append(d)
        if 64 != g:
            a.append(h)
    _v = json.loads(bytes(a))
    print(_v)

最后遍历_v变量里面的所有地址下载即可完成,收工!

免费评分

参与人数 37吾爱币 +38 热心值 +30 收起 理由
360chrome + 1 + 1 谢谢@Thanks!
FFF全部成为F + 1 正准备爬有妖气,参考参考
woflant + 1 + 1 我很赞同!
faustellar + 1 + 1 谢谢@Thanks!学习了
Markwell + 1 + 1 谢谢@Thanks!
guoruihotel + 1 + 1 膜拜技术大佬!
Light紫星 + 2 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!
liwei8515 + 1 + 1 我很赞同!
狼熊人 + 1 用心讨论,共获提升!
446917139 + 2 + 1 我很赞同!
饥饿滴小凤 + 2 + 1 用心讨论,共获提升!
平凡路 + 1 + 1 谢谢@Thanks!
爱潜水的白熊 + 1 + 1 我很赞同!
gudumuyu + 1 + 1 谢谢@Thanks!
_知鱼之乐 + 1 + 1 我很赞同!
月敏星希 + 1 + 1 谢谢@Thanks!
haoxiaohao + 1 + 1 我很赞同!
shangjin1977 + 1 + 1 用心讨论,共获提升!
玩世不攻 + 1 + 1 用心讨论,共获提升!
17601243856 + 1 谢谢@Thanks!
dunkyy + 1 用心讨论,共获提升!
四十九画 + 1 我很赞同!
assdqwe123 + 1 + 1 我很赞同!
qinxv + 1 已经处理,感谢您对吾爱破解论坛的支持!
张半海 + 1 + 1 热心回复!
phoenix_wufan + 1 + 1 谢谢@Thanks!
夜枭食 + 1 用心讨论,共获提升!
执手相看泪眼 + 1 + 1 用心讨论,共获提升!
Night小丑 + 1 用心讨论,共获提升!
child_lu + 1 + 1 用心讨论,共获提升!
a5228172 + 1 + 1 我很赞同!
burning + 1 + 1 用心讨论,共获提升!
zjqfm + 1 热心回复!
HWW0713 + 1 + 1 过程才是重点!多谢交流
Zeaf + 1 + 1 精妙之处在于解密啊
陌路风影 + 1 + 1 用心讨论,共获提升!
易请惜 + 1 + 1 膜拜大佬,感谢!

查看全部评分

本帖被以下淘专辑推荐:

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

甘蔗 发表于 2020-8-25 01:51
有点意思。
 楼主| 漁滒 发表于 2020-8-26 12:03
_知鱼之乐 发表于 2020-8-26 10:20
js逆向最后一步中
在控制台执行W['DA' + 'TA'],这个W是什么?
为什么我这边执行报错呢?

这个W是解密后的js里面的,报错可能是你没有下断点,在断点断下的时候执行
netspirit 发表于 2020-8-25 00:43
收藏了 正在学python 等我学到这里了我来看看~~~
陌路风影 发表于 2020-8-25 00:44
大佬啊,不过还是那句话,爬虫玩的好,牢饭吃到饱
雾都孤尔 发表于 2020-8-25 00:46
学习了,这种方法用在其他网站不知行不行......
慕容紫英丶 发表于 2020-8-25 00:48
虽然不会,还是支持
alicc 发表于 2020-8-25 01:10
有E版本的嘛
HWW0713 发表于 2020-8-25 01:32
除了Python,前端的部分都很容易懂,过程才是重点!多谢交流
yoyo221 发表于 2020-8-25 02:36
学到了,谢谢大佬
subney 发表于 2020-8-25 06:15
厉害,段位太高看不懂
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-22 06:37

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表