补环境——A股市场

补环境

吐环境
1.Proxy对象

Proxy对象由两个部分组成:target、handler

target:目标对象
handler:是一个对象,声明了代理target的指定行为,支持的拦截操作,一共13种:

  • get(target,propKey,receiver):拦截对象属性的读取。
    • target: 目标对象
    • propKey: 被获取的属性名。
    • receiver: Proxy 或者继承 Proxy 的对象
  • set(target,propKey,value,receiver):拦截对象属性的设置,返回一个布尔值(修改成功)。
    • target: 目标对象
    • propKey : 被获取的属性名。
    • value: 新属性值。
    • receiver: Proxy 或者继承 Proxy 的对象

一般的补环境的是通过运行程序后的undefined报错去一点一点分析,一点一点的去补一些环境.

所以我们使用 Proxy 对全局遍历window、document、navigator等常见环境检测点进行代理,拦截代理对象的读取、函数调用等操作,并通过控制台输出,这样的话我们就能够实现检测环境自吐的功能,后续我们再针对吐出来的环境统一的进行补环境,这样就会方便的多。

2.案例
var target = {
    name: 'XT',
    age: 21,
    aa: function () {
        console.log(111)
    }
};
//target是对象,handler是拦截操作

var p = new Proxy(target, {
    //获取对象
    get:function (target, propertyKey, receiver) {
        //target  目标对象name:'JACK',age:'18'
    //    propertyKey :被获取属性的名字
    //     receiver 代理的对象
        console.log(target)
        console.log(propertyKey)
        console.log(receiver)
        console.log(target, propertyKey, receiver)

    },
    // //设置对象
    // set: function (target,propertyKey,value,receiver) {
    // //    target  目标对象
    // //     propertyKey  设置的属性
    // //    value   设置的属性值
    // //     receiver 代理器对象
    //     console.log(target,propertyKey,value,receiver)
    // }
})

console.log(p.name);

// p.user = 'aa'

返回结果

在这里插入图片描述

案例2

在这段代码中,target 是被 Proxy 包装的原始对象,propertyKey 是被访问或设置的属性名,而 receiver 是最初被调用的对象,通常是代理对象本身。

在实际的浏览器环境中,例如 windowdocumentnavigator 等,这些参数的含义如下:

  1. target

    • targetProxy 构造函数的第一个参数,它是原始对象,即你想要对其进行代理的对象。在浏览器环境中,如果你创建了 windowdocumentnavigator 的代理,target 就会是这些全局对象之一。
  2. propertyKey

    • propertyKey 是被访问或设置的属性的名称。在浏览器环境中,如果你尝试访问 window.locationdocument.titlepropertyKey 将分别是 "location""title"
  3. receiver

    • receiver 是最初被调用的对象,通常是代理对象本身。在 getset 陷阱(trap)中,receiver 是最初被调用的对象,它可以是代理对象或继承代理对象的任何对象。

以下是一个实际的例子,展示了如何在浏览器环境中使用 Proxy 来代理 window 对象,并记录属性的访问:

// 原始的 window 对象
var target = window;

// 创建一个代理来拦截对 window 对象的访问
var p = new Proxy(target, {
    get: function (target, propertyKey, receiver) {
        console.log('访问属性:', propertyKey);
        // 返回原始属性值
        return Reflect.get(target, propertyKey, receiver);
    },
    set: function (target, propertyKey, value, receiver) {
        console.log('设置属性:', propertyKey, '值:', value);
        // 设置原始属性值
        return Reflect.set(target, propertyKey, value, receiver);
    }
});

// 通过代理访问和设置属性
console.log(p.location.href); // 访问属性: location
p.document.title = '新标题'; // 设置属性: title 值: 新标题

在这个例子中,当通过代理对象 p 访问 location.href 时,get 陷阱会被触发,并打印出 "访问属性: location"。然后,当通过 p 设置 document.title 时,set 陷阱会被触发,并打印出 "设置属性: title 值: 新标题"

请注意,直接对全局对象如 windowdocumentnavigator 使用 Proxy 可能会导致意外的副作用,因为这些对象通常由浏览器管理,并且它们的行为可能依赖于内部状态和上下文。在实际开发中,应谨慎使用 Proxy 来代理这些全局对象。

A股市场同花顺
确定需求:

这里我只爬取序号,代码,名称,现价,涨跌幅这几个字段。并实现翻页功能。

在这里插入图片描述

cookie反爬!!!

1.通过油猴脚本找到变化的cookie值

在这里插入图片描述

吐环境报错可能是因为之前的方法为空。

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

TypeError: n.attachEvent is not a function

在这里插入图片描述

