爬虫进阶-反爬破解7(逆向破解被加密数据:全方位了解字体渲染的全过程+字体文件的检查和数据查看+字体文件转换并实现网页内容还原+完美还原上百页的数据内容)

news2024/11/14 17:51:26

目录

一、全方位了解字体渲染的全过程

1.加载顺序

2.实践操作:浏览器中调试字体渲染

3.总结:

二、字体文件的检查和数据查看

1.字体文件的操作软件

2.映射关系的建立

3.实践操作:翻找样式和真实内容

4.总结:

三、字体文件转换并实现网页内容还原

1.字体文件的转换

2.替换网页内容

3.实践操作:字体映射的解密和爬取

四、完美还原上百页的数据内容

1.字体文件的转换

2.替换网页内容

3.实践操作:爬虫实战,还原数据内容

4.总结:


一、全方位了解字体渲染的全过程

1.加载顺序

(1)载入字体内容或文件

(2)@font-face定义

(3)css中进行字体引用

2.实践操作:浏览器中调试字体渲染

3.总结:

(1)字体渲染:网页看到的数据和调试工具中的数据不一致。

(2)字体内容可以是文件形式,或者是base64内容格式。

(3)将加密内容进行手动替换操作。

二、字体文件的检查和数据查看

1.字体文件的操作软件

windows平台:FontCreator

macOS平台:IconFronPreview

Linux平台:FontForge

2.映射关系的建立

查看字体文件的内容,找出数字样式和真实内容

查看网页内容,找出网页的数字样式和真实内容

3.实践操作:翻找样式和真实内容

4.总结:

(1)一定要找出真实内容和数字样式的对应关系,非必需百分百找出

(2)浏览器调试工具看到的不一定是对的,可能是默认字体渲染

三、字体文件转换并实现网页内容还原

1.字体文件的转换

(1)python安装fontTools库

(2)使用fontTools读取TTF格式字体文件

(3)将内容保存成xml格式

(4)从xml格式中读取映射关系

2.替换网页内容

(1)请求网页内容

(2)循环映射关系,批量替换掉网页内容中的加密字体

(3)解析替换数据后的网页数据内容

(4)请求并分析接口数据的内容

(5)将日志保存到文件

3.实践操作:字体映射的解密和爬取

# 麣龒龤龒&#x9f92
# 10400

import requests
from fontTools.ttLib import TTFont # pip install fontTools
from lxml import etree

fonturl = 'http://shanzhi.spbeen.com/static/fonts/szec.ttf'
fontresponse = requests.get(fonturl)
print(fontresponse)
with open('font.ttf','wb') as file:
    file.write(fontresponse.content)

font = TTFont("font.ttf")
# font.saveXML("font.xml")
result_dict = {}
for k,v in font['cmap'].getBestCmap().items():
    # hex()函数是将十进制转成16进制
    k = hex(k).replace('0x','&#x')+';'
    v = int(v[8:10])-1
    result_dict[k]=str(v)
print(result_dict)

url = 'http://shanzhi.spbeen.com/search/?word='
response = requests.get(url)
html = response.text
for k,v in result_dict.items():
    html = html.replace(k,v)
# print(html)

htmlobj = etree.HTML(html)
divcard = htmlobj.xpath('.//div[@class="content"]/div')
for dc in divcard:
    td = {}
    td['标题'] = dc.xpath('./div/h5/a/text()')
    td['薪资'] = dc.xpath('./div/h5/small/text()')
    print(td)

四、完美还原上百页的数据内容

1.字体文件的转换

2.替换网页内容

3.实践操作:爬虫实战,还原数据内容

import requests
from fontTools.ttLib import TTFont
from lxml import etree
from time import sleep

import logging

logging.basicConfig(level=logging.DEBUG,filename='debug.log',filename='a',format='%(asctime)s-%(levelname)s-[%(filename)s:%(lineno)d]-%(message)s')

font = TTFont("font.ttf")
result_dict = {}
for k,v in font['cmap'].getBestCmap().items():
    # hex()函数是将十进制转成16进制
    k = hex(k).replace('0x','&#x')+';'
    v = int(v[8:10])-1
    result_dict[k]=str(v)

def replace_html(html:str):
    for k,v in result_dict.items():
        html = html.replace(k,v)
    return html

url = 'http://shanzhi.spbeen.com/search/?word=%E5%B5%8C%E5%85%A5%E5%BC%8F&page={}&_=1631261605624'

