爬虫(五)

1. 前端JS相关

  • 三元运算
v1 = 条件 ? 值A : 值B;		# 如果条件成立v1=值A,不成立v1等于值Bres = 1 === 1 ? 99 : 88 			# res=99
  • 特殊的逻辑运算
v1 = 1===1 || 2===2			# Ture
v2 = 9 || 14   				# 9
v3 = 0 || 15   				# 15
v3 = 0 || 15 || "zhangfei"		# 15
  • 赋值和比较
v1 = 11 === (n=123)		# Flase
  • 案例:
v1 = 1 > ( n = 2) || 1 === 1 ? 9 :8		# 分析
n = 2
v1 = 9
var o = (null === (n = window.byted_acrawler) || void 0 === n ? void 0 : null === (a = n.sign) || void 0 === a ? void 0 : a.call(n, i)) || "";void 0 -> undifined
# 分析(window.byted_acrawler不为空、window.byted_acrawler.sign不为空)
var o = (null === (n = window.byted_acrawler) || void 0 === n ? void 0 : null === (a = n.sign) || void 0 === a ? void 0 : a.call(n, i)) || "";var o = window.byted_acrawler.sign.call(n,i) || ""var o = window.byted_acrawler.sign.call(n,i)
  • 执行函数
function sign(v1){// this在函数内部console.log(v1);
}
// 执行,函数内部this=window全局对象
sign(123)			# 123// 执行函数内部会把第一个参数赋值给 this=123
sign.call(123,456)			# 456
// n就会传递给call函数中this
// i当做参数传递
var o = window.byted_acrawler.sign.call(n,i)
var o = window.byted_acrawler.sign(i)
  • 扩展
# 之前的javascript不支持面向对象,通过将函数去伪造
function Person(name,age){this.name=name;this.age = age
}obj = new Person("张飞",123)
  • 函数的参数
function sign(){console.log(arguments)
}sign()        
sign(11,22,33)
sign(11,22,44,55)
虽然没定义参数,但是可以传入参数
  • 合并对象补充JS环境
v1 = { k1: 123 }
v2 = { k2:99, k3:888}Objects.assign(v1,v2)	# 将第二个字典全部更新到V1;和python字典update很像console.log(v1) 			# {k1: 123, k2:99, k3:888}

2.编译js代码

2.1 node.js编译代码

  • v1.js
function func(arg) {return arg + 'i666';
}
let data = func("老铁");
console.log(data)
  • node编译执行
    在这里插入图片描述
  • python执行执行本地命令:node v1.js
import os
import subprocess# 根据自己的操作系统去修改(相当于python的sys.path,加载安装的模块)
os.environ["NODE_PATH"] = "/usr/local/lib/node_modules/"  signature = subprocess.getoutput('node v1.js')

2.2 pyexecjs编译代码

准备环境:

  • node.js
  • pyexecjs模块
pip install pyexecjs

例如:

  • v2.js
function func(arg) {return arg + '666';
}
  • 执行js代码
import execjs
import osos.environ["NODE_PATH"] = "/usr/local/lib/node_modules/"
with open('v2.js', mode='r', encoding='utf-8') as f:js = f.read()JS = execjs.compile(js)sign = JS.call("func", "微信")
print(sign) # 微信666

node.js:电脑上安装上node.js之后(编译器,相当于装CPython解释器), 自动安装npm(第三方包管理器,相当于pip)

2.3 浏览器环境

有些JS的代码你从别的地拿过来执行的时候不成功,因为需要模拟浏览器环境

环境准备

  • node.js
  • jsdom(通过后端node+js代码实现伪造浏览器环境)
npm install node-gyp@latest sudo npm explore -g npm -- npm i node-gyp@latest
npm install jsdom -g   # -g全局安装

注意:上述安装成功后已可以模拟浏览器环境,由于今天的头条他的内容。

npm install canvas -g

方式一:v10.js

const jsdom = require("jsdom");
const {JSDOM} = jsdom;const resourceLoader = new jsdom.ResourceLoader({userAgent: "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.55 Safari/537.36",
});const html = `<!DOCTYPE html><p>Hello world</p>`;const dom = new JSDOM(html, {url: "https://www.toutiao.com",referrer: "https://example.com/",contentType: "text/html",resources: resourceLoader,
});console.log(dom.window.location)
console.log(dom.window.navigator.userAgent)
console.log(dom.window.document.referrer)

在这里插入图片描述

