Python字体反爬实战案例分享

yizhihongxing

接下来我会详细讲解“Python字体反爬实战案例分享”的攻略。

标题

前言

在网络爬虫中,常常遇到字体反爬的问题。对于这种反爬,我们可以使用 Python 中的 FontTools 库来解决。

步骤

以下是该案例的详细步骤:

  1. 首先,我们需要使用 requests 库来获取网页内容。代码示例如下:

```python
import requests

url = 'https://www.example.com'

headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3'}

response = requests.get(url, headers=headers)
```

  1. 接着,我们需要使用 bs4 库来解析网页内容。代码示例如下:

```python
from bs4 import BeautifulSoup

soup = BeautifulSoup(response.content, 'lxml')
```

  1. 获取字体文件链接并下载字体文件,并读取字体信息。代码示例如下:

```python
font_url = soup.select('style')[0].text.split('///')[1].split('\'')[0]

response_font = requests.get(font_url, headers=headers)

with open('font.ttf', 'wb') as f:
f.write(response_font.content)

from fontTools.ttLib import TTFont

font = TTFont('font.ttf')
uni_list = font.getGlyphOrder()[2:]
```

  1. 将网页内容中的标签中的字体转化为对应的文字。代码示例如下:

python
for uni in uni_list:
soup = soup.decode().replace('&#x'+uni[3:].lower()+';', font.getBestCmap()[int(uni[3:], 16)])

  1. 最后将处理后的网页内容保存为 html 文件。代码示例如下:

python
with open('index.html', 'w') as f:
f.write(soup)

示例

这里给出一个使用 FontTools 库对 "ganji.com" 中的字体反爬进行处理的示例。

代码示例

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

def translateFont(soup, glyph_map_url):
    glyph_pattern = re.compile(r'&#x([0-9a-f]{4,5});')
    font_re = re.compile(r"fonts-path: url\('(.*?)'\)")
    #获取字体映射的文件路径
    css_text = requests.get(glyph_map_url).text
    font_url = "https:" + font_re.findall(css_text)[0]
    #获取字体文件的二进制内容,并保存
    font_resp = requests.get(font_url)
    font = TTFont(BytesIO(font_resp.content))
    glyphs = font.getGlyphNames()
    cmap = font.getBestCmap()

    #仿照url保存到本地
    with open("downloaded.ttf", "wb") as f:
        f.write(font_resp.content)

    #替换html中的字体
    for (tag, attr, text) in soup.select("*"):
        try:
            if text and glyph_pattern.search(text):
                for match in glyph_pattern.findall(text):
                    cp = int(match, 16)  #转换为 ascii 码
                    name = cmap[cp]  #获取字体文件中字形的名字
                    if name in glyphs:
                        #利用 Hex Glyph 对象(font.getGlyph(name))的 ttGlyph.render() 生成 图像
                        im = Image.new("RGB", (200, 200), "white")
                        font.getGlyph(name).render(
                            im.load(),
                            tuple([int(i * 1.1) for i in im.size])
                        )
                        output = pytesseract.image_to_string(im)
                        #替换原来的 html 代码
                        text = text.replace(f"&#x{match};", output)
                        tag[attr] = text
        except:
            pass
    return soup

使用方法

if __name__ == "__main__":
    import pytesseract


    glyph_map_url = "https://static.ganji.cn/public/file/site/bing0907akgn/f5c859ecbf466fcf3c3a11bc1127aa8e.css"
    headers = {
        "User-Agent":"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/94.0.4606.71 Safari/537.36",
    }
    url = "https://bj.ganji.com/shuma/440_1/"

    r = requests.get(url, headers=headers)
    soup = BeautifulSoup(r.content, 'lxml')
    soup = translateFont(soup, glyph_map_url)
    with open("ganji.html", "wb") as f:
        f.write(soup.encode())

