python脚本爬取字体文件的实现方法

Python脚本爬取字体文件可以分为以下几个步骤:

  1. 获取字体文件的URL或者本地字体文件的路径
  2. 下载字体文件
  3. 解析字体文件中的映射表(map)信息
  4. 解析需要反爬的文本,并将对应的加密text和已知的明文text进行映射
  5. 替换被加密的文本为明文
  6. 可选:将替换后的文本保存为一个新的HTML页面或者PDF文件

下面是两个示例:

示例1:爬取腾讯视频网站的字体文件并解密被加密的文本

Step 1:打开网页并获取字体文件的URL

以腾讯视频网站为例,在Chrome浏览器中打开任意一个视频页面,右键单击页面中的非链接文本区域,选择“检查”,进入浏览器的开发者工具界面,切换到“Network”选项卡,在浏览器中选择任意一个视频,可以发现浏览器中发出了一个类似的请求:

https://puui.qpic.cn/vfont/yyxbDOwrrG1QcJLAdJ9gpw/241

这个请求中,包含了一个字体文件的URL路径,将该路径复制下来备用。

Step 2:下载字体文件并解析映射表

编写Python脚本,使用requests模块下载该字体文件,然后使用fontTools工具包解析出其中的映射表信息,如下所示:

from fontTools.ttLib import TTFont
import requests

font_url = "https://puui.qpic.cn/vfont/yyxbDOwrrG1QcJLAdJ9gpw/241"

# 首先下载字体文件到本地
response = requests.get(font_url)
with open("font.ttf", "wb") as f:
    f.write(response.content)

# 使用fontTools解析字体文件并获取映射表信息
font = TTFont("font.ttf")
glyf_order = font.getGlyphOrder()[2:]
map_table = font.getBestCmap()
uni_list = []
for i in range(2, len(glyf_order)):
    code_hex = glyf_order[i].replace("uni", "&#x") + ";"
    uni_list.append(chr(map_table[code_hex]))

Step 3:解密加密文本并替换

在腾讯视频网站上,文本中被加密的文本通常以类似“”的形式出现,将该字符替换为对应的明文即可解密被加密文本。

# 需要处理的加密文本
enc_text = "Ste osn"

# 映射加密字符与明文
enc_list = ["", "", "", "", ""]
dec_list = ["S", "t", "e", "a", "n"]
text_map = str.maketrans("".join(enc_list), "".join(dec_list))

# 替换加密文本为明文
dec_text = enc_text.translate(text_map)

示例2:爬取安居客二手房信息,并将结果保存为PDF文件

Step 1:获取网页中的字体文件和加密文本占位符

以安居客网站的二手房页面为例,使用Chrome浏览器打开该页面,在开发者工具中可以发现页面中所有的字体文件都是以Data URI形式内嵌在网页的CSS代码中的。

同时,页面中有很多被加密的数字文本,这些文本都使用了相同的字体文件。在开发者工具的“Elements”选项卡中选中其中的一段加密文本占位符,可以看到类似以下的CSS代码:

.wl-2{
        font-family: normal !important;
        font-weight: 400;
        font-style: normal;
        color: #64b4ff;
        position: relative;
        font-size: 18px;
        letter-spacing: 1px;
        line-height: 30px;
        display: inline-block;
 }
 .wl-2::after{
    content: '5';
        font-family:"Arial",serif !important;
        font-weight: 400;
        font-style: normal;
        font-size: 42px;
        position: absolute;
        top: -16px;
        left: 0px
 }
 .wl-2::before{
    content:'秒';
        font-family:"&sjb-22276cf7a8ad5beecc1d03f7f6c8a6c5",serif !important;
        font-weight: 400;
        font-style: normal;
        font-size: 16px;
        position: absolute;
        right: -22px;
        top: 0;
 }

其中,加密的数字文本是通过伪元素::before和::after进行绝对布局,并调用不同的字体文件进行显示。

可以观察到,字体文件的路径在伪元素::before的内容内容中,而加密的数字则在伪元素::after的content属性中。

Step 2:解析伪元素中的字体文件,并将加密数字替换为明文

利用BeautifulSoup库解析网页,并使用CSS选择器找到加密数字所在的伪元素。

然后,通过正则表达式从伪元素的content属性中截取出加密数字,并从字体文件中解析出对应的明文。

最后,将原文本中的加密数字替换为解密后的明文即可完成解密。

import re 
import requests
from bs4 import BeautifulSoup
from fontTools.ttLib import TTFont
from io import BytesIO
import pdfkit

def get_html(url):
    # 获取HTML代码
    headers = {
        "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110"
    }
    response = requests.get(url, headers=headers)
    html = response.text
    return html

