鱼C论坛

 找回密码
 立即注册
查看: 1662|回复: 18

[已解决]爬这个小说网快被自己蠢哭了

[复制链接]
发表于 2018-8-22 23:51:59 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
原因是这样的 很早以前发现了个很好的小说网站 现在想试试爬一下 结果发现爬到的顺序都是乱的 看了看源码和审查元素的不一样 仔细分析了一下 原来有js加密 想着是不是可以用pyexecjs执行一下 调试了一遍 又发现 这玩意很有点高级 用2个js文件加密的 于是我有点糊了 这个到底要怎么做
这是加密需要的js文件 js没怎么学 不是特别懂
附上网址网址(咳咳 随便找的一本小说 顺便安利一下 挺好看的)基本结构都做好了 就差这个js加密导致的顺序错乱 大神麻烦大神讲解一下思路 如果可以 给个代码解决一下这个顺序 万分感谢
最佳答案
2018-8-30 15:04:38
擦,刚打了一大段文字不行,只能重新写一遍。  
我破解出来这个顺序了。首先你需要找到head标签中的第五个meta标签(从0开始数)
<meta name="client" content="NzBUJTY0USUxNkYlNTVLJTUwRCU1OEglMzBQJTIwTyU1M1olNTFHJTI2RCU3MkQlMjdTJTQ1WiUxM0UlMlklMzdaJTE1TiUyME4lMEIlN0IlNTREJTU4SSU2N0YlNTZVJTQ5QiU3MUElMUQlMjRNJTUxUSU2MlklMTNEJTY0TyUxMkclNDFPJTlYJTM3UyU0OVUlMTVQJTM1QyUyNUslM1YlMzNCJTc1UCUyOVElNEIlNzJaJTM4QiUzM00lNDhCJTQ0SSU3MVklNDZNJTY4UiU3M0ElMjNVJTQwQiU0NU4lMjBUJTI5VyU2N1MlMzZKJTY1VCU1NFMlMjhaJTE2VyU2MlklMTJDJTc4UyUyMlAlMTNCJTQ3RSU0MlUlNDk=" />
把content的内容进行转码,我这里用python和javascript都演示一遍吧。
python解码:
import base64
import re
def decode_base64(data):
    missing_padding = 4 - len(data) % 4
    if missing_padding:
        data += b'='* missing_padding
    return base64.decodestring(data)
def main():
    a = b'NzBUJTY0USUxNkYlNTVLJTUwRCU1OEglMzBQJTIwTyU1M1olNTFHJTI2RCU3MkQlMjdTJTQ1WiUxM0UlMlklMzdaJTE1TiUyME4lMEIlN0IlNTREJTU4SSU2N0YlNTZVJTQ5QiU3MUElMUQlMjRNJTUxUSU2MlklMTNEJTY0TyUxMkclNDFPJTlYJTM3UyU0OVUlMTVQJTM1QyUyNUslM1YlMzNCJTc1UCUyOVElNEIlNzJaJTM4QiUzM00lNDhCJTQ0SSU3MVklNDZNJTY4UiU3M0ElMjNVJTQwQiU0NU4lMjBUJTI5VyU2N1MlMzZKJTY1VCU1NFMlMjhaJTE2VyU2MlklMTJDJTc4UyUyMlAlMTNCJTQ3RSU0MlUlNDk'
    dd = str(decode_base64(a))
    req = re.findall(r"\d+\.?\d*",dd)
    print(req)
if __name__ == '__main__':
    main()

