监听js变量的变化_JS监听事件型爬虫

点击上方“Python数据科学”,选择“星标公众号”

关键时刻,第一时间送达!

88941ad7d7b907b288c79138c939272e.gif

作者:zuobangbang

来源:zuobangbang

最近开始研究网页参数的JS加密,但是大型网站的JS文件过于繁杂,不适合新手上路,于是乎找了几个简单的网页来学习学习。

首先要和大家聊的是监听事件型爬虫(推荐FireFox浏览器)。简单介绍一下JS事件监听:

JavaScript之事件概念和监听事件

1、事件的概念:

JavaScript使我们有能力创建动态页面,网页中的每一个元素都可以产生某些触发JavaScript函数的事件。我们可以认为事件是可以被JavaScript侦测到的一种行为。

2、事件流:

事件流主要分为冒泡型事件和捕获型事件。IE浏览器目前只支持冒泡型事件,而支持标准DOM的浏览器比如火狐、Chrome等两者都支持。

691035c5de3ba7e4d1c416619a14ab88.png

 3、使用返回值改变HTML元素的默认行为:

  HTML元素大都包含了自己的默认行为,例如:超链接、提交按钮等。我们可以通过在绑定事件中加上"return false"来阻止它的默认行为。

4、通用性的事件监听方法:

(1)绑定HTML元素属性:

(2)绑定DOM对象属性:document.getElementById("xxx").οnclick=test;

