【逆向爬虫】Python中执行调用JS的多种方法汇总

这篇具有很好参考价值的文章主要介绍了【逆向爬虫】Python中执行调用JS的多种方法汇总。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、引言

“以前的数据靠买,现在的数据靠爬”,越来越多的学者通过网络爬虫来获取数据。但是做爬虫的人都知道,现在的很多网站都在和我们斗智斗勇,防护普遍越来越好,并且越有价值的网站在这方面越强,哪怕是小一点的网站也多多少少存在一些反爬。而JS逆向又是网络反爬中运用最多的一种,现在做爬虫的人不懂JS简直是寸步难行,因为各种JS加密需要逆向!破解JS加密只是第一步,之后就是如何在我们的Python代码中直接执行JS,下面介绍一下几种Python中执行JS代码的方法。

二、方法介绍

1.PyExecJS方法

首先第一步安装:

pip3 install PyExecJS

PyExecJS 是一个简单易用的库,它提供了一个通用的接口来执行 JavaScript代码,可以在多个JavaScript 运行时环境下工作,包括 Node.js、PhantomJS。

然后导入excejs,它是一个在 Python中执行JS代码的库,使用示例如下:

md5_js = 
'''function hex_md5(s){ return binl2hex(core_md5(str2binl(s), s.length * 8));}
function b64_md5(s){ return binl2b64(core_md5(str2binl(s), s.length * 8));}
function hex_hmac_md5(key, data) { return binl2hex(core_hmac_md5(key, data)); }
function b64_hmac_md5(key, data) { return binl2b64(core_hmac_md5(key, data)); }
function calcMD5(s){ return binl2hex(core_md5(str2binl(s), s.length * 8));}

function md5_vm_test()
{
  return hex_md5("abc") == "900150983cd24fb0d6963f7d28e17f72";
}
function cxx(a, d) {
    var e;
    a = a - 0,e = str_spl[a]
    return e;
}
function core_md5(x, len)
{

  x[len >> 5] |= 0x80 << ((len) % 32);
  x[(((len + 64) >>> 9) << 4) + 14] = len;
  var a =  1732584193;
  var b = -271733879;
  var c = -1732584194;
  var d =  271733878;
  for(var i = 0; i < x.length; i += 16)
  {
    var olda = a;
    var oldb = b;
    var oldc = c;
    var oldd = d;

    a = md5_ff(a, b, c, d, x[i+ 0], 7 , -680876936);
    d = md5_ff(d, a, b, c, x[i+ 1], 12, -389564586);
    c = md5_ff(c, d, a, b, x[i+ 2], 17,  606105819);
    b = md5_ff(b, c, d, a, x[i+ 3], 22, -1044525330);
    a = md5_ff(a, b, c, d, x[i+ 4], 7 , -176418897);
    d = md5_ff(d, a, b, c, x[i+ 5], 12,  1200080426);
    c = md5_ff(c, d, a, b, x[i+ 6], 17, -1473231341);
    b = md5_ff(b, c, d, a, x[i+ 7], 22, -45705983);
    a = md5_ff(a, b, c, d, x[i+ 8], 7 ,  1770035416);
    d = md5_ff(d, a, b, c, x[i+ 9], 12, -1958414417);
    c = md5_ff(c, d, a, b, x[i+10], 17, -42063);
    b = md5_ff(b, c, d, a, x[i+11], 22, -1990404162);
    a = md5_ff(a, b, c, d, x[i+12], 7 ,  1804603682);
    d = md5_ff(d, a, b, c, x[i+13], 12, -40341101);
    c = md5_ff(c, d, a, b, x[i+14], 17, -1502002290);
    b = md5_ff(b, c, d, a, x[i+15], 22,  1236535329);
    a = md5_gg(a, b, c, d, x[i+ 1], 5 , -165796510);
    d = md5_gg(d, a, b, c, x[i+ 6], 9 , -1069501632);
    c = md5_gg(c, d, a, b, x[i+11], 14,  643717713);
    b = md5_gg(b, c, d, a, x[i+ 0], 20, -373897302);
    a = md5_gg(a, b, c, d, x[i+ 5], 5 , -701558691);
    d = md5_gg(d, a, b, c, x[i+10], 9 ,  38016083);
    c = md5_gg(c, d, a, b, x[i+15], 14, -660478335);
    b = md5_gg(b, c, d, a, x[i+ 4], 20, -405537848);
    a = md5_gg(a, b, c, d, x[i+ 9], 5 ,  568446438);
    d = md5_gg(d, a, b, c, x[i+14], 9 , -1019803690);
    c = md5_gg(c, d, a, b, x[i+ 3], 14, -187363961);
    b = md5_gg(b, c, d, a, x[i+ 8], 20,  1163531501);
    a = md5_gg(a, b, c, d, x[i+13], 5 , -1444681467);
    d = md5_gg(d, a, b, c, x[i+ 2], 9 , -51403784);
    c = md5_gg(c, d, a, b, x[i+ 7], 14,  1735328473);
    b = md5_gg(b, c, d, a, x[i+12], 20, -1926607734);
    a = md5_hh(a, b, c, d, x[i+ 5], 4 , -378558);
    d = md5_hh(d, a, b, c, x[i+ 8], 11, -2022574463);
    c = md5_hh(c, d, a, b, x[i+11], 16,  1839030562);
    b = md5_hh(b, c, d, a, x[i+14], 23, -35309556);
    a = md5_hh(a, b, c, d, x[i+ 1], 4 , -1530992060);
    d = md5_hh(d, a, b, c, x[i+ 4], 11,  1272893353);
    c = md5_hh(c, d, a, b, x[i+ 7], 16, -155497632);
    b = md5_hh(b, c, d, a, x[i+10], 23, -1094730640);
    a = md5_hh(a, b, c, d, x[i+13], 4 ,  681279174);
    d = md5_hh(d, a, b, c, x[i+ 0], 11, -358537222);
    c = md5_hh(c, d, a, b, x[i+ 3], 16, -722521979);
    b = md5_hh(b, c, d, a, x[i+ 6], 23,  76029189);
    a = md5_hh(a, b, c, d, x[i+ 9], 4 , -640364487);
    d = md5_hh(d, a, b, c, x[i+12], 11, -421815835);
    c = md5_hh(c, d, a, b, x[i+15], 16,  530742520);
    b = md5_hh(b, c, d, a, x[i+ 2], 23, -995338651);
    a = md5_ii(a, b, c, d, x[i+ 0], 6 , -198630844);
    d = md5_ii(d, a, b, c, x[i+ 7], 10,  1126891415);
    c = md5_ii(c, d, a, b, x[i+14], 15, -1416354905);
    b = md5_ii(b, c, d, a, x[i+ 5], 21, -57434055);
    a = md5_ii(a, b, c, d, x[i+12], 6 ,  1700485571);
    d = md5_ii(d, a, b, c, x[i+ 3], 10, -1894986606);
    c = md5_ii(c, d, a, b, x[i+10], 15, -1051523);
    b = md5_ii(b, c, d, a, x[i+ 1], 21, -2054922799);
    a = md5_ii(a, b, c, d, x[i+ 8], 6 ,  1873313359);
    d = md5_ii(d, a, b, c, x[i+15], 10, -30611744);
    c = md5_ii(c, d, a, b, x[i+ 6], 15, -1560198380);
    b = md5_ii(b, c, d, a, x[i+13], 21,  1309151649);
    a = md5_ii(a, b, c, d, x[i+ 4], 6 , -145523070);
    d = md5_ii(d, a, b, c, x[i+11], 10, -1120210379);
    c = md5_ii(c, d, a, b, x[i+ 2], 15,  718787259);
    b = md5_ii(b, c, d, a, x[i+ 9], 21, -343485551);

    a = safe_add(a, olda);
    b = safe_add(b, oldb);
    c = safe_add(c, oldc);
    d = safe_add(d, oldd);
  }
  return Array(a, b, c, d);
}

function md5_cmn(q, a, b, x, s, t)
{
  return safe_add(bit_rol(safe_add(safe_add(a, q), safe_add(x, t)), s),b);
}
function md5_ff(a, b, c, d, x, s, t)
{
  return md5_cmn((b & c) | ((~b) & d), a, b, x, s, t);
}
function md5_gg(a, b, c, d, x, s, t)
{
  return md5_cmn((b & d) | (c & (~d)), a, b, x, s, t);
}
function md5_hh(a, b, c, d, x, s, t)
{
  return md5_cmn(b ^ c ^ d, a, b, x, s, t);
}
function md5_ii(a, b, c, d, x, s, t)
{
  return md5_cmn(c ^ (b | (~d)), a, b, x, s, t);
}

function core_hmac_md5(key, data)
{
  var bkey = str2binl(key);
  if(bkey.length > 16) bkey = core_md5(bkey, key.length * 8);

  var ipad = Array(16), opad = Array(16);
  for(var i = 0; i < 16; i++)
  {
    ipad[i] = bkey[i] ^ 0x36363636;
    opad[i] = bkey[i] ^ 0x5C5C5C5C;
  }

  var hash = core_md5(ipad.concat(str2binl(data)), 512 + data.length * 8);
  return core_md5(opad.concat(hash), 512 + 128);
}

function safe_add(x, y)
{
  var lsw = (x & 0xFFFF) + (y & 0xFFFF);
  var msw = (x >> 16) + (y >> 16) + (lsw >> 16);
  return (msw << 16) | (lsw & 0xFFFF);
}

function bit_rol(num, cnt)
{
  return (num << cnt) | (num >>> (32 - cnt));
}

function str2binl(str)
{
  var bin = Array();
  var mask = (1 << 8) - 1;
  for(var i = 0; i < str.length * 8; i += 8)
    bin[i>>5] |= (str.charCodeAt(i / 8) & mask) << (i%32);
  return bin;
}

function binl2hex(binarray)
{
  var hex_tab = 0 ? "0123456789ABCDEF" : "0123456789abcdef";
  var str = "";
  for(var i = 0; i < binarray.length * 4; i++)
  {
    str += hex_tab.charAt((binarray[i>>2] >> ((i%4)*8+4)) & 0xF) +
           hex_tab.charAt((binarray[i>>2] >> ((i%4)*8  )) & 0xF);
  }
  return str;
}
function binl2b64(binarray)
{
  var tab = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
  var str = "";
  for(var i = 0; i < binarray.length * 4; i += 3)
  {
    var triplet = (((binarray[i   >> 2] >> 8 * ( i   %4)) & 0xFF) << 16)
                | (((binarray[i+1 >> 2] >> 8 * ((i+1)%4)) & 0xFF) << 8 )
                |  ((binarray[i+2 >> 2] >> 8 * ((i+2)%4)) & 0xFF);
    for(var j = 0; j < 4; j++)
    {
      if(i * 8 + j * 6 > binarray.length * 32) str += '';
      else str += tab.charAt((triplet >> 6*(3-j)) & 0x3F);
    }
  }
  return str;
}'''
content = '加密内容'
ctx = execjs.compile(md5_js)
sk = ctx.call('hex_md5', content)  

