本次要学习的是某榜的数据--本系列提供完整思路

首先我们打开网站,打开F12抓包工具,选择抓包工具中的网络选项,选择XHR抓动态数据。

javascript爬虫解析 js爬虫教程_爬虫

可以看到网站的数据是排行榜的类型(这个也算是找动态数据的经验)-- 后面会解释有什么用

javascript爬虫解析 js爬虫教程_网络爬虫_02

 

调整好抓包工具后 再次刷新网站 抓取动态数据(可以看到下面的数据)

javascript爬虫解析 js爬虫教程_爬虫_03

 这个网站的动态数据比较少,如果遇到比较多的动态数据,就可以根据上面我们判断我们要抓的是排行类型的数据,就可以直接定位到rank 排名的意思 找到数据接口

 

找到接口以后--- 点击接口中的预览 看是否有自己需要的数据(图片中已经显示 数据是我们需要的,那就表示已经找到了数据接口)

javascript爬虫解析 js爬虫教程_爬虫_04

 

接下来就是爬虫逆向的思路步骤了!!!

首先查看请求头是否有加密数据(图片中未发现有加密数据)

javascript爬虫解析 js爬虫教程_网络爬虫_05

 

 其次查看负载中是否有加密数据(图片中有加密数据)-- nonce与xyz都是加密的数据

javascript爬虫解析 js爬虫教程_爬虫_06

那么这个时候就需要我们去解决这个加密的数据了

使用全局搜索,搜索nonce找到加密这个参数的方法

javascript爬虫解析 js爬虫教程_python_07

点击进入到源代码

然后Ctrl+F 搜索nonce (看到 nonce 打上断点调试)

javascript爬虫解析 js爬虫教程_js_08

 调试后 可以看到 这个j()函数 就是nonce的加密方法

javascript爬虫解析 js爬虫教程_javascript爬虫解析_09

 进入到 j()方法 将j()方法复制下来 

javascript爬虫解析 js爬虫教程_python_10

这里需要注意一下,这里是单独把js扣下来,所以需要改一下,改成function j(),而不是直接复制下来就可以直接使用的。

function j() {
        for (var a = ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "a", "b", "c", "d", "e", "f"], b = 0; b < 500; b++)
            for (var c = "", d = 0; d < 9; d++) {
                var e = Math.floor(16 * Math.random());
                c += a[e]
            }
        return c
}

console.log(j())

 打开pycharm 创建js文件  粘贴刚刚复制的j()方法 运行看看是否能模拟 网站生成nonce

javascript爬虫解析 js爬虫教程_爬虫_11

 运行成功

javascript爬虫解析 js爬虫教程_网络爬虫_12

 

成功模拟出nonce以后 接下来就需要找xyz参数的生成方法


与找nonce同理 但是这里可以看到 是和nonce生成在同一个js 只是使用的是不同的方法

javascript爬虫解析 js爬虫教程_爬虫_13

根据图片就可以发现,xyz的生成和d()函数是息息相关的,那么我们直接进入d()函数看看是什么样的

javascript爬虫解析 js爬虫教程_javascript爬虫解析_14

进入d函数以后可以看到,define里面一个关键字“md5”  这样就说明xyz应该是md5加密的  

接下来就2个思路,第一把整个d函数的js扣下来,用JS运行加密,第二就是用python直接模拟md5算法进行加密

我这里选择的是python直接模拟

但是这里还有一个问题就是,我们并不知道xyz到底是对哪一个参数进行了加密,这里我们就要对js进行调试了,如图我们调试发现,是对其他的全部参数进行加密(因为d()函数里面是h,定位h就是其他全部参数),那么我们就可以进行模拟了

javascript爬虫解析 js爬虫教程_javascript爬虫解析_15

 这里模拟要注意 获取时间的时候 是当前时间-2  因为这个网站是获取到2天之前的数据 

并且这里还需要注意一点,开始的时间和结束的时间一定要设置好然后和其他参数一起写入,再进行加密,代码如下:

# 获取当前时间
now_time = datetime.datetime.now()
end = (now_time + datetime.timedelta(days=-2)).strftime("%Y-%m-%d")
start = (now_time + datetime.timedelta(days=-2)).strftime("%Y-%m-%d")
pojie = '/xdnphb/main/v1/weibo_day/rank?AppKey=joker&end={}&rank_name=个人认证&rank_name_group=&start={}&nonce={}'.format(
    end, start, nonce)
hl = hashlib.md5()
hl.update(pojie.encode(encoding='utf8'))
md5 = hl.hexdigest()
xyz = str(md5)

data = {
    'end': end,
    'rank_name': '个人认证',
    'rank_name_group': '',
    'start': start,
    'nonce': nonce,
    'xyz': xyz
}