通过打断点的方式,可以发现q的值是true,所以在浏览器环境中,它使用的是addEventListener方法,而不是attachEvent方法。

那么node环境中报错显示attachEvent undefined,说明q的值是False。这里我们验证一下
在这里插入图片描述

可以看到q确实是False。那么我们就直接补q,给q赋值

我们补充addEvenListener方法。

方法: set   对象: window   属性: addEventListener   属性类型: string   属性值类型: undefined
方法: set   对象: window   属性: addEventListener   属性类型: string   属性值类型: function
方法: get   对象: window   属性: document   属性类型: string   属性值类型: undefined
方法: get   对象: window   属性: addEventListener   属性类型: string   属性值类型: object

在这里插入图片描述

调用生成cookie值的方法时候,报错。这时,要把所有undefined的对象属性补齐。

补navigator

在这里插入图片描述

分析网页信息

在这里插入图片描述

在这里插入图片描述

确定S生成的位置

找到报错的问题点

在这里插入图片描述

在这里插入图片描述

再次尝试补document对象中的documentEelement属性,发现程序跑通了。

在这里插入图片描述

# 使用BeautifulSoup解析HTML内容
soup = BeautifulSoup(html_content, 'html.parser')

# 找到表格
table = soup.find('table', class_='m-table m-pager-table')

# 初始化一个列表来存储提取的数据
extracted_data = []

# 遍历表格中的所有行
for row in table.find_all('tr'):
    # 获取当前行的所有单元格
    cols = row.find_all('td')
    # 如果单元格的数量正确,提取数据
    if len(cols) == 5:
        # 提取序号,代码,名称和现价
        serial_number = cols[0].text.strip()
        code = cols[1].text.strip()
        name = cols[2].text.strip()
        current_price = cols[3].text.strip()
        # 将提取的数据添加到列表中
        extracted_data.append({
            '序号': serial_number,
            '代码': code,
            '名称': name,
            '现价': current_price
        })

在这里插入图片描述

结果

在这里插入图片描述

报错

加入翻页逻辑之后。有时候会出现这种报错,说明是被反爬了,之后会尝试解决一下

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【全开源】酒店订单管理系统源码(FastAdmin+ThinkPHP)

一款基于FastAdminThinkPHP开发的旨在为民宿、酒店、宾馆等提供房态、订单、财务、客史等数据化、信息化的智慧管理工具,实现一站式订房管理,帮助酒店、民宿、宾馆提升管理效率,降低管理成本,提升行业竞争力。 打造高效、便捷的酒…

为什么c语言不对0和NULL做严格的区分?

在开始前刚好我有一些资料,是我根据网友给的问题精心整理了一份「c语言的资料从专业入门到高级教程」, 点个关注在评论区回复“888”之后私信回复“888”,全部无偿共享给大家!!!这个答案很简单:c语言不区分…

ubuntu中idea创建spark项目步骤

1.前置条件 ubuntu中已经安装idea,jdk,scala,spark 2.打开idea,新建,选择Maven项目 3.在IDEA中,File-Setting-Plugin,下载Scala插件 4.File-project structure,导入插件 4.1在全局库中,选择导入刚才的sca…

HTML 页面布局