(https://www.cnblogs.com/dorra/p/7349747.html)

目标网站:http://ac.scmor.com/

第一次写js类的爬虫,断点调试过程写详细些。

0344527195baecc50f552110a3d5977d.png

鼠标点击现在访问时,会前往另一个网页。用火狐浏览器打开,元素定位到“现在访问”,可以看到下图:网页链接没有出现在源代码中,相反在标签末尾有一个event;这代表当点击“现在访问”这个事件发生时,会被监听并做出相应的反应。

e9e90ef19468ad866116078e8b4f2029.png

点击“event”,可以看到一个函数onclick(event),在这个函数里,还有一个visit()函数;这表示当点击“现在访问”发生时,会引发onclick(event)的发生,从而引发visit()函数。

a71360d9c794ae1158a0e74d9b79e691.png

全局搜索(ctrl+shift+f)搜索visit()可以看到下图有一个function visit(url);这就是我们要找的函数啦。(这一步开始使用谷歌浏览器)

ee567090a724b4362a6d9e421b8ed98f.png

来分析一下这个函数:它的变量是url,也就是上图中visit('QSQ7XggEHBUhXDxYLwIFHwh4ZRkwXFI0Pw4jGj5ZXlI=')的QSQ7XggEHBUhXDxYLwIFHwh4ZRkwXFI0Pw4jGj5ZXlI=

给它打断点:

1f08264581507d5bf480e90cbae61a61.png

点击“现在访问”:此时url=QSQ7XggEHBUhXDxYLwIFHwh4ZRkwXFI0Pw4jGj5ZXlI=

82dfb94419e1aecf7a845028bd963a90.png

不断点击(step over next function call),当走完strdecode()函数后,url更新为要访问的页面。下一步就是找到这个函数并分析。

dd166e395ac55bb7f49a7b84d6d9102d.png

找到的strdecode()函数如下:此时

string='QSQ7XggEHBUhXDxYLwIFHwh4ZRkwXFI0Pw4jGj5ZXlI='

3cb995d890b62fe91ae3f44e6328ef3d.png

再经过base64decode以后变成了一段乱码:

299f0f6bcff0d6021d105d11751c2487.png

重新打一次断点:经过base64decode(code)后,返回需要的Url;至此所有的断点调试就完成了。

2d86903c7148704547f47916111770f2.png

这是base64decode函数的代码,里面有一个base64DecodeChars的变量,在函数里是没有定义的,因此后期自己加上。

function base64decode(str) {
   var c1, c2, c3, c4;
   var i, len, out;
   len = str.length;
   i = 0;
   out = "";
   while (i < len) {
       do {
           c1 = base64DecodeChars[str.charCodeAt(i++) & 0xff]
       } while (i < len && c1 == -1);
       if (c1 == -1) break;
       do {
           c2 = base64DecodeChars[str.charCodeAt(i++) & 0xff]
       } while (i < len && c2 == -1);
       if (c2 == -1) break;
       out += String.fromCharCode((c1 << 2) | ((c2 & 0x30) >> 4));
       do {
           c3 = str.charCodeAt(i++) & 0xff;
           if (c3 == 61) return out;
           c3 = base64DecodeChars[c3]
       } while (i < len && c3 == -1);
       if (c3 == -1) break;
       out += String.fromCharCode(((c2 & 0XF) << 4) | ((c3 & 0x3C) >> 2));
       do {
           c4 = str.charCodeAt(i++) & 0xff;
           if (c4 == 61) return out;
           c4 = base64DecodeChars[c4]
       } while (i < len && c4 == -1);
       if (c4 == -1) break;
       out += String.fromCharCode(((c3 & 0x03) << 6) | c4)
   }
   return out
}

还有一个问题,最开始visit()的自变量在哪里呢?网页源代码中都有的噢。一共16个镜像对应16个变量。

867631639a7aa5fbbfbd6e2f6ad4f1b4.png

找到了所有需要的js代码,然后用python还原???不用自己找虐,python提供一个execjs的库,可以直接调用js文件。一共15行代码就可以获得所需的网址啦。

if __name__ == '__main__':
   url='http://ac.scmor.com/'
   headers={
       'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.99 Safari/537.36'
   }
   html=requests.get(url,headers=headers).text
   soup=BeautifulSoup(html,'lxml')
   infs=soup.find('head').find_all('script',type='text/javascript')
   infs=re.findall(r'autourl(.*?);',str(infs))
   node = execjs.get()
   file = '谷歌学术镜像.js'
   ctx = node.compile(open(file, encoding='utf-8').read())
   for inf in infs:
       data=inf.split('=',1)[1][2:-1]
       js='strdecode("{}") '.format(data)
       print(ctx.eval(js))

最后结果如下:

47ad93cfe922d2e6cb781abe4a85588a.png

代码以及Js文件上传到GitHub(https://github.com/zuobangbang/javascript-decode/tree/master/google);觉得不错就star/fork下;有兴趣可以自己做一遍。

往期精彩推荐 

2019年,被高估的AI与数据科学该如何发展?

2018年原创精选文章汇总

大型裁员现场,究竟谁笑到了最后...

这一年我都做了些什么?

d3f134f71e304838593a5ed31a3928cc.png

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/335677.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

HH SaaS电商系统的支付模块设计

文章目录支付单支付单状态流转逻辑说明支付相关实体支付流水记录支付方式支付渠道支付单 销售订单生成时&#xff0c;同步生成支付单&#xff0c;如果销售订单的应付金额由首付款和尾款组成&#xff0c;那么会生成两个支付单 支付单与销售订单的“联合单号”或者“退款单ID”关…

添加几个手机联系人_One UI 3.0: 更细腻、更好用,这才是手机系统该有的样子

作为全球出货量最多的 Android 手机厂商&#xff0c;三星宣布将于北京时间 1 月 14 日正式召开 2021 年度的新品发布会。伴随着 S21 的即将发售&#xff0c;我想借此机会和大家一起来聊一聊前不久刚刚推送正式版本的 One UI 3.0。One UI 3.0 是三星基于 Android 11.0 打造的新一…

HH SaaS电商系统的商城模块设计

文章目录好获SaaS电商系统层级关系商城实体商城运营模式商城可选子系统创建商城商城管理后台有供应系统和无供应系统的B2C和混合模式的商城系统对比有仓储系统和无仓储系统的B2C和混合模式的商城系统对比有店铺系统和没有店铺系统的商城系统对比商城关闭商家入驻通道B2C模式商城…

HH SaaS电商系统的物流单设计

业务说明 物流信息提交后&#xff0c;系统生成物流单&#xff0c;出库单与物流单是一对多的关系 退货时买家填写物流信息&#xff0c;提交后系统生成物流单和入库单&#xff0c;物流单需要保存入库单的id 物流单实体

pcl_openmap_OpenMap教程5 – 3层GIS应用程序

pcl_openmap1.简介 欢迎使用OpenMap系列教程的第5个教程。 OpenMap是一个免费的开源Java GIS库。 这是以前的教程列表&#xff1a; 在第一个教程中&#xff0c;我们创建了一个基本的OpenMap GIS应用程序&#xff0c;该应用程序在JFrame中显示一个从文件系统加载的具有一个形状…

HH SaaS电商系统的商品系统设计

文章目录商品信息结构商品信息总结构商品信息结构图发布商品商品类型虚拟商品服务商品为什么服务商品要分类前端根据服务商品类型来设计不同的界面和交互订单状态和服务类型有关商品档案上下架运营商品上下架&#xff08;即商品营销上下架&#xff09;删除商品租户删除自供商品…

HH SaaS电商系统移动端商城,买家选择商品规格的交互设计

文章目录未完整选择商品规格时商品图如何显示库存如何显示价格如何显示选择规格提示文案如何显示原型图已选完整选择商品规格时商品图如何显示库存如何显示价格如何显示原型图SKU下架后如何显示原型图购买数量如何交互未完整选择商品规格时 商品图如何显示 显示SPU的主图&…

aws lambda_适用于无服务器Java开发人员的AWS Lambda:它为您提供了什么?

aws lambda无服务器计算如何帮助您的生产基础架构&#xff1f; 在过去的几年中&#xff0c;无服务器计算架构一直受到关注&#xff0c;因为它专注于应用程序的主要组件之一&#xff1a;服务器。 这种体系结构采用了不同的方法。 在下面的文章中&#xff0c;我们将解释无服务器…

HH SaaS电商系统的销售订单毛利润模块设计

HH SaaS电商系统的销售订单利润分析&#xff0c;仅是简单分析供运营人员参考而已&#xff0c;所以订单生成后就自动根据商品成本价和实际交易价生成利润表&#xff0c;而不需要等到订单归档后才生成。 销售子单的毛利润最终交易总额-成本总额销售子单的毛利率毛利润/最终交易总…

eclipse preference没有server_Java Web开发的前期准备工作,部署Tomcat服务器和Server环境创建...

Java Web: 顾名思义&#xff0c;就是用Java的方式来解决Web开发&#xff0c;我也不讲太多的理论问题&#xff0c;直接将如何上手来进行Java Web开发。那么&#xff0c;我们一般进行Java Web开发&#xff0c;可以使用的工具很多&#xff0c;我这里使用eclipse。选择eclipse的版本…

java int不将0忽略_Java微服务:蛋糕是骗人的,但您不能忽略它

java int不将0忽略构建微服务实际上意味着什么&#xff1f; 通过微服务框架的眼光回答 忽略微服务的趋势已变得不可能。 有些人会说这只是另一个难以忍受的流行语&#xff0c;而另一些人会背诵打破巨石的优势或采取逆势方法并关注负面因素。 在本文中&#xff0c;我们将全面了…

4怎么放大字体_Word字体怎么放大?简单教你几招轻松搞定

一般情况下我们都会选择用Word编辑文章。文章编辑完成之后我们通常会对文章进行排版。在排版的过程中如果我们需要将Word字体放大该怎么办呢&#xff1f;下面我就来教大家几个Word字体放大的小技巧&#xff0c;一起来看看吧。下面以放大“字体演示”为例为大家演示操作过程。一…

js splice坑_JavaScript的splice()方法在for循环中使用可能会遇到的坑!!!

在我们日常敲代码的时候&#xff0c;常常会用到splice()方法来删除数组中的元素(就是以截取的方式)&#xff0c;因为它会直接对数组进行修改。在使用splice之前&#xff0c;必备条件是&#xff0c;要先有一个数组。var arr new Array(1,2,3,4,5); // 初始化一个数组var delete…

wps如何将字体竖着排列_WPS文字中怎么竖着打字?wps文字竖排的设置方法介绍

wps中怎么样才能让文字竖着写啊&#xff1f;WPS现在的应用比较多&#xff0c;其实WPS文字和Word相差不过&#xff0c;都是一个办公软件&#xff0c;我们有时候在编辑的时候需要把文字竖排&#xff0c;那么&#xff0c;wps文字怎么竖排呢&#xff1f;接下来脚本之家小编就给大家…

HH SaaS电商系统的线上服务商品库存和采购设计

文章目录线上服务商品库存和采购整体思路线上服务商品的采购单状态线上服务商品的出库单状态商家完成服务线上服务商品库存和采购整体思路 线上服务商品直接在商品编辑页面编辑库存数量即可&#xff0c;服务端自动生成类型为“调整入库”的入库单和类型为“调整出库”的出库单…

arm linux gif 显示_100ASK_IMX6ULL arm板子如何显示图片、汉字、划线、背景色

最近在研究基于imx6ull开发板&#xff0c;想让开发板支持显示图片、字符串、背景色的功能。 操作的主要步骤如下&#xff1a;移植设备树和驱动移植libjpeg库编写测试程序一、移植设备树和驱动开发板原厂SDK已经移植了lcd对应的设备树和驱动。具体可以参考韦东山老师的文章https…

动态代码生成 静态代码生成_将速度提升到自己的个人代码生成器中

动态代码生成 静态代码生成Speedment是一个开源工具包 &#xff0c;可用于生成Java实体和管理器以与数据库进行通信。 如果您需要域模型的对象关系映射&#xff0c;那么这很好&#xff0c;但是在某些情况下&#xff0c;您可能希望使用数据库作为模板来生成完全不同的东西。 在本…

HH SaaS电商系统的库存调整单设计

为了更加灵活地变动商品的库存&#xff0c;以及其它原因导致系统库存数和实际库存数不一致&#xff0c;可以通过库存调整单进行校正。 简简单单设计&#xff0c;没有状态管理&#xff0c;不需要通过审核&#xff0c;直接变更库存数~ 原型设计 库存调整单列表 库存调整单详情…

mysql优化 运维_MySQL运维---MySQL优化

一、优化1、优化的角度2、优化的方向3、数据库优化思路4、MySQL优化介绍5、优化工具介绍二、操作系统优化1、top命令1)CPU2)内存3)slab分配器---Linux内存4)page cache5)swap分区修改成不使用swap分区&#xff1a;永久生效&#xff0c;修改配置文件&#xff1a;2、大页内存机制…

微基准测试 r_在您的构建过程中添加微基准测试

微基准测试 r介绍 作为一个行业&#xff0c;我们正在采用更高的透明度和更可预测的构建过程&#xff0c;以降低构建软件的风险。 持续交付的核心原则之一是通过反馈循环收集反馈。 在Dev9中 &#xff0c;我们采用了与CD原则一致的“ 先知道 ”原则&#xff0c;这意味着我们&…