应对字体反爬,通过python爬取小说排行榜

本文介绍如何改进Python爬虫,避免手动添加字体转换规则,通过fontTools库解析字体,建立数字与编码的对应关系,实现自动化爬取小说排行榜。利用lxml解析XML并进行16进制到10进制的转换,从而完成字体反爬的应对策略。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

需求分析

这个需求我昨天已经做过一次了爬取小说排行榜,昨天我采用的方式是手动建立一个转换规则,然后通过这个规则,将所有的看不懂的字体编码替换为正常的文字内容。功能上是满足了,但是需要有一步手动添加转换规则,而且每次运行程序都需要重新来一次,当然这是不能让人满意的

其中,在昨天的文章中,有一个小伙伴就指出了这一点,他说,既然已经做了爬虫程序了,就不应该再让别人手动添加规则了,问我能不能想想办法改进一下,变成直接运行程序就可以使用的

说句实话,这不太容易,毕竟字体是对方网站自己编辑的,如果不去手动添加规则的话,我们根本就没有办法知道他编辑的这个字体对应的是哪个字,也许有小伙伴会提议说,可不可以通过文字识别技术来做到这一点呢?是一个办法,但是不太容易实现,不过好在,这次我们的运气不错,找到了一个更容易的方法,这个方法不是每次都好用,但是恰好这次能用,那就先用着呗,下面来看看我们的新方法是什么

实现分析

具体的页面以及css的字体反爬是什么样的,在昨天的文章中我已经写的很详细了,今天我并不打算再重复一次。如果有没看过昨天文章的小伙伴,可以先看昨天的文章。那么就直接进入正题

昨天的最大问题在于,我们需要手动建立字体编码到对应文字之间的关系,事实上这一步确实也是有必要的,但是现在我们需要找到一个能够让机器找出这个规则的办法

首先呢,我们下载一个能够解析字体的第三方库fontTools,然后通过这个库,将woff的字体解析成xml的格式

from fontTools.ttLib import TTFont

font = TTFont("tmp.woff")
font.saveXML("tmp.xml")

然后我们去查看这个字体的map规则,发现运气很不错,字体的名字命名很规范,不是看不懂的文字,如下所示

### 使用Python实现网络小说爬虫 要使用Python实现一个网络小说爬虫,可以按照以下方式构建程序逻辑。以下是详细的说明: #### 1. 准备工作 在开始之前,需要安装必要的库工具,例如`requests`和`BeautifulSoup`。这些库可以帮助我们发送HTTP请求并解析HTML文档。 ```bash pip install requests beautifulsoup4 ``` #### 2. 发送HTTP请求 通过`requests`库向目标网站发送GET请求以获取网页内容。需要注意的是,某些网站可能有机制,因此可以通过设置User-Agent头来伪装成浏览器访问[^1]。 ```python import requests headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36' } url = "https://example.com/novel/chapter" response = requests.get(url, headers=headers) if response.status_code == 200: html_content = response.text else: print(f"Failed to retrieve the page. Status code: {response.status_code}") ``` #### 3. 解析HTML页面 利用`BeautifulSoup`库解析返回的HTML内容,并从中提取所需的小说章节标题和正文内容[^3]。 ```python from bs4 import BeautifulSoup soup = BeautifulSoup(html_content, 'html.parser') title_tag = soup.find('h1') # 假设标题位于<h1>标签中 content_tags = soup.find_all('p') # 假设正文字体位于<p>标签中 novel_title = title_tag.text.strip() if title_tag else "Unknown Title" chapter_text = "\n".join([tag.text.strip() for tag in content_tags]) print(novel_title) print(chapter_text[:200]) # 打印前200字符作为示例 ``` #### 4. 数据存储 将抓取的内容保存至本地文件以便后续离线阅读。 ```python output_file = f"{novel_title}.txt" with open(output_file, 'w', encoding='utf-8') as file: file.write(novel_title + '\n\n') file.write(chapter_text) print(f"The novel has been saved to '{output_file}'.") ``` #### 5. 处理多页或多章情况 如果小说分布在多个页面或者章节链接列表中,则需要遍历所有链接逐一抓取每一页的内容[^4]。 ```python base_url = "https://example.com/novel/" chapters = ["chapter1", "chapter2", "chapter3"] # 替换为实际章节URL部分 for chapter in chapters: full_url = base_url + chapter response = requests.get(full_url, headers=headers) if response.status_code != 200: continue soup = BeautifulSoup(response.text, 'html.parser') title = soup.find('h1').text.strip() text = "\n".join([p.text.strip() for p in soup.find_all('p')]) with open(f"{title}.txt", 'w', encoding='utf-8') as file: file.write(title + '\n\n' + text) ``` 以上代码片段展示了如何逐步完成从单个页面到整个系列小说的数据采集过程。 ---
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值