python爬虫破解字体加密案例详解


Posted in Python onMarch 02, 2021

本次案例以爬取起小点小说为例

案例目的:

通过爬取起小点小说月票榜的名称和月票数,介绍如何破解字体加密的反爬,将加密的数据转化成明文数据。

程序功能:

输入要爬取的页数,得到每一页对应的小说名称和月票数。

案例分析: 找到目标的url:

python爬虫破解字体加密案例详解

(右键检查)找到小说名称所在的位置:

python爬虫破解字体加密案例详解

通过名称所在的节点位置,找到小说名称的xpath语法:

python爬虫破解字体加密案例详解

(右键检查)找到月票数所在的位置:

python爬虫破解字体加密案例详解

由上图发现,检查月票数据的文本,得到一串加密数据。

我们通过xpathhelper进行调试发现,无法找到加密数据的语法。因此,需要通过正则表达式进行提取。

通过正则进行数据提取。

python爬虫破解字体加密案例详解

正则表达式如下:

python爬虫破解字体加密案例详解

得到的加密数据如下:

python爬虫破解字体加密案例详解

破解加密数据是本次案例的关键:

既然是加密数据,就会有加密数据所对应的加密规则的Font文件。
通过找到Font字体文件中数据加密文件的url,发送请求,获取响应,得到加密数据的woff文件。

注:我们需要的woff文件,名称与加密月票数前面的class属性相同。

python爬虫破解字体加密案例详解

如下图,下载woff文件:

找到16进制的数字对应的英文数字。

python爬虫破解字体加密案例详解

其次,我们需要通过第三方库TTFont将文件中的16进制数转换成10进制,将英文数字转换成阿拉伯数字。如下图:

python爬虫破解字体加密案例详解

解析出每个加密数据对应的对应的月票数的数字如下:

python爬虫破解字体加密案例详解

注意:

由于我们在上面通过正则表式获得的加密数据携带特殊符号

python爬虫破解字体加密案例详解

因此解析出月票数据中的数字之后,除了将特殊符号去除,还需把每个数字进行拼接,得到最后的票数。

最后,通过对比不同页的url,找到翻页的规律:

python爬虫破解字体加密案例详解
python爬虫破解字体加密案例详解
python爬虫破解字体加密案例详解

对比三个不同url发现,翻页的规律在于参数page

所以问题分析完毕,开始代码:

import requests
from lxml import etree
import re
from fontTools.ttLib import TTFont
import json

if __name__ == '__main__':
  # 输入爬取的页数、
  pages = int(input('请输入要爬取的页数:')) # eg:pages=1,2
  for i in range(pages): # i=0,(0,1)
    page = i+1  # 1,(1,2)
    # 确认目标的url
    url_ = f'https://www.qidian.com/rank/yuepiao?page={page}'
    # 构造请求头参数
    headers = {
      'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.150 Safari/537.36'
    }
    # 发送请求,获取响应
    response_ = requests.get(url_,headers=headers)
    # 响应类型为html问文本
    str_data = response_.text
    # 将html文本转换成python文件
    py_data = etree.HTML(str_data)
    # 提取文本中的目标数据
    title_list = py_data.xpath('//h4/a[@target="_blank"]/text() ')
    # 提取月票数,由于利用xpath语法无法提取,因此换用正则表达式,正则提取的目标为response_.text
    mon_list = re.findall('</style><span class=".*?">(.*?)</span></span>',str_data)
    print(mon_list)
    # 获取字体反爬woff文件对应的url,xpath配合正则使用
    fonturl_str = py_data.xpath('//p/span/style/text()')
    font_url = re.findall(r"format\('eot'\); src: url\('(.*?)'\) format\('woff'\)",str_data)[0]
    print(font_url)
    # 获得url之后,构造请求头获取响应
    headers_ = {
      'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.150 Safari/537.36',
      'Referer':'https://www.qidian.com/'
    }
    # 发送请求,获取响应
    font_response = requests.get(font_url,headers=headers_)
    # 文件类型未知,因此用使用content格式
    font_data = font_response.content
    # 保存到本地
    with open('加密font文件.woff','wb')as f:
      f.write(font_data)
    # 解析加密的font文件
    font_obj = TTFont('加密font文件.woff')
    # 将文件转成明文的xml文件
    font_obj.saveXML('加密font文件.xml')
    # 获取字体加密的关系映射表,将16进制转换成10进制
    cmap_list = font_obj.getBestCmap()
    print('字体加密关系映射表:',cmap_list)
    # 创建英文转英文的字典
    dict_e_a = {'one':'1','two':'2','three':'3','four':'4','five':'5','six':'6',
          'seven':'7','eight':'8','nine':'9','zero':'0'}
    # 将英文数据进行转换
    for i in cmap_list:
      for j in dict_e_a:
        if j == cmap_list[i]:
          cmap_list[i] = dict_e_a[j]
    print('转换为阿拉伯数字的映射表为:',cmap_list)
    # 去掉加密的月票数据列表中的符号
    new_mon_list = []
    for i in mon_list:
      list_ = re.findall(r'\d+',i)
      new_mon_list.append(list_)
    print('去掉符号之后的月票数据列表为:',new_mon_list)
    # 最终解析月票数据
    for i in new_mon_list:
      for j in enumerate(i):
        for k in cmap_list:
          if j[1] == str(k):
            i[j[0]] = cmap_list[k]
    print('解析之后的月票数据为:',new_mon_list)
    # 将月票数据进行拼接
    new_list = []
    for i in new_mon_list:
      j = ''.join(i)
      new_list.append(j)
    print('解析出的明文数据为:',new_list)
    # 将名称和对应的月票数据放进字典,并转换成json格式及进行保存
    for i in range(len(title_list)):
      dict_ = {}
      dict_[title_list[i]] = new_list[i]
      # 将字典转换成json格式
      json_data = json.dumps(dict_,ensure_ascii=False)+',\n'
      # 将数据保存到本地
      with open('翻页起小点月票榜数据爬取.json','a',encoding='utf-8')as f:
        f.write(json_data)