js解码
var book = 'NzBUJTY0USUxNkYlNTVLJTUwRCU1OEglMzBQJTIwTyU1M1olNTFHJTI2RCU3MkQlMjdTJTQ1WiUxM0UlMlklMzdaJTE1TiUyME4lMEIlN0IlNTREJTU4SSU2N0YlNTZVJTQ5QiU3MUElMUQlMjRNJTUxUSU2MlklMTNEJTY0TyUxMkclNDFPJTlYJTM3UyU0OVUlMTVQJTM1QyUyNUslM1YlMzNCJTc1UCUyOVElNEIlNzJaJTM4QiUzM00lNDhCJTQ0SSU3MVklNDZNJTY4UiU3M0ElMjNVJTQwQiU0NU4lMjBUJTI5VyU2N1MlMzZKJTY1VCU1NFMlMjhaJTE2VyU2MlklMTJDJTc4UyUyMlAlMTNCJTQ3RSU0MlUlNDk=';
var a = Buffer.from(book, 'base64').toString('utf-8').split(/[A-Z]+%/);
console.log(a);
解析出来的列表就是你的要爬取小说的顺序。  
我把网页源代码下载下来测试是正确的。  
剩下的工作就就是用正则把小说正文的内容按照得到的顺序排序就好了。   
不过建议你还是换一个网站爬取吧。
这个网站真的很麻烦。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2018-8-22 23:57:10 | 显示全部楼层
找到的js文件 我是用一点点删除来验证的  最后锁定这2个文件就是改变内容顺序的关键

section.txt

15.2 KB, 下载次数: 5

txt改成js

hetu.txt

2.69 KB, 下载次数: 4

txt改成js

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-8-22 23:58:00 | 显示全部楼层
网址是这个 http://www.hetushu.com/book/2477/index.html
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-8-23 09:02:33 | 显示全部楼层
fkmol 发表于 2018-8-22 23:58
网址是这个 http://www.hetushu.com/book/2477/index.html

360截图20180823090015847.jpg
就是这个地址啊,没有加密啊,一下就爬出来了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-8-23 12:27:36 | 显示全部楼层
本帖最后由 fkmol 于 2018-8-23 12:31 编辑
chongchuigu 发表于 2018-8-23 09:02
就是这个地址啊,没有加密啊,一下就爬出来了


咳咳大佬看看顺序 文章的顺序是乱的 你根本读不通 当初我也是做成这样 结果打算看的时候发现看不懂 因为源码和审查元素的文章顺序不是一样的 后来发现是因为js改变正文了顺序
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-8-23 13:52:58 | 显示全部楼层
fkmol 发表于 2018-8-23 12:27
咳咳大佬看看顺序 文章的顺序是乱的 你根本读不通 当初我也是做成这样 结果打算看的时候发现看不懂 因 ...

我也哭了!!!!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-8-23 21:41:13 | 显示全部楼层
emmmm
没人了吗 看起来这个防爬机制很恶心啊
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-8-30 14:15:41 | 显示全部楼层
这个排序机制我破解出来了,但是很麻烦,需要你自己按照密文逐一排序,  
我这里说一下原理吧,首先在网页源代码中在head标签中找到第四个meta标签的content的内容  
利用下面的js代码破解后得到顺序列表,如下:
var book = 'NzBUJTY0USUxNkYlNTVLJTUwRCU1OEglMzBQJTIwTyU1M1olNTFHJTI2RCU3MkQlMjdTJTQ1WiUxM0UlMlklMzdaJTE1TiUyME4lMEIlN0IlNTREJTU4SSU2N0YlNTZVJTQ5QiU3MUElMUQlMjRNJTUxUSU2MlklMTNEJTY0TyUxMkclNDFPJTlYJTM3UyU0OVUlMTVQJTM1QyUyNUslM1YlMzNCJTc1UCUyOVElNEIlNzJaJTM4QiUzM00lNDhCJTQ0SSU3MVklNDZNJTY4UiU3M0ElMjNVJTQwQiU0NU4lMjBUJTI5VyU2N1MlMzZKJTY1VCU1NFMlMjhaJTE2VyU2MlklMTJDJTc4UyUyMlAlMTNCJTQ3RSU0MlUlNDk=';

//var a = base64.decode(book).split(/[A-Z]+%/);
//console.log(a);
var a = Buffer.from(book, 'base64').toString('utf-8').split(/[A-Z]+%/);
console.log(a);
然后,按照顺序排版即可。
由于本人不是大婶,有一小段代码看不懂,如下
var j = 0;
        for (var i = 0; i < a.length; i++) {
            if (a[i] < 5) {
                this.childNode[a[i]] = this.body.childNodes[i + this.star];
                j++
            } else {
                this.childNode[a[i] - j] = this.body.childNodes[i + this.star]
            }
        };