for i in range(1,10000):
    turl = url.format(i)
    response = requests.get(turl)
    html = replace_html(reponse.text)
    htmlobj = etree.HTML(html)
    divcard = htmlobj.xpath('.//div[contains(@class, "animate__animated")]')
    total_num += len(divcard)
    print("当前页面是第{}页,总计有{}条数据,当前页数据如下:".format(i,len(divcard),total_num))
    for dc in divcard:
        td = {}
        td['标题'] = dc.xpath('./div/h5/a/text()')
        td['薪资'] = dc.xpath('./div/h5/small/text()')
        print('               ',td)
    if len(divcard) < 10:
        break
    else:
        pass
    sleep(0.1)
    

4.总结:

(1)提取出具体的原数据和对应数字,进行网页内容的替换

(2)注意原数据的完整格式,确保替换后的数据没有多余符号

(3)找数据接口和具体参数,循环请求接口拿数据

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

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

相关文章

【c++】简单了解运算符重载

引例 class Integer{ public:Integer(int num):_num(num){}int& getValue(){return _num;} private:int _num; };现在有两个Integer对象a,b。想让a和b相加得到的结果给对象c&#xff0c;现在可以肯定的是cab编译后肯定会报错 请注意这条信息no match for operator (oper…

Zookeeper、Kafka集群与Filebeat+Kafka+ELK架构、部署实例

Zookeeper、Kafka集群与FilebeatKafkaELK架构、部署实例 一、Zookeeper1.1、Zookeeper 定义1.2、Zookeeper 工作机制1.3、Zookeeper 特点1.4、Zookeeper 数据结构1.5、Zookeeper 应用场景1.5、Zookeeper 选举机制1.5.1、 第一次启动选举机制1.5.2、 非第一次启动选举机制 二、Z…

信息系统项目管理师教程 第四版【1-共24章整体脑图整理】

信息系统项目管理师教程 第四版 电子版链接 链接&#xff1a;https://pan.baidu.com/s/1cicvAH519G-j2IBjE69JCQhttps://link.zhihu.com/?targethttps%3A//pan.baidu.com/s/1cicvAH519G-j2IBjE69JCQ 提取码&#xff1a;1qaz 如果失效可以用下面这个&#xff0c; 链接&…

Java EE-servlet API 三种主要的类

上述的代码如下&#xff1a; import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.i…

MQ相关介绍

【1】MQ&#xff1a;MessageQueue&#xff0c;消息队列。 队列&#xff0c;是一种FIFO 先进先出的数据结构。消息由生产者发送到MQ进行排队&#xff0c;然后按原来的顺序交由消息的消费者进行处理。QQ和微信就是典型的MQ。 为什么要用MQ&#xff08;MQ的优点&#xff09;&#…

Seata学习

Seata Seata 是一款开源的分布式事务解决方案&#xff0c;致力于在微服务架构下提供高性能和简单易用的分布式事务服务。 官网地址&#xff1a;https://seata.io/zh-cn/index.html 为什么会产生分布式事务&#xff1f; 示例&#xff1a;用户下单后需要创建订单&#xff0c;同时…

关于动态内存管理中的常见练习题

文章目录 前言练习1&#xff1a;练习2&#xff1a;练习3&#xff1a;练习4&#xff1a; 前言 学习完C语言中的动态内存管理&#xff0c;大家开始利用动态内存管理来去开辟空间&#xff0c;经过一顿狂敲代码后&#xff0c;发现了问题&#xff0c;程序要么崩掉&#xff0c;要么运…

字符串的创建(直接赋值与new的区别)- 字符串常量池

文章目录 1.字符串 "hello" 与 new String("hello")的区别2.intern()的使用&#xff1b; 总结 本文开始 1.字符串 “hello” 与 new String(“hello”)的区别 字符串常量池&#xff1a;存储着创建的引用地址的引用 String s1 "hello"; String…

python 之 矩阵相关操作

文章目录 1. **创建矩阵**&#xff1a;2. **矩阵加法**&#xff1a;3. **矩阵乘法**&#xff1a;4. **矩阵转置**&#xff1a;5. **元素级操作**&#xff1a;6. **汇总统计**&#xff1a;7. **逻辑操作**&#xff1a; 理解你的需求&#xff0c;我将为每个功能写一个单独的代码块…

SPI学习笔记:DAC与ACD