运行上面的代码,你将得到一份完全被反爬的代码。后执行python download.py将下载网站中的字体文件。最后运行python ganji.py执行字体反爬处理,保存反爬处理后的网页文件。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Python字体反爬实战案例分享 - Python技术站

(0)
上一篇 2023年5月14日
下一篇 2023年5月14日

相关文章

  • 通过代码实例展示Python中列表生成式的用法

    以下是详细讲解“通过代码实例展示Python中列表生成式的用法”的完整攻略: 什么是列表生成式? 列表生成式(List Comprehensions)是 Python 中非常实用的语法,能够用一行简单的语句实现对列表的构造、过滤等操作,简洁而易懂。 列表生成式的通用格式为: [expression for item in iterable if condit…

    python 2023年5月13日
    00
  • python中return的返回和执行实例

    Python中return的返回和执行实例 在Python中,return语句用于从函数中返回值。本文将详细讲解return语句的使用方法,包括返回值的类型、返回多个值、在循环中使用return等操作。 返回值的类型 以下是一个使用return语句返回值的示例: def add(a, b): return a + b result = add(1, 2) p…

    python 2023年5月15日
    00
  • python3 循环读取excel文件并写入json操作

    我来为您讲解一下“Python3循环读取Excel文件并写入JSON操作”的完整实例教程。 简介 在实际开发中,我们经常需要将Excel表格中的数据转换为JSON格式,以便于在Web开发中进行使用。本文就是介绍如何使用Python3语言循环读取Excel文件,并将其转换为JSON格式进行保存。 前置准备 在开始实现这个操作之前,我们需要先安装三个Python…

    python 2023年5月13日
    00
  • PyQt5每天必学之弹出消息框

    我来详细讲解一下“PyQt5每天必学之弹出消息框”的完整攻略。 弹出消息框 弹出消息框是GUI应用程序中一个常见的功能。在PyQt5中,我们可以使用QMessageBox类来实现弹出消息框的效果。QMessageBox提供了几种不同的消息框类型,包括信息框、警告框、错误框等。 下面是一个简单的示例,演示如何弹出一个信息框: from PyQt5.QtWidg…

    python 2023年5月20日
    00
  • Python爬虫如何提取百度搜索到的内容?案例教你

    搜索引擎用的很频繁,现在利用Python爬虫提取百度搜索内容,同时再进一步提取内容分析就可以简便搜索过程。详细案例如下: ​ 完整代码: # coding=utf8 import urllib2 import string import urllib import re import random #设置多个user_agents,防止百度限制IP user…

    爬虫 2023年4月16日
    00
  • 解决linux下使用python打开terminal时报错的问题

    如果在 Linux 系统下使用 Python 脚本打开命令终端时出现错误,主要有两个可能的原因。一个是因为没有正确地安装 Python 的依赖库或者没有正确设置环境变量,另一个可能原因是脚本本身存在错误。要解决这些问题,可以按照以下步骤操作。 安装依赖库和设置环境变量 安装Python库 如果使用 Python 时遇到缺少库的问题,可以使用 pip 命令来安…

    python 2023年5月13日
    00
  • Python实现周期性抓取网页内容的方法

    Python实现周期性抓取网页内容的方法 本文将介绍如何使用Python实现周期性抓取网页内容的方法。 实现步骤 安装相关库 首先,我们需要安装以下Python库: requests:用于发送HTTP请求 BeautifulSoup4:用于解析HTML内容 schedule:用于实现定时任务 可以使用以下命令进行安装: pip install request…

    python 2023年5月14日
    00
  • Python&Matlab实现樱花的绘制

    Python&Matlab实现樱花的绘制攻略 介绍 在这篇攻略中,我们将会介绍如何用 Python 和 Matlab 实现樱花的绘制。通过这个小项目,我们可以学习到绘图的基础知识和技巧,了解如何利用数学和计算机技术将美丽的事物呈现出来。 准备 在开始实现樱花的绘制之前,我们需要准备一些工具和素材。 工具 Python Python 是一种常用的编程语…

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