这里好像有个什么j++什么的。  
应该是循环中加一吧。  
我爬取了一篇小说进行测试,顺序是没有问题的。  
剩下的你就自己写吧。我还要写我的练手项目。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-8-30 14:16:57 | 显示全部楼层
回复测试
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-8-30 15:04:38 | 显示全部楼层    本楼为最佳答案   
擦,刚打了一大段文字不行,只能重新写一遍。  
我破解出来这个顺序了。首先你需要找到head标签中的第五个meta标签(从0开始数)
<meta name="client" content="NzBUJTY0USUxNkYlNTVLJTUwRCU1OEglMzBQJTIwTyU1M1olNTFHJTI2RCU3MkQlMjdTJTQ1WiUxM0UlMlklMzdaJTE1TiUyME4lMEIlN0IlNTREJTU4SSU2N0YlNTZVJTQ5QiU3MUElMUQlMjRNJTUxUSU2MlklMTNEJTY0TyUxMkclNDFPJTlYJTM3UyU0OVUlMTVQJTM1QyUyNUslM1YlMzNCJTc1UCUyOVElNEIlNzJaJTM4QiUzM00lNDhCJTQ0SSU3MVklNDZNJTY4UiU3M0ElMjNVJTQwQiU0NU4lMjBUJTI5VyU2N1MlMzZKJTY1VCU1NFMlMjhaJTE2VyU2MlklMTJDJTc4UyUyMlAlMTNCJTQ3RSU0MlUlNDk=" />
把content的内容进行转码,我这里用python和javascript都演示一遍吧。
python解码:
import base64
import re
def decode_base64(data):
    missing_padding = 4 - len(data) % 4
    if missing_padding:
        data += b'='* missing_padding
    return base64.decodestring(data)
def main():
    a = b'NzBUJTY0USUxNkYlNTVLJTUwRCU1OEglMzBQJTIwTyU1M1olNTFHJTI2RCU3MkQlMjdTJTQ1WiUxM0UlMlklMzdaJTE1TiUyME4lMEIlN0IlNTREJTU4SSU2N0YlNTZVJTQ5QiU3MUElMUQlMjRNJTUxUSU2MlklMTNEJTY0TyUxMkclNDFPJTlYJTM3UyU0OVUlMTVQJTM1QyUyNUslM1YlMzNCJTc1UCUyOVElNEIlNzJaJTM4QiUzM00lNDhCJTQ0SSU3MVklNDZNJTY4UiU3M0ElMjNVJTQwQiU0NU4lMjBUJTI5VyU2N1MlMzZKJTY1VCU1NFMlMjhaJTE2VyU2MlklMTJDJTc4UyUyMlAlMTNCJTQ3RSU0MlUlNDk'
    dd = str(decode_base64(a))
    req = re.findall(r"\d+\.?\d*",dd)
    print(req)
if __name__ == '__main__':
    main()

js解码
var book = 'NzBUJTY0USUxNkYlNTVLJTUwRCU1OEglMzBQJTIwTyU1M1olNTFHJTI2RCU3MkQlMjdTJTQ1WiUxM0UlMlklMzdaJTE1TiUyME4lMEIlN0IlNTREJTU4SSU2N0YlNTZVJTQ5QiU3MUElMUQlMjRNJTUxUSU2MlklMTNEJTY0TyUxMkclNDFPJTlYJTM3UyU0OVUlMTVQJTM1QyUyNUslM1YlMzNCJTc1UCUyOVElNEIlNzJaJTM4QiUzM00lNDhCJTQ0SSU3MVklNDZNJTY4UiU3M0ElMjNVJTQwQiU0NU4lMjBUJTI5VyU2N1MlMzZKJTY1VCU1NFMlMjhaJTE2VyU2MlklMTJDJTc4UyUyMlAlMTNCJTQ3RSU0MlUlNDk=';
var a = Buffer.from(book, 'base64').toString('utf-8').split(/[A-Z]+%/);
console.log(a);
解析出来的列表就是你的要爬取小说的顺序。  
我把网页源代码下载下来测试是正确的。  
剩下的工作就就是用正则把小说正文的内容按照得到的顺序排序就好了。   
不过建议你还是换一个网站爬取吧。
这个网站真的很麻烦。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-8-30 15:08:50 | 显示全部楼层
另外说一下,这个网站只是在排序上面加密。
像你说的js其实没有加密你只需要把js放到js解密进行解密就好了。  
多谷歌一下就好了。别想太多。   
给个好评吧。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