call里面的参数第一个是JS函数名称, 如果要执行的JS有参数, 后面跟上参数就可以像上面content即可。

2. js2py方法

首先第一步安装:

 pip3 install js2py

js2py是一个专门为 Python 设计的库,允许在 Python 中执行 JavaScript代码,并且提供了较完整的 JavaScript 解释器。它支持更复杂的JavaScript 特性,如闭包和异常处理适用于一些逆向工程场景,因为它能够处理一些混淆和复杂的 JavaScript 代码。它的原理是将JS代码直接转译成Python代码执行,不用安装运行本地环境,启动比较快不过转译时增加了执行时间,而且转译时有时会报错,特别是JS代码很多时,由于不使用本地JS环境,所以像JS混淆的代码转译时往往容易报错。

使用示例:

import js2py
js2py.eval_js('console.log( "Hello World!" )')

使用execute执行JS代码示例:

import js2py
context = js2py.EvalJs() # 实例化解析js对象
js_code = '''
var a = 10
function f(x) {return x*x}
'''
context.execute(js_code) # 调用js代码里面的函数
context.a

在JS中直接使用Python内置函数示例:

import js2py
context = js2py.EvalJs({'python_sum': sum})
context.eval('python_sum(new Array(1, 2, 3))')

函数sum是Python里面的函数,可以直接在js2py中使用,其实很好理解,因为js2py是把js转译成python代码再来执行,当然可以直接执行Python函数了。

