下面我将详细讲解关于“js逆向解密之网络爬虫”的完整攻略。这篇攻略包含以下主要内容:
- 网络爬虫概述
- 网络爬虫中的JS逆向解密
- 示例:对bilibili网站使用JS逆向解密进行网络爬虫
网络爬虫概述
网络爬虫是一种利用程序自动抓取网络信息的技术。网络爬虫可以自动访问网络上的网站,获取其中的数据,并将其存储在本地的数据库中供后续分析使用。在网络爬虫的基础上,我们可以构建各种数据采集和分析系统,例如搜索引擎、数据挖掘工具等等。
网络爬虫中的JS逆向解密
在访问某些网站时,我们需要在浏览器中执行一些JS代码才能够获得一些有用的页面信息。这些JS代码往往包含加密、解密、签名等算法,以及加密密钥等重要信息。如果我们能够正确地解密这些JS代码,就可以直接在程序中模拟执行这些JS代码,从而获取到所需要的信息。这就是“JS逆向解密”技术的核心所在。
具体来说,我们可以通过以下步骤进行JS逆向解密:
- 在浏览器中打开需要爬取的网站,并打开开发者工具(一般按F12键)。
- 在开发者工具中选择“Network”(网络)选项卡,然后刷新页面,并在请求流中找到响应头或响应体包含有加密的JS代码的请求。
- 将加密的JS代码拷贝到本地文本编辑器中,并进行逆向解密算法分析和编码处理。
- 在代码中添加所需要的数据参数,比如请求参数、加密密钥等。
- 程序中正确模拟执行JS代码并获得相应的数据。
示例:对bilibili网站使用JS逆向解密进行网络爬虫
以下是在对bilibili网站使用JS逆向解密进行网络爬虫时所需的具体步骤和代码:
- 在浏览器中打开bilibili网站,并打开开发者工具。
- 在开发者工具中选择“Network”选项卡,然后刷新页面,并在请求流中找到响应体包含有加密的JS代码的请求。这里以获取bilibili排行榜页面数据为例,拷贝并提取以下JS代码:
var s=/(^|&)platform=([^&]*)(&|$)/.exec(location.search);if(s&&"android_m | hd | hd_4k | ios | web"==decodeURIComponent(s[2]))dt.data.platform=decodeURIComponent(s[2]);
(function(){
var c={};
document.addEventListener("visibilitychange",function(e){
"hidden"===document.visibilityState&&(c=window.performance.timing)
});if(void 0===window.Long||void 0===window.protobuf)return L;
window.__bof__=function(e){
var t=window.performance.timing;
if("number"==typeof t.navigationStart&&"number"==typeof t.responseEnd){
var n=c.responseEnd&&c.responseEnd-t.navigationStart||0;a({
vqv_bof:{
cost_time:parseInt(+t.responseEnd-e),
backend_cost_time:parseInt(n),
ts:t.navigationStart
}
})
}
},
L
})();
window.__INITIAL_STATE__ = /* eslint-disable-line */
{"rankList":{"archives":[{"aid":73634394,"author":"冬瓜BOW","coins":67437,"create":"2019-11-22 11:19","description":"","duration":442,"favorites":699963,"mid":33673125,"pic":"https://i1.hdslb.com/bfs/archive/b6df4204c0d3f8e7a6c66c4e3b2e8f6f8c69a3a.jpg","play":5099244,"pts":345138,"title":"霸道女上司给我表白了!【LoveS】","video_review":177449}]}};
-
对以上JS代码进行逆向分析,这里给出简要分析结果:
-
该JS代码是通过正则匹配获取浏览器参数中的platform信息,并在data对象参数中添加相应的内容。
- 该JS代码实际上是一个匿名函数,其内部声明了一个变量c,用于保存页面可见性变更事件触发时的performance.timing信息。
- 程序中需要用到的是__INITIAL_STATE__对象,这是网站的初始状态数据,包含了排行榜页面的线性信息等。
const axios = require('axios')
const fs = require('fs')
const FormData = require('form-data')
const jsdom = require('jsdom')
const { JSDOM } = jsdom
const jquery = require('jquery')
const vm = require('vm')
const axiosCookieJarSupport = require('axios-cookiejar-support').default
const tough = require('tough-cookie')
axiosCookieJarSupport(axios)
const cookieJar = new tough.CookieJar()
const getInitialState = html => {
const dom = new JSDOM(html)
const $ = jquery(dom.window)
$('<script />')
.attr('charset', 'utf-8')
.appendTo($('head'))
.text(() => {
const a = Function((/<script>([\s\S]*?)<\/script>/gm).exec(html.replace(/\n/g, "").replace(/\s+|\(|\)/gm, '').replace('window.JSON', JSON.stringify).replace('window.__playinfo__', JSON.stringify).replace(/window\.__initial_state__|__INITIAL_STATE__/gm, 'a'))
[1].replace(/(\S)(\{.*\})(\S)/mg, "$1\n$2\n$3")
.replace(/([{,])\s*(['"])?([a-zA-Z0-9_]+)(['"])?\s*:/gm, '$1"$3":')
.replace(/'/gm, '"').replace(/\s+/gm, '')
.replace(/^a=/m, ""))
vm.runInThisContext(`Object.assign(window.__INITIAL_STATE__, ${a})`)
})
const initialState = dom.window.__INITIAL_STATE__
return initialState
}
const getRank = async () => {
const url = 'https://www.bilibili.com/ranking'
const { data } = await axios.get(url, {
jar: cookieJar,
withCredentials: true,
headers: {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0;Win64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.102 Safari/537.36 Edge/18.19582'}
})
const { rankList } = getInitialState(data)
console.log(rankList)
}
getRank().catch(console.error)
-
在代码中添加所需的数据参数,比如请求参数、加密密钥等。
-
运行代码,正确模拟执行JS代码并获得相应的数据。
以上就是对bilibili网站使用JS逆向解密进行网络爬虫的完整攻略。同样,你也可以根据这个思路尝试爬取其他网站的数据,但需要注意一些伦理和法律规定,并且不要过分干扰网站正常运营。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:js逆向解密之网络爬虫 - Python技术站