爬取了两页的数据,每一页包含20个数据

执行结果如下:

python爬虫破解字体加密案例详解

到此这篇关于python爬虫破解字体加密案例详解的文章就介绍到这了,更多相关python爬虫破解字体加密内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Python 相关文章推荐
python中常用的各种数据库操作模块和连接实例
May 29 Python
Python实现快速排序和插入排序算法及自定义排序的示例
Feb 16 Python
通过Pandas读取大文件的实例
Jun 07 Python
numpy使用fromstring创建矩阵的实例
Jun 15 Python
linux安装Python3.4.2的操作方法
Sep 28 Python
详解Django的model查询操作与查询性能优化
Oct 16 Python
Python动态导入模块和反射机制详解
Feb 18 Python
Python实现获取当前目录下文件名代码详解
Mar 10 Python
ansible-playbook实现自动部署KVM及安装python3的详细教程
May 11 Python
sklearn线性逻辑回归和非线性逻辑回归的实现
Jun 09 Python
关于Python字符编码与二进制不得不说的一些事
Oct 04 Python
Python游戏开发实例之graphics实现AI五子棋
Nov 01 Python
python包的导入方式总结
Mar 02 #Python
numpy实现RNN原理实现
Mar 02 #Python
解决tensorflow模型压缩的问题_踩坑无数,总算搞定
Mar 02 #Python
python Protobuf定义消息类型知识点讲解
Mar 02 #Python
Django项目在pycharm新建的步骤方法
Mar 02 #Python
基于注解实现 SpringBoot 接口防刷的方法
Mar 02 #Python
python Autopep8实现按PEP8风格自动排版Python代码
Mar 02 #Python
You might like
《OVERLORD》手游英文版即将上线 手机上也能扮演骨王
2020/04/09 日漫
一周学会PHP(视频)Http下载
2006/12/12 PHP
php中获得视频时间总长度的另一种方法
2011/09/15 PHP
php使用pclzip类实现文件压缩的方法(附pclzip类下载地址)
2016/04/30 PHP
PHP邮箱验证示例教程
2016/06/01 PHP
Yii2中cookie用法示例分析
2016/07/18 PHP
PHP类和对象相关系统函数与运算符小结
2016/09/28 PHP
centos7上编译安装php7以php-fpm方式连接apache
2018/11/08 PHP
使用swoole 定时器变更超时未支付订单状态的解决方案
2019/07/24 PHP
我也种棵OO树JXTree[js+css+xml]
2007/04/02 Javascript
浅谈javascript中的作用域
2012/04/07 Javascript
php 中序列化和json使用介绍
2013/07/08 Javascript
javascript向后台传送相同属性的参数即数组参数
2014/02/17 Javascript
JS+DIV+CSS排版布局实现美观的选项卡效果
2015/10/10 Javascript
Ext JS动态加载JavaScript创建窗体的方法
2016/06/23 Javascript
JS判断是否在微信浏览器打开的简单实例(推荐)
2016/08/24 Javascript
jquery仿苹果的时间/日期选择效果
2017/03/08 Javascript
jQuery插件HighCharts实现2D柱状图、折线图的组合多轴图效果示例【附demo源码下载】
2017/03/09 Javascript
JavaScript实现父子dom同时绑定两个点击事件,一个用捕获,一个用冒泡时执行顺序的方法
2017/03/30 Javascript
jQuery EasyUI tree增加搜索功能的实现方法
2017/04/27 jQuery
Vue.js实现价格计算器功能
2020/03/30 Javascript
jQuery实现的弹幕效果完整实例
2017/09/06 jQuery
ES7中利用Await减少回调嵌套的方法详解
2017/11/01 Javascript
使用socket.io实现简单聊天室案例
2018/01/02 Javascript
浅谈layui使用模板引擎动态渲染元素要注意的问题
2019/09/14 Javascript
Vue实现页面添加水印功能
2019/11/09 Javascript
如何搭建一个完整的Vue3.0+ts的项目步骤
2020/10/18 Javascript
栈和队列数据结构的基本概念及其相关的Python实现
2015/08/24 Python
python实现多进程按序号批量修改文件名的方法示例
2019/12/30 Python
Python嵌入C/C++进行开发详解
2020/06/09 Python
PUMA官方商城:世界领先的运动品牌之一
2016/11/16 全球购物
英国时尚服饰电商:Boohoo
2017/10/12 全球购物
Java里面Pass by value和Pass by Reference是什么意思
2016/05/02 面试题
艺术应用与设计个人的自我评价
2013/11/23 职场文书
张思德观后感
2015/06/09 职场文书
2016抗战胜利71周年红领巾广播稿
2015/12/18 职场文书