转译JS文件方式示例:

from example import example
js2py.translate_file('example.js', 'example.py')
example.someFunction()

除了使用之前上面的方法外,还可以把JS文件转译成Python代码后再调用,这样做的好处是不用每次调用JS文件都要转译一次。

3. node方法

首先确定先安装好nodejs,然后使用subprocess调用node子进程来执行JS。

优点:速度快,而且一般不会出错,因为nodejs跟chrome浏览器一样使用的是v8引擎,在这五种方法中此方法最可靠,特别是有大量js代码要执行时,建议直接调用node。

缺点:需要安装nodejs,并且如果大厂网站或app的js一般都会检测nodejs,所以js代码必须处理好,否则无法通过。

import subprocess
# js文件最后必须有输出,我使用的是 console.log
pro = subprocess.run("node abc.js", stdout=subprocess.PIPE)
# 获得标准输出
_token = pro.stdout
# 转一下格式
token = _token.decode().strip()

4. Selenium方法

首先第一步安装:

pip3 install selenium

Selenium是一个自动化测试工具,可以模拟浏览器行为。可以在浏览器中执行JavaScript,用于实现网页渲染一系列操作。

这里我们需要先下载webdriver以及安装chrome浏览器,或其它浏览器及其相应webdriver

driver地址:https://chromedriver.chromium.org/downloads

