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日

相关文章

  • win8下python3.4安装和环境配置图文教程

    在Windows 8操作系统下,我们可以使用以下步骤安装Python 3.4并配置环境。 1. 下载Python 3.4安装包 我们可以从Python官网下载Python 3.4的安装包。下载地址为:https://www.python.org/downloads/release/python-340/ 2. 安装Python 3.4 双击下载的Python…

    python 2023年5月15日
    00
  • 基于Python制作ASCII码转换器

    基于Python制作ASCII码转换器 本文将介绍如何使用Python编写一个简单的ASCII码转换器。该程序可以将字符转换成对应的ASCII码以及将ASCII码转换成对应的字符。 安装Python 在编写Python程序之前,需要先安装Python。可以在Python官网上下载安装包,根据操作系统选择对应的版本进行安装。 编写代码 接下来,我们将编写代码。…

    python 2023年5月20日
    00
  • 对Python _取log的几种方式小结

    对Python _取log的几种方式小结 在Python中,我们可以使用标准数学库中提供的log函数来计算数字的对数。下面是一些常见的通过log函数获取对数的方式: 1. math库中的log函数 Python内置的math库提供了一个log函数,可以计算自然对数。你可以通过以下语句在你的代码中调用: import math x = 10 log_x = m…

    python 2023年6月3日
    00
  • Python 正则表达式入门(初级篇)

    Python正则表达式入门(初级篇) 正则表达式是一种强大的文本处理工具,可以用于匹配、查找、替换和割字符串。Python提供了re模块来处理正则表达式。本文将为您详细讲解正则表达式的基础知识,包括正则表达式语法、re模块的常用方法和两个示例说明。 正表达式语法 在正则表达式中使用[]表示字符集,^表示取反,-表示围,+配一个或多个,*表示匹配零或多个字符,…

    python 2023年5月14日
    00
  • 浅析python 通⽤爬⾍和聚焦爬⾍

    浅析python 通用爬虫和聚焦爬虫 什么是爬虫 爬虫(Web Crawler),也叫网络爬虫、网络蜘蛛、网络机器人,是一种自动获取网络信息的程序。它能够自动地抓取网页并提取有用的数据。爬虫技术在数据挖掘、搜索引擎、电子商务、信息处理和云计算等领域得到广泛应用。 爬虫的两种方式 通用爬虫 通用爬虫(General Crawler)是一种广泛应用的抓取方式,它…

    python 2023年5月14日
    00
  • 详解Python打包分发工具setuptools

    详解Python打包分发工具setuptools 简介 setuptools 是 Python 中用来打包和分发代码的工具。它可以方便的管理依赖、安装、升级、卸载等操作。本文将详细介绍使用 setuptools 进行打包分发的完整攻略,包括安装、配置、打包、上传到 PyPI 等内容,并提供两个示例说明。 安装 使用 setuptools 需要先安装它。可以使…

    python 2023年6月3日
    00
  • python用函数创造字典的实例讲解

    下面是关于“Python用函数创建字典的实例讲解”的完整攻略,具体过程如下: 1. 了解字典数据结构 在Python中,字典是一种非常常见的数据结构,其结构类似于Java和其他编程语言中的“Map”或“字典”。字典是由键和值组成的集合,其中每个键都必须是唯一的。 2. 使用字典字面量创建字典 Python中创建字典最简单的方法是使用字典字面量。您可以使用大括…

    python 2023年5月13日
    00
  • Python多线程使用方法详细讲解

    Python多线程使用方法详细讲解 在 Python 中,多线程可以用于许多场景,比如爬虫、并行处理等。本文将详细讲解 Python 多线程的使用,包括线程创建、启动、停止、同步等方面。 线程创建 Python 中创建线程有两种方式:函数和类。我们先看函数方式的创建。 函数方式 在 Python 中,可以使用 threading 模块的 Thread() 方…

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