发表于 2018-8-30 15:09:49 | 显示全部楼层
我的解码代码在审核中
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-8-30 15:24:02 | 显示全部楼层
麻烦楼主把我之前的“回复测试”删了。  
我发出来的解密代码已经发出来,在审核中。  
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-7-20 12:50:11 | 显示全部楼层
wongyusing 发表于 2018-8-30 15:24
麻烦楼主把我之前的“回复测试”删了。  
我发出来的解密代码已经发出来,在审核中。

非常感谢 虽然我已经用最笨的办法selenium打开浏览器解决了 但爬的挺慢的 现在试了试你的方法快多了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-7-20 18:25:59 | 显示全部楼层
wongyusing 发表于 2018-8-30 15:04
擦,刚打了一大段文字不行,只能重新写一遍。  
我破解出来这个顺序了。首先你需要找到head标签中的第五个 ...

等等 为什么这个代码数据出来以后有重复的数字 还有中间有连不起来的
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-7-20 22:42:05 | 显示全部楼层
fkmol 发表于 2019-7-20 18:25
等等 为什么这个代码数据出来以后有重复的数字 还有中间有连不起来的

解码方式改了,就在我写出的这个答案的两个星期后改了,
现在需要另一种公式来解开这个密钥
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-7-21 22:03:31 | 显示全部楼层
wongyusing 发表于 2019-7-20 22:42
解码方式改了,就在我写出的这个答案的两个星期后改了,
现在需要另一种公式来解开这个密钥

已经不想别的办法了 我还是老老实实的用selenium吧
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-7-21 22:10:53 | 显示全部楼层
fkmol 发表于 2019-7-21 22:03
已经不想别的办法了 我还是老老实实的用selenium吧

这个网站反爬的机制一般般吧。  
就是找到那段解密的js代码翻译成python代码就行了。  
只是有些js的机制,例如说自增,哪里有一丢丢麻烦。
其他还好
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-4-30 21:19:14 | 显示全部楼层
本帖最后由 fkmol 于 2020-4-30 21:20 编辑
wongyusing 发表于 2018-8-30 14:15
这个排序机制我破解出来了,但是很麻烦,需要你自己按照密文逐一排序,  
我这里说一下原理吧,首先在网页 ...


在学校了解了一定的语法以后 这东西终于被我破译了
star: 0,childNode: []
for (var i = 0; i < this.body.childNodes.length; i++) {
            if (this.body.childNodes[i].tagName == 'H2') {
                this.star = i + 1
            };
            if (this.body.childNodes[i].tagName == 'DIV' && this.body.childNodes[i].className != 'chapter') {
                break
            }
        };
        for (var i = 0; i < a.length; i++) {
            if (a[i] < 5) {
                this.childNode[a[i]] = this.body.childNodes[i + this.star];
                j++
            } else {
                this.childNode[a[i] - j] = this.body.childNodes[i + this.star]
            }
        };
前面一个函数的大致的意思就是id=content的第一个节点h2的话 star的值为1 第一个节点是div或者chapter的话直接结束循环 总结就是看看第一个带文字的是第几个star就等于几
第二个函数的意思就是根据你这个破译列出的列表就是a 循环 a[i]如果小于5 那就将前面那个空列表childNode的第a[i]个等于i+star(因为js可以直接预订 没有的位置返回空) j++就相当于Python的+=1啦
咳咳 说个有点打脸的 大佬你这个函数其实只破解了一般 并且 这个网站规则其实一直没改
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-11-27 00:25

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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