def decrypt_text(html):
    # 解析字体文件
    font_urls = []
    bs = BeautifulSoup(html, "html.parser")
    css_urls = bs.select("link[rel='stylesheet']")
    for css in css_urls:
        css_url = css["href"]
        if "aosfont" in css_url:
            font_urls.append(css_url)

    font_map = {}
    for font_url in font_urls:
        response = requests.get(font_url)
        font_data = BytesIO(response.content)
        font = TTFont(font_data)
        cmap = font.getBestCmap()
        for k, v in cmap.items():
            if v.startswith("uni"):
                font_map[v] = chr(int(k))

    # 解密数字
    enc_nums = bs.select(".wl-2::after")
    for enc_num in enc_nums:
        enc_str = enc_num.text
        for k, v in font_map.items():
            enc_str = enc_str.replace(k, v)
        enc_num.string = enc_str

    return str(bs)

url = "https://sz.fang.anjuke.com/loupan/all/p1/"
html = get_html(url)
html = decrypt_text(html)

pdfkit.from_string(html, 'out.pdf')

运行上述脚本,会自动爬取安居客网站的第一页二手房信息并保存为PDF文件out.pdf。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:python脚本爬取字体文件的实现方法 - Python技术站

(0)
上一篇 2023年6月3日
下一篇 2023年6月3日

相关文章

  • 利用Python读取Excel表内容的详细过程

    下面是利用Python读取Excel表内容的详细过程。 1. 安装所需Python库 读取Excel表需要使用第三方库,比较常用的有pandas和xlrd。在开始之前,请先确保你已经安装了这两个库,如果没有请运行以下命令进行安装: pip install pandas pip install xlrd 2. 打开Excel表 要读取Excel表,首先需要打开…

    python 2023年5月13日
    00
  • python数据类型的详细分析(附示例代码)

    让我来介绍一下关于Python数据类型的详细分析和示例代码吧。 Python数据类型的分类 Python中主要有以下几种数据类型: 数字类型:包括整数、浮点数和复数 字符串类型:表示文本信息的数据类型 列表类型:有序可变的数据集合 元组类型:有序不可变的数据集合 集合类型:无序可变的数据集合 字典类型:包含键值对的数据集合 数字类型 Python中数字类型包…

    python 2023年5月14日
    00
  • 6个Python办公黑科技,助你提升工作效率

    以下是“6个Python办公黑科技,助你提升工作效率”的完整攻略。 概述 本文介绍了6个Python办公黑科技,它们分别是:批量重命名、批量压缩、批量转换格式、自动发送邮件、网页自动化、PDF文本提取。通过使用这些技巧,你可以提高在工作中的效率,减少很多重复性工作。 1. 批量重命名 批量重命名可以帮助你快速重命名文件夹中的多个文件。使用Python的os模…

    python 2023年5月18日
    00
  • Python for Informatics 第11章之正则表达式(二)

    以下是“PythonforInformatics第11章之正则表达式(二)”的完整攻略: 一、问题描述 在PythonforInformatics第11章中,我们学习了正则表达式的基础知识。本文将继续讲解正则表达式的高级用法,包括分组、贪婪匹配、非贪婪匹配等。 二、解决方案 2.1 分组 在正则表达式中,我们可以使用小括号来创建分组。分组可以将多个字符视为一…

    python 2023年5月14日
    00
  • Python探索之pLSA实现代码

    Python探索之pLSA实现代码攻略 1. 简介 pLSA (Probabilistic Latent Semantic Analysis) 是一种概率模型,用于对文档进行主题建模。本攻略将介绍如何实现pLSA算法,同时提供两个示例说明它的用途。 2. 实现 2.1 数据准备 首先,我们需要一些文本数据用于主题建模。这里我们采用经典的20个新闻组数据集。可…

    python 2023年6月3日
    00
  • pip报错“ImportError: cannot import name ‘main’ from ‘pip._internal’ (/usr/lib/python3/dist-packages/pip/_internal/init.py)”怎么处理?

    当使用 pip 安装 Python 包时,可能会遇到 “ImportError: cannot import name ‘main’ from ‘pip._internal’ (/usr/lib/python3/dist-packages/pip/_internal/init.py)” 错误。这个错误通常是由于 pip 安装过程中出现问题导致的。以下是详细讲…

    python 2023年5月4日
    00
  • 详解Python中类的定义与使用

    详解Python中类的定义与使用 在Python中,我们可以使用类来封装数据和方法,方便代码的维护和复用。本文将详细讲解Python中类的定义与使用方法。 定义类 在Python中,使用class关键字来定义一个类。类名通常使用大写字母开头,多个单词使用驼峰命名法。 class MyClass: pass 上面的代码定义了一个空的类MyClass。我们可以在…

    python 2023年6月5日
    00
  • Python通过future处理并发问题

    Python通过引入future模块来处理并发问题,它提供了一个基本的抽象来处理诸如并发、异步等情况。下面是使用future模块处理并发的完整攻略: 引入future模块 在Python 2中,future模块是一个第三方库,在Python 3中已经被包含在标准库中,因此在Python 3中无需额外安装。 import concurrent.futures …

    python 2023年5月13日
    00
合作推广
合作推广
分享本页
返回顶部