import os
import subprocess# 根据自己的操作系统去修改(相当于python的sys.path,加载安装的模块)
os.environ["NODE_PATH"] = "/usr/local/lib/node_modules/"  res = subprocess.getoutput('node v10.js')

方式二:无法补充环境时

const jsdom = require("jsdom");
const {JSDOM} = jsdom;const resourceLoader = new jsdom.ResourceLoader({userAgent: "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.55 Safari/537.36"
});const html = `<!DOCTYPE html><p>Hello world</p>`;
const dom = new JSDOM(html, {url: "https://www.toutiao.com",referrer: "https://example.com/",contentType: "text/html",resources: resourceLoader,
});/*
console.log(dom.window.location)
console.log(dom.window.navigator.userAgent)
console.log(dom.window.document.referrer)
*/window = global;const params = {location: {hash: "",host: "www.toutiao.com",hostname: "www.toutiao.com",href: "https://www.toutiao.com",origin: "https://www.toutiao.com",pathname: "/",port: "",protocol: "https:",search: "",},navigator: {appCodeName: "Mozilla",appName: "Netscape",appVersion: "5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/93.0.4577.82 Safari/537.36",cookieEnabled: true,deviceMemory: 8,doNotTrack: null,hardwareConcurrency: 4,language: "zh-CN",languages: ["zh-CN", "zh"],maxTouchPoints: 0,onLine: true,platform: "MacIntel",product: "Gecko",productSub: "20030107",userAgent: "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/93.0.4577.82 Safari/537.36",vendor: "Google Inc.",vendorSub: "",webdriver: false}
};Object.assign(global,params) 	# location、navigator设置成了全局变量# 在下面如果你使用location.href、navigator.appCodeName
我们在上面代码加入window = global这样window.location.href、window.appCodeName也能够获取到

注意:在nodejs中默认代码中会有一个global的关键字(全局变量)。

v1 = 123;  # 写了个全局变量,相当于global赋了个值
console.log(global);
global.v1 = 123
global.v2 = 123
global.navigator = {...
}
console.log(v1,v2);navigator.userAgent

3.头条

3.1 分析请求

在这里插入图片描述
直接发送获取到结果:

import requests
# 这后面的就是我们需要注意的签名_02B4Z6wo009010IJgRwAAIDDtGCIOlEVa8tCLYWAALV5CV7lvAp2MWxOhC9EGgecK8orbBZu.elV57IoxY70Cqa8TI2XW0z.U3dOc84bBFDE83277HsB4oykmNYgkYd-9NbV8enDst.RVEBu76
res = requests.get(url="https://www.toutiao.com/api/pc/list/feed?offset=0&channel_id=94349549395&max_behot_time=0&category=pc_profile_channel&disable_raw_data=true&aid=24&app_name=toutiao_web&_signature=_02B4Z6wo009010IJgRwAAIDDtGCIOlEVa8tCLYWAALV5CV7lvAp2MWxOhC9EGgecK8orbBZu.elV57IoxY70Cqa8TI2XW0z.U3dOc84bBFDE83277HsB4oykmNYgkYd-9NbV8enDst.RVEBu76",headers={"user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36 Edg/124.0.0.0"}
)print(res.text)

在这里插入图片描述

3.2 _signature(寻找签名因为具有失效性,假如操作体育可能就获取不到了)

在这里插入图片描述

(null === (n = window.byted_acrawler) || void 0 === n || null === (a = n.sign) || void 0 === a ? void 0 : a.call(n, o)) || ""

在这里插入图片描述
在这里插入图片描述

n=undefined;
o={url:"https://www.toutiao.com/api/pc/list/feed?offset=0&channel_id=94349549395&max_behot_time=0&category=pc_profile_channel&disable_raw_data=true&aid=24&app_name=toutiao_web"}
var o = window.byted_acrawler.sign.call(n,o);

再简化一下

o={url:"https://www.toutiao.com/api/pc/list/feed?offset=0&channel_id=94349549395&max_behot_time=0&category=pc_profile_channel&disable_raw_data=true&aid=24&app_name=toutiao_web"}
var o = window.byted_acrawler.sign(o);
  • 找到sign算法,看看他是内部实现(走不通)。
  • 应该有一个js,给全局变量中赋值,
  • 整体调用试试看,把JS粘贴过来,找到了这个JS加载完之后赋的值
    在这里插入图片描述

在这里插入图片描述

3.3 验证签名是否可用

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

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

相关文章

使用Migration升级数据库

使用Migration升级数据库 package com.tiger.room2;import android.content.Context;import androidx.annotation.NonNull; import androidx.room.Database; import androidx.room.Room; import androidx.room.RoomDatabase; import androidx.room.migration.Migration; impo…