Selenium官方网站:https://www.selenium.dev/zh-cn/documentation/

优点:省去了抠JS代码那些枯燥与繁琐的事项。

缺点:必须有浏览器环境支持,执行效率低,只适合在有浏览器环境的情况下执行JS代码。

一般不推荐使用selenium,但是如果不介意效率低的话,selenium算一个不错的选择。

使用示例:

from selenium import webdriver
jsstr = '''
function add() {
    let a = 1;
    let b = 2;
    return a+b;
}'''
# 调用js
driver = webdriver.chrome()
# 异步用这个driver.execute_async_script(js)
result = driver.execute_script(jsstr)
print(result)

5. PyV8方法

PyV8是一个基于Google V8引擎的库,提供在Python中执行 JavaScript代码的功能。它在性能上具有优势,因为V8引擎是高性能的JavaScript引擎。

PyV8只支持Python2的pip安装,不支持python3环境下的pip安装,请直接到官网下载安装二进制文件:https://github.com/emmetio/pyv8-binaries

然后解压后将PyV8.py 与 _PyV8.so (注意:如不是这两个文件名需要修改),将两文件复制到Python的site-packages目录下如/usr/local/lib/python3.6/site-packages

使用示例:

import PyV8
ctxt = PyV8.JSContext()
# ctxt.__enter__()
ctxt.enter()
jsstr = '''
function add() {
    let a = 1;
    let b = 2;
    return a+b;
}'''
result = ctxt.eval(jsstr)
print(result)

以上就是今天的介绍,大家可以根据自己的需要找到适合自己的方法,快去尝试一下吧!

最后

我准备了一些非常系统的Python资料,除了为你提供一条清晰、无痛的学习路径,还甄选了最实用的学习资源以及庞大的主流爬虫案例库。短时间的学习,你就能够很好地掌握爬虫这个技能,获取你想得到的数据,需要的朋友可以扫描文末二维码即可获取

01 专为0基础设置,小白也能轻松学会

我们把Python的所有知识点,都穿插在了漫画里面。

在Python小课中,你可以通过漫画的方式学到知识点,难懂的专业知识瞬间变得有趣易懂。
python 执行js,爬虫,python,javascript,开发语言,大数据,职场和发展,学习

python 执行js,爬虫,python,javascript,开发语言,大数据,职场和发展,学习

你就像漫画的主人公一样,穿越在剧情中,通关过坎,不知不觉完成知识的学习。

02 无需自己下载安装包,提供详细安装教程

python 执行js,爬虫,python,javascript,开发语言,大数据,职场和发展,学习

03 规划详细学习路线,提供学习视频

python 执行js,爬虫,python,javascript,开发语言,大数据,职场和发展,学习

python 执行js,爬虫,python,javascript,开发语言,大数据,职场和发展,学习

04 提供实战资料,更好巩固知识

python 执行js,爬虫,python,javascript,开发语言,大数据,职场和发展,学习

05 提供面试资料以及副业资料,便于更好就业

python 执行js,爬虫,python,javascript,开发语言,大数据,职场和发展,学习
python 执行js,爬虫,python,javascript,开发语言,大数据,职场和发展,学习

这份完整版的Python全套学习资料已经上传CSDN,朋友们如果需要也可以扫描下方csdn官方二维码或者点击主页和文章下方的微信卡片获取领取方式,【保证100%免费】
python 执行js,爬虫,python,javascript,开发语言,大数据,职场和发展,学习文章来源地址https://www.toymoban.com/news/detail-756189.html

