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日

相关文章

  • 详解javascript获取url信息的常见方法

    下面我会详细讲解“详解javascript获取url信息的常见方法”的完整攻略。 获取url信息 在javascript中,获取url信息可以通过window.location对象来实现。window.location提供了一系列属性,能够帮助我们轻松获取当前网页的各种信息。 获取url 获取当前页面url的方法是直接访问window.location属性,…

    JavaScript 2023年6月11日
    00
  • JavaScript常用工具函数库汇总

    JavaScript常用工具函数库汇总 什么是JavaScript常用工具函数库? JavaScript常用工具函数库指的是一组JavaScript函数集合,旨在提供在日常工作中最常用和最基础的工具函数,以便在开发过程中更便捷地进行常见操作,以提高工作效率。 常用工具函数库有哪些? 常用工具函数库有很多,这里推荐以下几个: 1. Lodash Lodash是…

    JavaScript 2023年5月18日
    00
  • javascript显示用户停留时间的简单实例

    JavaScript 显示用户停留时间的简单实例 在网页开发中,我们有时需要知道用户在页面上停留的时间。今天我们就来分享一下如何通过 JavaScript 显示用户停留时间的简单实例。 思路: 1.获取当前时间 2.当用户进入页面时开始记录时间 3.当用户离开页面时,计算时间差 4.将时间差显示在页面上 示例1:采用 Date() 对象获取时间 <!D…

    JavaScript 2023年5月27日
    00
  • javascript 常见的闭包问题的解决办法

    JavaScript 常见的闭包问题及解决办法 在 JavaScript 中,闭包是一个非常重要的概念,它的出现可以使得我们的代码更加健壮和灵活,但是也因为其特殊的作用域和生命周期,会导致一些常见的问题。在本文中,我们将会详细讲解这些问题以及解决办法。 什么是闭包 闭包是指一个函数能够访问其词法作用域外的变量。在 JavaScript 中,每一个函数都是一个…

    JavaScript 2023年6月10日
    00
  • 原生JS实现的碰撞检测功能示例

    首先介绍一下什么是碰撞检测。碰撞检测是指在计算机图形学中,用于检测两个物体是否相交的技术。在游戏开发中,碰撞检测是非常重要的技术之一,用于检测游戏角色与游戏场景中的物体是否有接触。 原生JS实现的碰撞检测功能可以通过以下步骤实现: 确定需要检测碰撞的物体 首先,需要确定需要检测碰撞的物体,例如游戏角色、游戏场景中的物体等等。在网页上,也可能需要检测碰撞的元素…

    JavaScript 2023年6月11日
    00
  • 使用原生js写ajax实例(推荐)

    使用原生JavaScript写AJAX实例是一个非常常见的前端开发技巧。下面是该攻略的完整步骤: 一、定义AJAX对象 使用原生JavaScript实现AJAX请求需要创建一个XMLHttpRequest对象(简称XHR)。使用XHR对象来与服务器交互数据,可以不用刷新页面就能更新数据。创建XHR对象的代码如下: let xhr = new XMLHttpR…

    JavaScript 2023年6月11日
    00
  • js实现时钟定时器

    关于JS实现时钟定时器的攻略如下: 确定设计思路 1.获取当前时间2.计算时针、分针、秒针的位置3.将时针、分针、秒针对应的角度应用到实际页面上 获取当前时间 我们需要获取当前的系统时间,这可以通过JS的Date对象实现。使用 new Date() 可以初始化一个Date对象,然后分别获取当前时间的小时、分钟、秒等信息。 const now = new Da…

    JavaScript 2023年5月27日
    00
  • 详解JavaScript中的箭头函数的使用

    下面是详解JavaScript中的箭头函数的使用的完整攻略。 什么是箭头函数 箭头函数是ES6新增的函数声明方式,它使用箭头(=>)代替了传统函数的声明方式,可以简化代码的书写并且更加易读。 箭头函数的语法如下: // 无参箭头函数 () => {} // 有参箭头函数 (param1, param2) => {} // 带返回值的箭头函数…

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