百度指数爬取

34次阅读

共计 2122 个字符,预计需要花费 6 分钟才能阅读完成。

1. 为什么做这个

今天一个朋友问能不能拿到百度指数的折线图数据,便上网查了相关资料,参考了网上的一位作者,链接地址:http://www.pianshen.com/artic…,教了朋友怎么拿数据。

2. 观察

经过观察,百度指数并没有返回包含真实数据的 json 文件,而是加密过后的数据,但是为了渲染,在前端应该有对应的解密代码。

3. 实验

  • 实验工具:谷歌浏览器
  • 请求截图
  • 发现请求的返回数据中返回了:data 及 uniqid 两个值,猜测 data 为加密的数据,以及 uniqid 为密钥
  • 解密,由上文的参考文章中得知 js 解密代码如下:

function decrypt(t,e){for(var a=t.split(""),i=e.split(""),n={},s=[],o=0;o<a.length/2;o++)
            n[a[o]]=a[a.length/2+o]
        for(var r=0;r<e.length;r++)
            s.push(n[i[r]])
        return s.join("")
}
var e="j5TnWEU5,jEU5,LEU55jEVUnTEU,VUEjjrT5EjjW,rEU5,TEVTTnEVT,jEVnLTEUjjTEjLVWrEjL,nVEV5VjErU,VErTT5Err,5EVnULEUr,WEUWLVErUrUErrWLEVL5,EVn,jEVW5rEjL5WUEUV,UEVj,W" // 加密后的数据
var t="xWEvn5UVITL,jtr.6,%3298-5041+7" // 密钥
var data = decrypt(t,e)
console.log(data) //12536,9241,9240,9221,8935,9489,11752,11647,9245,8553,8541,8305,9115,10867,10438,8281,7948,7552,7742,8390,9746,9608,7979,7760,8024,8341,8627,10269,9849,8146
  • 写了个 html 解密小工具,如下图所示
  • 工具的源码如下(瞎写的一个工具,望大家见谅):
<!DOCTYPE html>
<html darkmode="false">
<head>
     <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
     <title> 百度指数数据解密 </title>
</head>
<body style="width: 100%;height: 100%;">
    <div style="height:400px;width:400px;margin:0 auto;margin-top:100px;">
        <label > 输入 data</label></label>
        <textarea id="encryptedData" style="width: 400px;height: 100px;"></textarea>
         <div style="width: 400px;height:20px;"></div>
        <label style="margin-top: 40px;"> 输入 uniqid 请求返回的数据 </label>
        <textarea id="key" style="width: 400px;height: 100px;"></textarea>
         <div style="width: 400px;height:20px;"></div>
        <button onclick="showdata()" style="width: 410px;height:40px;font-size: 16px;"> 解密 </button>
        <div style="width: 400px;height:20px;"></div>
        <label style="margin-top: 40px;"> 解密的结果为 </label>
        <textarea id="data" style="width: 400px;height: 100px;"></textarea>
    </div>
    
</body>
<script type="text/javascript">
    function decrypt(t,e){for(var a=t.split(""),i=e.split(""),n={},s=[],o=0;o<a.length/2;o++)
            n[a[o]]=a[a.length/2+o]
        for(var r=0;r<e.length;r++)
            s.push(n[i[r]])
        return s.join("")
    }
    function showdata(){document.getElementById("data").value = ""var encryptedData = document.getElementById("encryptedData").value
        var key = document.getElementById("key").value
        var data = decrypt(key,encryptedData)
        document.getElementById("data").value = data
    }
    
</script>
</html>

正文完
 0