js逆向解密之网络爬虫

yizhihongxing

下面我将详细讲解关于“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日

相关文章

  • 梳理总结25个JavaScript数组操作方法实例

    首先,我们要对“梳理总结25个JavaScript数组操作方法实例”的主题进行分析和概述,以明确我们需要解决的问题和达成的目标。 主题分析 这个主题的核心是JavaScript数组操作方法的总结和使用,需要概述25个常用的方法,以便读者快速掌握数组操作技巧。我们的目标是提供一份详细的文档,方便读者进行查阅和学习。 操作步骤 为了实现上述目标,我们需要完成以下…

    JavaScript 2023年5月27日
    00
  • PHP的Yii框架的基本使用示例

    下面是关于“PHP的Yii框架的基本使用示例”的完整攻略。 一、什么是Yii框架? Yii框架是一个高性能的、基于组件的PHP框架,它具有良好的扩展性和灵活性,是一个适用于Web应用开发的框架。Yii框架可以让开发者在减少重复性工作的同时,保持代码的规范和可读性。 二、Yii框架的安装 首先,我们需要安装Yii框架,可以通过Composer来进行安装,执行以…

    JavaScript 2023年6月11日
    00
  • jsp+ajax发送GET请求的方法

    当需要在JSP页面中使用ajax发送GET请求时,可以参照以下步骤进行操作: 步骤一:引入jQuery库文件 使用ajax发送请求时需要引入jQuery库文件。可以在head标签中使用以下代码引入: <script src="https://cdn.staticfile.org/jquery/1.10.2/jquery.min.js&quot…

    JavaScript 2023年6月11日
    00
  • 微信小程序 参数传递详解

    微信小程序参数传递详解 在微信小程序中,参数传递是非常常见的操作。例如,在不同页面之间传递数据,或者从API获取数据后通过参数传递渲染到当前页面中。本文将详细讲解微信小程序中常用的参数传递方式,以及它们的使用方法和适用场景。 Query参数 Query参数是指通过URL传递的参数。在微信小程序中,可以使用wx.navigateTo方法跳转到其他页面,并且可以…

    JavaScript 2023年6月11日
    00
  • JavaScript流程控制(循环)

    JavaScript流程控制(循环) JavaScript提供了循环结构来重复执行代码块,为开发者处理重复性任务提供了方便。 在JavaScript中,有三种循环结构:for、while和do…while。在使用这些结构之前需要确定循环的条件,即循环的终止条件。只有当终止条件为false时,循环才会停止。 1. for循环 for循环是JavaScrip…

    JavaScript 2023年5月27日
    00
  • JavaScript中json使用自己总结

    下面是关于“JavaScript中json使用”的攻略: 什么是JSON? JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,它可以让数据以易于阅读的形式在程序之间进行传输,包括文本、数字、布尔值、数组和对象等类型的数据。 JSON的格式很简单明了,它由键值对组成,键必须是字符串,值可以是任意数据类型。JSON的语法…

    JavaScript 2023年5月27日
    00
  • JS的框架Polymer中的dom-if和is属性使用说明

    Polymer是一个基于Web Components标准的JavaScript框架,它提供了一些常用的组件和工具,例如dom-if和is属性。 dom-if dom-if是Polymer中的一个条件渲染组件,它可以根据条件动态地显示或隐藏元素。我们可以使用dom-if元素包裹需要进行条件渲染的元素,并设置if属性来控制是否显示该元素。当if属性返回true时…

    JavaScript 2023年6月10日
    00
  • JavaScript代码优雅,简洁的编写技巧总结

    那么现在我将分享“JavaScript代码优雅,简洁的编写技巧总结”的攻略。 减少嵌套 嵌套层数过多的代码通常会让代码难以阅读和理解。因此,我们可以通过减少嵌套来提高代码的可读性和可维护性。 比较嵌套版本: function calculateTotal(users) { var total = 0; for (var i = 0; i < users…

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