Python字体反爬实战案例分享

接下来我会详细讲解“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中的协程(Coroutine)操作模块(greenlet、gevent)

    Python中的协程(Coroutine)操作模块 什么是协程 协程是一种并发编程的方式,可以让函数在执行过程中暂停,并在需要的时候恢复执行。协程和线程不同,协程是一种用户态的轻量级线程,不需要操作系统进行上下文切换,所以可以进行更细粒度的调度。 greenlet模块 greenlet模块是一个允许嵌套使用的协程模块。它提供了一个Greenlet类,可以用于…

    python 2023年5月19日
    00
  • 玩转Win XP系统内置语音输入软件

    玩转Win XP系统内置语音输入软件攻略 Win XP系统内置了语音输入软件,可以帮助用户实现语音输入文字。下面我们来详细讲解如何玩转Win XP系统内置语音输入软件。 步骤一:打开语音输入软件 依次点击“开始”菜单 -> “所有程序” -> “附件” -> “辅助工具” -> “语音识别引擎”,即可打开语音输入软件。 步骤二:设置语…

    python 2023年6月5日
    00
  • 基于PyQt4和PySide实现输入对话框效果

    当我们需要在Python GUI应用程序中要求用户输入信息时,可以使用输入对话框(Input Dialog)。可以使用PyQt4或PySide库中的QInputDialog模块来创建输入对话框。以下是步骤: 导入所需模块 首先,需要导入PyQt4或PySide库的QtCore和QtGui模块。此外,还需要导入QInputDialog类。 import sys…

    python 2023年6月3日
    00
  • 已解决卸载pip重新安装的方法

    关于“已解决卸载pip重新安装的方法”的完整攻略,可以分为以下几个步骤: 卸载旧版本的pip 可以使用以下命令卸载旧版本的pip: python -m pip uninstall pip 如果你使用的是Linux或macOS操作系统,则需要在命令前加上sudo来获取管理员权限,如下所示: sudo python -m pip uninstall pip 下载…

    python 2023年5月14日
    00
  • 剖析Python的Tornado框架中session支持的实现代码

    要剖析Python的Tornado框架中session支持的实现代码,我们可以分为以下几个步骤: Step 1:了解Tornado框架的session支持 在Tornado框架中,session可以通过get_secure_cookie和set_secure_cookie函数来实现。其中,set_secure_cookie可以将session信息加密存储在c…

    python 2023年6月2日
    00
  • Python中paramiko模块的基础操作与排错问题

    简介paramiko是Python编程语言中的一个用于进行SSHv2协议操作的模块。通过paramiko模块,我们可以实现基于SSH协议的远程连接,包括文件传输、命令执行等操作。本文将详细讲解paramiko模块的基础操作以及可能出现的排错问题等。 安装paramiko模块使用pip指令来安装paramiko模块,命令如下: pip install para…

    python 2023年5月19日
    00
  • python实现最大优先队列

    让我们来详细讲解一下Python实现最大优先队列的完整攻略。 什么是最大优先队列? 在理解如何实现最大优先队列之前,我们首先需要了解什么是最大优先队列。 最大优先队列是一种支持两种基本操作的数据结构:将元素插入队列和删除队列中的最大元素。通常情况下,最大优先队列采用堆来实现。 实现最大优先队列的步骤 接下来,我们来讲解在Python中如何实现最大优先队列。 …

    python 2023年5月19日
    00
  • Python下opencv库的安装过程及问题汇总

    下面是详细讲解Python下OpenCV库的安装过程及问题汇总: 安装前准备 在安装OpenCV库之前,我们需要安装好Python及其对应的包管理器pip。如果你还没有安装Python,可以通过Python官网下载安装包进行安装。安装完成后,我们需要检查一下是否已经安装了pip。可以在终端或命令行执行以下命令: pip –version 如果显示pip版本…

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