慢慢生活,慢慢变好 —— 24.5.28 页面布局 盒子: 页面中所有的元素(标签),都可以看做是一个盒子,由盒子将页面中的元素包含在一个矩形区域内,通过盒子的视角更方便的进行页面布局 盒子模型组成: 内容区域(content)、内边距区域(pa…

什么是知识中台?为什么企业需要知识中台?

如今市面上的企业数不胜数,企业的任何一个小细节都会产生很大的影响。近几年来一直很热门的知识中台备受企业关注。关于如何高效地管理、整合和运用知识,成为了每一家企业都在重点关注的问题。而知识中台,就是为了解决这一问题而诞生的一个全…

鸿蒙开发接口UI界面:【@ohos.router (页面路由)】

页面路由 说明开发前请熟悉鸿蒙开发指导文档:gitee.com/li-shizhen-skin/harmony-os/blob/master/README.md点击或者复制转到。 本模块首批接口从API version 8开始支持。后续版本的新增接口,采用上角标单独标记接口的起始版本。页面路由需要在页面渲染完…

如何在生产环境中以非 Root 用户启动 Kafka

目录 如何在生产环境中以非 Root 用户启动 Kafka1. 创建 Kafka 用户2. 设置目录权限3. 配置 systemd 服务文件4. 启动和启用 Kafka 服务5. 验证 Kafka 服务经验总结 为了在生产环境中以非 root 用户(如 kafka 用户)启动 Kafka,您需要确保 Ka…

Unity之如何使用Localization来实现文本+资源多语言

前言 使用Unity实现本地化(Localization)功能 在当今的游戏开发中,支持多语言已成为一项基本需求。Unity作为主流的游戏开发引擎,提供了强大的本地化工具,使开发者能够方便地为游戏添加多语言支持。本文将介绍如何在U…

Linux 防火墙 firewalld 常用命令

1 防火墙 - firewalld 1.1 开启防火墙 # 临时性开启,服务器重启后会恢复为原来的状态 systemctl start firewalld # 永久性开启(即开机启动),重启服务器后生效 systemctl enable firewalld1.2 关闭防火墙 # 临时性关闭&#xf…

Neural Filters:照片恢复

Ps菜单:滤镜/Neural Filters/恢复/照片恢复 Neural Filters/RESTORATION/Photo Restoration 照片恢复 Photo Restoration借助 AI 强大功能快速恢复旧照片,提高对比度、增强细节、消除划痕。将此滤镜与着色相结合以进一步增强效果。 “照片恢复”滤镜利用…

Vue3 之 动态组件和KeepAlive组件

一、动态组件 1、简介 ​ 在某些业务场景下,页面的某模块具有多个组件但在同一时间只显示一个,需要在多个组件之间进行频繁的切换,如:tab切换等场景。除了可以使用v-if、v-show根据不同条件显示不同组件之外,还可以通…

Sora,数据驱动的物理引擎

文生视频技术 Text-to-Video 近日,Open AI发布文生视频模型Sora,能够生成一分钟高保真视频。人们惊呼:“真实世界将不再存在。” Open AI自称Sora是“世界模拟器”,让“一句话生成视频”的AI技术向上突破了一大截,引…

AI早班车5.22

📢📢📢📣📣📣 哈喽!大家好,我是「奇点」,江湖人称 singularity。刚工作几年,想和大家一同进步🤝🤝 一位上进心十足的【Java ToB端大厂…

Linux:进程控制(二.详细讲解进程程序替换)

上次讲了:Linux:进程地址空间、进程控制(一.进程创建、进程终止、进程等待) 文章目录 1.进程程序替换1.1概念1.2原理1.3使用一个exec 系列函数execl()函数结论与细节 2.多进程时的程序替换3.其他几个exec系…

正点原子[第二期]Linux之ARM(MX6U)裸机篇学习笔记-24.3,4 SPI驱动实验-I.MX6U SPI 寄存器

前言: 本文是根据哔哩哔哩网站上“正点原子[第二期]Linux之ARM(MX6U)裸机篇”视频的学习笔记,在这里会记录下正点原子 I.MX6ULL 开发板的配套视频教程所作的实验和学习笔记内容。本文大量引用了正点原子教学视频和链接中的内容。…

Vue2基本创建项目

简单版项目初始化 新建一个vue2 官网文档:介绍 — Vue.js 先确保下载了vue的脚手架 npm install -g vue-cli npm install -g vue/cli --force vue -V 创建项目 vue create 自己起个名字 选择自己选择特性 选择: Babel:他可以将我们写…

基于模糊PID控制器的汽车电磁悬架控制系统simulink建模与仿真

目录 1.课题概述 2.系统仿真结果 3.核心程序与模型 4.系统原理简介 5.完整工程文件 1.课题概述 基于模糊PID控制器的汽车电磁悬架控制系统simulink建模与仿真。 2.系统仿真结果 上面的仿真结果是无控制器和LQG的对比,以及有控制器和LQG的对比仿真。 3.核心程…

UE5 UE4 快速定位节点位置

在材质面板中,找到之前写的一个节点,想要修改,但是当时写的比较多,想要快速定位到节点位置. 在面板下方的 Find Results面板中,输入所需节点,找结果后双击,就定位到该节点处。 同理,…

从0开始学会做标书:新手学习做标书制作必修(95节课)

入门框架 电子标书 商务标书 文档排版 技术标书 实操演示 你是否也有同样的问题 1、做标书公司没人教、没人带? 2、如何看懂招标文件? 3、小白零基础能不能学习做标书? 4、商务标、技术标如何得高分? 5、做标书需要什么软件? 6、如何制作电子标书? 7、如何避…

AI菜鸟向前飞 — LangChain系列之十五 - Agent系列:从现象看机制(中篇)一个Agent的“旅行”

Agent基本架构 先谈谈Agent基本架构概念,如果看得云里雾里,等看完本篇之后,再回头看就会豁然开朗的,而我尽量写得更易懂: ) 这里面会穿插着上一篇的内容,请大家记得往回翻翻,传送门&…