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

news/2024/7/19 9:00:23 标签: 爬虫

目录

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

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.niftyadmin.cn/n/5113163.html

相关文章

牛客网刷题-(1)

&#x1f308;write in front&#x1f308; &#x1f9f8;大家好&#xff0c;我是Aileen&#x1f9f8;.希望你看完之后&#xff0c;能对你有所帮助&#xff0c;不足请指正&#xff01;共同学习交流. &#x1f194;本文由Aileen_0v0&#x1f9f8; 原创 CSDN首发&#x1f412; 如…

App分发的策略和注意事项

当今的数字化时代中&#xff0c;移动应用程序已经成为了人们生活中不可或缺的一部分。随着智能手机的普及和移动互联网的快速发展&#xff0c;应用程序的分发方式也变得越来越多样化。 App分发是指将移动应用程序通过特定的渠道传递给终端用户的过程。在应用程序开发完成后&am…

基于ssm流浪动物领养救助系统

摘要 基于SSM&#xff08;Spring SpringMVC MyBatis&#xff09;的流浪动物领养救助系统是一个用于管理和帮助流浪动物领养、救助的信息化平台。该系统旨在提供一种便捷、高效的方式&#xff0c;以协调和改善流浪动物的生活&#xff0c;并促进社会各界的参与和支持。以下是该…

Kafka简单入门01

目录 Kafka的核心组件 Kafka的分区有序 Kafka的多副本机制 Kafka的安装部署 Kafka的基本操作 Apache Kafka 是一个高吞吐量的分布式流数据平台&#xff0c;通常用于构建实时数据流处理应用程序。 Kafka的核心组件 主题&#xff08;Topic&#xff09;&#xff1a;主题是 K…

ubuntu 设置和取消代理

背景 因为国内环境限制&#xff0c;在 linux 上安装一些软件的时候&#xff0c;因为限制就安装不了&#xff0c; 此时就可以通过设置代理的方式来规避这种问题&#xff0c;下面是具体的设置方式 步骤 sudo vim /etc/profile.d/proxy.sh添加以下内容到文件中 export http_pro…

Mac安装nginx(Homebrew)

查看需要安装 nginx 的信息 brew info nginxDocroot 默认为 /usr/local/var/www 在 /opt/homebrew/etc/nginx/nginx.conf 配置文件中默认端口被配置为8080&#xff0c;从而使 nginx 运行时不需要加 sudo nginx将在 /opt/homebrew//etc/nginx/servers/ 目录中加载所有文件 …

软件测试(六)自动化测试 Junit5

Junit5 selenium是自动化测试框架&#xff08;写自动化测试用例&#xff09;Junit单元测试框架&#xff08;管理写好的测试用例&#xff09; 注解&#xff1a;Test&#xff0c;Disable &#xff0c;BeforeAll&#xff0c;AfterAll&#xff0c;BeforeEach&#xff0c;AfteEach…

Mybatis-Plus 0基础光速入门代码

目录 1.创建springboot项目 2.引入依赖 3.找到application.properties&#xff0c;把后缀改成yml&#xff08;这种格式的文件有更多优点&#xff09;&#xff0c;在application.yml里面加上下面的配置代码 4.写实体类 5.创建接口继承BaseMapper 6.在启动类中加上注解Mappe…