一、SPI协议简介 SPI Serial Peripheral Interface&#xff0c;是串行外围设备接口&#xff0c;是一种高速&#xff0c;全双工&#xff0c;同步的通信总线。常规只占用四根线&#xff0c;节约了芯片管脚&#xff0c;PCB的布局省空间。现在越来越多的芯片集成了这种通信协议&a…

python【多线程、单线程、异步编程】三个版本--在爬虫中的应用

并发编程在爬虫中的应用 之前的课程&#xff0c;我们已经为大家介绍了 Python 中的多线程、多进程和异步编程&#xff0c;通过这三种手段&#xff0c;我们可以实现并发或并行编程&#xff0c;这一方面可以加速代码的执行&#xff0c;另一方面也可以带来更好的用户体验。爬虫程…

解读Stata输出的OLS回归结果

Stata是一个广泛用于统计分析和数据管理的软件,以下是一些Stata的基础命令: 输入数据:use + 数据文件路径 显示数据:browse 或 list 或 describe 选择数据:keep 或 drop 或 select 或 exclude 建立变量和赋值:generate 或 replace 汇总数据:summarize 或 tabulate 画图:…

自学SLAM(4)《第二讲:三维物体刚体运动》作业

前言 小编研究生的研究方向是视觉SLAM&#xff0c;目前在自学&#xff0c;本篇文章为初学高翔老师课的第二次作业。 文章目录 前言1.熟悉 Eigen 矩阵运算2.几何运算练习3.旋转的表达4.罗德里格斯公式的证明5.四元数运算性质的验证6.熟悉 C11 1.熟悉 Eigen 矩阵运算 设线性⽅程 …

cordens

1 coredns的用途 CoreDNS 是一个灵活可扩展的 DNS 服务器&#xff0c;可以作为 Kubernetes 集群 DNS&#xff0c;在Kubernetes1.12版本之后成为了默认的DNS服务。 与 Kubernetes 一样&#xff0c;CoreDNS 项目由 CNCF 托管。 coredns在K8S中的用途,主要是用作服务发现&#x…

企业知识库管理软件介绍,打造企业最强大脑!

企业知识经验既是企业稳定可控的基础&#xff0c;也是企业继续长足发展的基石&#xff0c;如何实现组织内外部知识沉淀&#xff0c;让知识在组织内外传播与应用&#xff0c;就成为我们广大企业负责人应该思考的问题了。 企业知识库管理 随着与人工智能技术的融合&#xff0c;知…

arcgis js api 4.x通过TileLayer类加载arcgis server10.2发布的切片服务跨域问题的解决办法

1.错误复现 2.解决办法 2.1去https://github.com/Esri/resource-proxy 网站下载代理配置文件&#xff0c;我下载的是最新的1.1.2版本&#xff0c;这里根据后台服务器配置情况不同有三种配置文件&#xff0c;此次我用到的是DotNet和Java. 2.2 DotNet配置 2.2.1 对proxy文件增加…

第 368 场 LeetCode 周赛题解

A 元素和最小的山形三元组 I 前后缀操作&#xff1a;求出前后缀上的最小值数组&#xff0c;然后枚举 j j j class Solution { public:int minimumSum(vector<int> &nums) {int n nums.size();vector<int> l(n), r(n);//l[i]min{nums[0],...,nums[i]}, r[i]mi…

AirPods Pro的降噪功能让你体验更好,那么如何打开这个功能

本文介绍了如何在AirPods Pro上使用降噪功能&#xff0c;如何关闭它&#xff0c;以及该功能的工作原理。 AirPods Pro和AirPods Max支持降噪。你的设备必须运行iOS 13.2或iPadOS 13.2或更高版本才能使用降噪。 如何在AirPods Pro上打开降噪功能 AirPods Pro凭借其噪音控制功…

leetCode 30.串联所有单词的子串

给定一个字符串 s 和一个字符串数组 words。 words 中所有字符串 长度相同。s 中的 串联子串 是指一个包含 words 中所有字符串以任意顺序排列连接起来的子串。 例如&#xff0c;如果 words ["ab","cd","ef"]&#xff0c; 那么 "abcdef&…

如何利用示波器解析I2C数据

前言 &#xff08;1&#xff09;如果有嵌入式企业需要招聘校园大使&#xff0c;湖南区域的日常实习&#xff0c;任何区域的暑假Linux驱动实习岗位&#xff0c;可C站直接私聊&#xff0c;或者邮件&#xff1a;zhangyixu02gmail.com&#xff0c;此消息至2025年1月1日前均有效 &am…