嵌入式 Linux 学习

在学习嵌入式 Linux 之前&#xff0c;我们先来了解一下嵌入式 Linux 有哪些东西。 1. 嵌入式 Linux 的组成 嵌入式 Linux 系统&#xff0c;就相当于一套完整的 PC 软件系统。 无论你是 Linux 电脑还是 windows 电脑&#xff0c;它们在软件方面的组成都是类似的。 我们一开电…

2023护网蓝初面试

目录 一、渗透测试的流程 二、常见的漏洞 三、中间件漏洞 四、SQL注入原理、种类&#xff1f;防御&#xff1f;预编译原理&#xff0c;宽字节注入原理 预编译原理&#xff1a; 宽字节注入原理&#xff1a; 五、XSS的种类有哪些&#xff1f;区别&#xff1f;修复&#xf…

5G智能制造纺织工厂数字孪生可视化平台,推进纺织行业数字化转型

5G智能制造纺织工厂数字孪生可视化平台&#xff0c;推进纺织行业数字化转型。纺织工业作为传统制造业的重要组成部分&#xff0c;面临着转型升级的紧迫需求。随着5G技术的快速发展&#xff0c;智能制造成为纺织工业转型升级的重要方向。数字孪生可视化平台作为智能制造的核心技…

Android14之解决报错:No module named selinux(一百九十三)

简介&#xff1a; CSDN博客专家&#xff0c;专注Android/Linux系统&#xff0c;分享多mic语音方案、音视频、编解码等技术&#xff0c;与大家一起成长&#xff01; 优质专栏&#xff1a;Audio工程师进阶系列【原创干货持续更新中……】&#x1f680; 优质专栏&#xff1a;多媒…

三.pandas基础

目录 一&#xff1a;认识pandas 1.1 pandas的优势 1.2 下载安装 二&#xff1a;Series数据结构(一维) 2.1 创建Series 创建series对象(一维) ndarray创建Series对象 “显式索引”的方法定义索引标签 dict创建Series对象(通过字典创建) 标量创建Series对象 2.2 访问S…

基于Skywalking开发分布式监控(四)一个案例

上一篇我们简单介绍了基于SkyWalking自定义增强的基本架构&#xff0c;即通过把Trace数据导入数据加工模块进行加工&#xff0c;进行持久化&#xff0c;并赋能grafana展示。 现在我们给出一个例子&#xff0c;对于量化交易系统&#xff0c;市场交易订单提交&#xff0c;该订单…

k8s应用综合实例

k8s应用综合实例 目录 k8s应用综合实例 目录 原文链接 推荐文章 实验环境 实验软件 本节实战 预期 原理 高可用 稳定性 避免单点故障 使用 PDB 健康检查 服务质量 QoS QoS类型 资源回收策略 滚动更新 失败原因 零宕机 HPA 安全性 持久化 Ingress FAQ …

区块链和人工智能的关系以及经典案例

目录 1.区块链与人工智能的关系 2.应用案例&#xff1a;基于区块链的医疗数据共享平台 2.1背景 2.2方案 2.3优势 2.4挑战 区块链技术和人工智能&#xff08;AI&#xff09;是两种不同的技术&#xff0c;但它们之间存在着互补关系。区块链技术提供了一种安全、透明、去中心…

《JAVA与模式》之桥梁模式

系列文章目录 文章目录 系列文章目录前言一、桥梁模式的用意二、桥梁模式的结构三、使用场景四、不使用模式的解决方案五、实现发送加急消息前言 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站,这篇文章男女通用,看懂…

前端vite+vue3——可视化页面性能耗时指标(fmp、fp)

文章目录 ⭐前言&#x1f496;vue3系列文章 ⭐可视化fmp、fp指标&#x1f496; MutationObserver 计算 dom的变化&#x1f496; 使用条形图展示 fmp、fp时间 ⭐项目代码⭐结束 ⭐前言 大家好&#xff0c;我是yma16&#xff0c;本文分享关于 前端vitevue3——可视化页面性能耗时…

【解读】OWASP 大语言模型(LLM)安全测评基准V1.0

大语言模型&#xff08;LLM&#xff0c;Large Language Model&#xff09;是指参数量巨大、能够处理海量数据的模型, 此类模型通常具有大规模的参数&#xff0c;使得它们能够处理更复杂的问题&#xff0c;并学习更广泛的知识。自2022 年以来&#xff0c;LLM技术在得到了广泛的应…