js逆向解密之网络爬虫

下面我将详细讲解关于“js逆向解密之网络爬虫”的完整攻略。这篇攻略包含以下主要内容:

  • 网络爬虫概述
  • 网络爬虫中的JS逆向解密
  • 示例:对bilibili网站使用JS逆向解密进行网络爬虫

网络爬虫概述

网络爬虫是一种利用程序自动抓取网络信息的技术。网络爬虫可以自动访问网络上的网站,获取其中的数据,并将其存储在本地的数据库中供后续分析使用。在网络爬虫的基础上,我们可以构建各种数据采集和分析系统,例如搜索引擎、数据挖掘工具等等。

网络爬虫中的JS逆向解密

在访问某些网站时,我们需要在浏览器中执行一些JS代码才能够获得一些有用的页面信息。这些JS代码往往包含加密、解密、签名等算法,以及加密密钥等重要信息。如果我们能够正确地解密这些JS代码,就可以直接在程序中模拟执行这些JS代码,从而获取到所需要的信息。这就是“JS逆向解密”技术的核心所在。

具体来说,我们可以通过以下步骤进行JS逆向解密:

  1. 在浏览器中打开需要爬取的网站,并打开开发者工具(一般按F12键)。
  2. 在开发者工具中选择“Network”(网络)选项卡,然后刷新页面,并在请求流中找到响应头或响应体包含有加密的JS代码的请求。
  3. 将加密的JS代码拷贝到本地文本编辑器中,并进行逆向解密算法分析和编码处理。
  4. 在代码中添加所需要的数据参数,比如请求参数、加密密钥等。
  5. 程序中正确模拟执行JS代码并获得相应的数据。

示例:对bilibili网站使用JS逆向解密进行网络爬虫

以下是在对bilibili网站使用JS逆向解密进行网络爬虫时所需的具体步骤和代码:

  1. 在浏览器中打开bilibili网站,并打开开发者工具。
  2. 在开发者工具中选择“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}]}};
  1. 对以上JS代码进行逆向分析,这里给出简要分析结果:

  2. 该JS代码是通过正则匹配获取浏览器参数中的platform信息,并在data对象参数中添加相应的内容。

  3. 该JS代码实际上是一个匿名函数,其内部声明了一个变量c,用于保存页面可见性变更事件触发时的performance.timing信息。
  4. 程序中需要用到的是__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)
  1. 在代码中添加所需的数据参数,比如请求参数、加密密钥等。

  2. 运行代码,正确模拟执行JS代码并获得相应的数据。

以上就是对bilibili网站使用JS逆向解密进行网络爬虫的完整攻略。同样,你也可以根据这个思路尝试爬取其他网站的数据,但需要注意一些伦理和法律规定,并且不要过分干扰网站正常运营。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:js逆向解密之网络爬虫 - Python技术站

(0)
上一篇 2023年5月28日
下一篇 2023年5月28日

相关文章

  • 纯js实现的积木(div层)拖动功能示例

    下面是详细的攻略: 1. 概述 本攻略将详细讲解如何实现“纯js实现的积木(div层)拖动功能示例”。实现过程包括以下几个步骤: 设置div元素的拖动属性; 监听鼠标事件; 计算鼠标相对于被拖动元素的偏移量; 根据鼠标移动的位置,对被拖动元素进行实时更新位置; 实现停止拖拽功能。 2. 操作步骤 步骤一:设置div元素的拖动属性 在HTML代码中,我们需要将…

    JavaScript 2023年5月28日
    00
  • 解析原来浏览器原生支持JS Base64编码解码

    当我们需要在前端对数据进行编码或解码时,可以使用JavaScript中的Base64方法。而浏览器也提供了原生支持Base64编码解码的方法,我们只需要使用浏览器提供的方法即可。 浏览器原生方法 浏览器原生方法包括 window.btoa() 和 window.atob(),分别用于编码和解码Base64数据。 编码方法:window.btoa() 将字符串…

    JavaScript 2023年5月19日
    00
  • js 数组克隆方法 小结

    以下是关于“js 数组克隆方法 小结”的完整攻略: 标准的数组克隆方式 在JavaScript中,有两种标准的数组克隆方式: 利用ES6的扩展运算符(…) const arr1 = [1, 2, 3]; const arr2 = […arr1]; console.log(arr1); // [1, 2, 3] console.log(arr2); /…

    JavaScript 2023年5月27日
    00
  • js使用i18n实现页面国际化的方法

    实现页面国际化(Internationalization,简称i18n)的方法在前端开发中非常常见,可以让我们的网站更易于被全球用户理解和使用。下面我将详细讲解如何使用JavaScript实现网站的i18n。 1. 建立语言包 首先,我们需要建立站点所需的多语言文字资源。针对不同语言,我们可以分别建立不同的语言包(language pack),其中保存着相应…

    JavaScript 2023年5月19日
    00
  • JS如何操作DOM基于表格动态展示数据

    操作DOM基于表格动态展示数据是Web开发中常用的技术。JavaScript是DOM操作的主力军。下面是操作DOM基于表格动态展示数据的完整攻略: 1. 数据渲染 在JavaScript中,可以通过插值表达式、DOM操作等方式将数据渲染到HTML页面。下面我们将介绍两个渲染数据的示例。 1.1 使用innerHTML渲染表格 使用innerHTML属性,可以…

    JavaScript 2023年6月10日
    00
  • javascript生成大小写字母

    要生成大小写字母,可以借助JavaScript提供的字符集和Math对象中的随机数函数来实现。下面是详细的攻略步骤: 1. 定义大小写字母的字符集 JavaScript中的字符集可以用字符串表示,可以定义大小写字母的字符集如下: const lowercase = "abcdefghijklmnopqrstuvwxyz"; const u…

    JavaScript 2023年5月19日
    00
  • JSON.parse处理非标准Json数据出错的解决

    当我们使用JSON.parse()解析JSON格式的数据时,如果数据格式非标准的话,就有可能会出现报错现象。 例如我们有一个非标准的JSON格式数据如下: { name: "Tom", age: 28 } 使用JSON.parse()时会报错,错误信息如下: Uncaught SyntaxError: Unexpected token n…

    JavaScript 2023年5月27日
    00
  • spring boot ajax跨域的两种方式

    当使用Spring Boot框架开发Web应用程序时,可以使用Ajax来进行异步请求和响应。但是在跨域请求时,会涉及到浏览器的一些限制,比如同源政策。本文内容将详细介绍使用Spring Boot如何解决Ajax跨域问题。 1. 什么是Ajax跨域问题 Ajax跨域问题指的是浏览器所遵循的同源策略,导致无法利用Ajax去向不同源的服务器发送请求。跨域请求会被浏…

    JavaScript 2023年6月11日
    00
合作推广
合作推广
分享本页
返回顶部