到了这里,关于【逆向爬虫】Python中执行调用JS的多种方法汇总的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • python爬虫之JS逆向基础小案例:网抑云数据获取

    嗨喽~大家好呀,这里是魔王呐 ❤ ~! python更多源码/资料/解答/教程等 点击此处跳转文末名片免费获取 所用软件 解释器: python 3.8 编辑器: pycharm 2022.3 使用的模块 第三方模块: requests 数据请求 execjs pip install pyexecjs 内置模块(无需安装): nodejs 模块安装: win + R 输入cmd 输入安

    2024年01月20日
    浏览(21)
  • Python爬虫:利用JS逆向抓取携程网景点评论区图片的下载链接

    1. 前言 文章内容可能存在版权问题,为此,小编不提供相关实现代码,只是从js逆向说一说到底怎样实现这个的过程,希望能够帮助到那些正在做js逆向相关操作的读者,需要代码的读者单独私信我吧!不过,需要注意的是: 代码仅供学习,不能用于商业活动,望读者切记。

    2024年02月15日
    浏览(33)
  • 【Python爬虫案例】抖音下载视频+X-Bogus参数JS逆向分析

    选择自己感兴趣的抖音博主,本次以“经典老歌【车载U盘】”为例 每次请求的页面会有很多接口,需要对接口进行筛选: 第一步筛选XHR筛选 第二步筛选URL中带有post 通过筛选play_add值找到视频的地址 通过对比两次请求发现只有X-Bogus数值会有变化,max_cursor是用翻页,后文再

    2024年03月15日
    浏览(37)
  • Python爬虫:通过js逆向获取某视频平台上的视频的m3u8链接

    1. 前言 现在我们在网页端看的视频,其前端实现原理就小编目前知道的而言,总的有两点:其一,直接就是一个mp4(或其他类似的)视频链接,如果我们能得到这个视频链接,直接用这个链接就能下载到这个视频;其二,和第一点差不多吧!但是直接用链接下载,获取不到视频文

    2024年02月08日
    浏览(15)
  • 【爬虫JS混淆分析】某网站票房响应数据加密(含JS补环境调用与Python解密算法)

    【作者主页】: 吴秋霖 【作者介绍】:Python领域优质创作者、阿里云博客专家、华为云享专家。长期致力于Python与爬虫领域研究与开发工作! 【作者推荐】:对JS逆向感兴趣的朋友可以关注《爬虫JS逆向实战》,对分布式爬虫平台感兴趣的朋友可以关注《分布式爬虫平台搭建

    2024年02月04日
    浏览(14)
  • 【爬虫逆向案例】某道翻译js逆向—— sign解密

    声明:本文只作学习研究,禁止用于非法用途,否则后果自负,如有侵权,请告知删除,谢谢! 相信各位小伙伴在写爬虫的时候经常会遇到这样的情况,一些需要携带的参数一直在变化,今天逆向的这个网站某道翻译也如此: 可以发现变的就两个参数,一个 sign,一个是 m

    2024年02月15日
    浏览(14)
  • WebSocket爬虫与JS逆向实战

    声明:本文章中所有内容仅供学习交流,不可用于任何商业用途和非法用途,否则后果自负,如有侵权,请联系作者立即删除!由于本人水平有限,如有理解或者描述不准确的地方,还望各位大佬指教!! 练习网站: Q3JhenkgUHJvTW9ua2V5IGh0dHBzOi8vd3d3LnBhbnpob3UuZ292LmNuL3p3Z2tfMTU4NjEve

    2024年02月07日
    浏览(16)
  • 【爬虫逆向案例】某易云音乐(评论)js逆向—— params、encSecKey解密

    声明:本文只作学习研究,禁止用于非法用途,否则后果自负,如有侵权,请告知删除,谢谢! 今天逆向的这个网站 某易云音乐 歌曲的评论列表 而要拿到评论列表爬虫发送的表单需要两个参数 params 和 encSecKey。这两个玩意是加密的,所以重点就是怎么搞定这两个参数。 话

    2024年02月14日
    浏览(12)
  • 爬虫+RPC+js逆向---直接获取加密值

    免责声明:本文仅做技术交流与学习,请勿用于其它违法行为;如果造成不便,请及时联系... 目录 爬虫+RPC+js逆向---直接获取加密值 target网址: 抓包 下断点 找到加密函数 分析参数 RPC流程 一坨: 二坨: 运行py,拿到加密值 优志愿_2024高考志愿填报系统-新高考志愿填报选科指南 数据往

    2024年04月14日
    浏览(7)
  • Python3,多种方法,同时执行多条SQL语句,并把查询结果分别写入不同Sheet页,妥妥的学到了。

    小屌丝 :鱼哥,我想请教一个问题。 小鱼 :国庆假期你经历了什么,让你变得如此的 “ 善良 ”? 小屌丝 :别这么说,我一直很善良,至少,很正直… 小鱼 :打住,直接点, 你有什么需要帮助的? 小屌丝 :我就是想把查询的结果也入到excel表中 小鱼 :然后呢? 小屌丝 :

    2024年02月08日
    浏览(31)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包