千家信息网

python起点网月票榜字体反爬的方法是什么

发表于:2026-11-03 作者:千家信息网编辑
千家信息网最后更新 2026年11月03日,本篇内容主要讲解"python起点网月票榜字体反爬的方法是什么",感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习"python起点网月票榜字体反爬的方法是什么"
千家信息网最后更新 2026年11月03日python起点网月票榜字体反爬的方法是什么

本篇内容主要讲解"python起点网月票榜字体反爬的方法是什么",感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习"python起点网月票榜字体反爬的方法是什么"吧!

1.解析过程

老规矩哈我们先进入起点月票榜f12调试,找到书名与其对应的月票数据所在,使用xpath尝试提取

可以看到刚刚好20条数据,接下来找月票数据:

这是什么鬼xpath检索出来20条数据但是数据为空,element中数据显示为未知符号,这貌似没有数据呀,这时我们观察源代码,搜索关键字font-face可以看到这种看不懂的编码,这就是前言中所说的字体的编码。

我们接下来找字体文件数据包

woff文件并且请求地址与这上面看到的地址一样,不过这里需要注意的是每次请求地址都不一样,文件名字也不一样,所以我们需要每爬取一次都要单独爬取一次字体加密数据,字体加密数据可以使用第三方库fonttools进行解析

我们现在拥有:

1.书名

2.月票数据的密文

3.月票数据密文对应的字体文件

2.开始敲代码

首先定义获取书名的函数get_book_name并进行测试:

import requestsfrom lxml import etree  def get_book_name(xml_obj):    name_list = xml_obj.xpath("//div[@class='book-mid-info']/h5/a/text()")    return name_list  if __name__ == '__main__':    # 设置我们通用的请求头,避免被反爬拦截    headers_ = {        'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.45 Safari/537.36',        'referer': 'https://www.qidian.com/rank/',        'cookie': 'e1=%7B%22pid%22%3A%22qd_P_rank_19%22%2C%22eid%22%3A%22%22%2C%22l1%22%3A5%7D; e2=%7B%22pid%22%3A%22qd_P_rank_19%22%2C%22eid%22%3A%22%22%2C%22l1%22%3A5%7D; _yep_uuid=6a2ad124-678f-04d3-7195-2e4e9f5c470e; _gid=GA1.2.501012674.1638335311; newstatisticUUID=1638335311_1217304635; _csrfToken=adBfL5dzru0KuzVgLJpxtsE8zQcfgZT8MzKf0aMs; e2=; e1=%7B%22pid%22%3A%22qd_p_qidian%22%2C%22eid%22%3A%22qd_A16%22%2C%22l1%22%3A3%7D; _ga_FZMMH98S83=GS1.1.1638362844.2.1.1638362855.0; _ga_PFYW0QLV3P=GS1.1.1638362844.2.1.1638362855.0; _ga=GA1.2.2025243050.1638335311; _gat_gtag_UA_199934072_2=1'    }    url_ = 'https://www.qidian.com/rank/yuepiao/'    # 请求网页源代码    str_data = requests.get(url_, headers=headers_).text    # 使用xpath解析书名    xml_obj = etree.HTML(str_data)    print(get_book_name(xml_obj))   # ['从红月开始', '人族镇守使', '全属性武道', '深空彼岸', '我的云养女友', '我用闲书成圣人', '明克街13号', '星门', '东晋北府一丘八', '夜的命名术', '这个人仙太过正经', '顶级气运,悄悄修炼千年', '不科学御兽', '我的治愈系游戏', '这游戏也太真实了', '长夜余火', '赤心巡天', '轮回乐园', '合道', '宇宙职业选手']

2.请求月票数据密文,并进行测试:

import re import requestsfrom lxml import etree # 获取书名def get_book_name(xml_obj):    name_list = xml_obj.xpath("//div[@class='book-mid-info']/h5/a/text()")    return name_list # 获取月票加密数据def get_yuepiao(str_data):    # 这里我们之前分析发现xpath取出来的数据是空值,我们直接对网页源代码使用re正则匹配获取加密数据    yuepiao_list=re.findall(r'''(.*?)''',str_data)    return yuepiao_list if __name__ == '__main__':    # 设置我们通用的请求头,避免被反爬拦截    headers_ = {        'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.45 Safari/537.36',        'referer': 'https://www.qidian.com/rank/',        'cookie': 'e1=%7B%22pid%22%3A%22qd_P_rank_19%22%2C%22eid%22%3A%22%22%2C%22l1%22%3A5%7D; e2=%7B%22pid%22%3A%22qd_P_rank_19%22%2C%22eid%22%3A%22%22%2C%22l1%22%3A5%7D; _yep_uuid=6a2ad124-678f-04d3-7195-2e4e9f5c470e; _gid=GA1.2.501012674.1638335311; newstatisticUUID=1638335311_1217304635; _csrfToken=adBfL5dzru0KuzVgLJpxtsE8zQcfgZT8MzKf0aMs; e2=; e1=%7B%22pid%22%3A%22qd_p_qidian%22%2C%22eid%22%3A%22qd_A16%22%2C%22l1%22%3A3%7D; _ga_FZMMH98S83=GS1.1.1638362844.2.1.1638362855.0; _ga_PFYW0QLV3P=GS1.1.1638362844.2.1.1638362855.0; _ga=GA1.2.2025243050.1638335311; _gat_gtag_UA_199934072_2=1'    }    url_ = 'https://www.qidian.com/rank/yuepiao/'    # 请求网页源代码    str_data = requests.get(url_, headers=headers_).text    # 使用xpath解析书名    xml_obj = etree.HTML(str_data)    print(get_book_name(xml_obj))   # ['从红月开始', '人族镇守使', '全属性武道', '深空彼岸', '我的云养女友', '我用闲书成圣人', '明克街13号', '星门', '东晋北府一丘八', '夜的命名术', '这个人仙太过正经', '顶级气运,悄悄修炼千年', '不科学御兽', '我的治愈系游戏', '这游戏也太真实了', '长夜余火', '赤心巡天', '轮回乐园', '合道', '宇宙职业选手']    print(get_yuepiao(str_data))    # ['𘢒𘢒𘢐𘢉𘢎', '𘢌𘢋𘢐𘢐', '𘢌𘢏𘢌𘢑', '𘢑𘢉𘢒𘢎', '𘢑𘢎𘢋𘢔', '𘢑𘢏𘢏𘢉', '𘢎𘢑𘢐𘢉', '𘢎𘢏𘢑𘢔', '𘢎𘢒𘢉𘢏', '𘢏𘢎𘢏𘢎', '𘢔𘢑𘢑𘢔', '𘢔𘢎𘢐𘢓', '𘢔𘢔𘢑𘢐', '𘢔𘢒𘢑𘢏', '𘢔𘢐𘢒𘢐', '𘢒𘢌𘢉𘢌', '𘢒𘢑𘢌𘢓', '𘢒𘢑𘢎𘢓', '𘢒𘢎𘢓𘢉', '𘢒𘢎𘢏𘢐']

3.获取字体加密文件里的对应关系:

安装fonttools库

由于第一次使用fonttools库,在使用时遇到了以下错误 查询百度得知可能是由于字体文件名字有误,把名称换成url上面带的就成功的提取出来键值对了

(也可能是我使用re正则提取font_url时候不规范造成url错误)

只是这个键值对怎么编码对应英文,程序员为何为难程序员呢,不说了我们要定义一个英语与阿拉伯数字对应的字典进行对英文的替换

def get_font(xml_obj, headers_):    # 使用xpath与re获取字体加密数据包地址    font_div = xml_obj.xpath("//span/style/text()")[0]    font_url = re.findall("eot.*?(https:.*?.woff)", font_div)[0]    font_name = str(font_url).rsplit('/', 1)[1]    # 获取font文件进行本地保存    font_data = requests.get(font_url, headers_).content    with open(f'{font_name}', 'wb') as f:        f.write(font_data)    # 加载字体文件    font_data = TTFont(f'{font_name}')    # font_data.saveXML('字体.xml')    font_doct01 = font_data.getBestCmap()    font_doct02 = {        'period': '.',        'zero': '0',        'one': '1',        'two': '2',        'three': '3',        'four': '4',        'five': '5',        'six': '6',        'seven': '7',        'eight': '8',        'nine': '9'     }    for i in font_doct01:        font_doct01[i]=font_doct02[font_doct01[i]]    return font_doct01

程序完美运行:

总代码如下:

import re import requestsfrom lxml import etreefrom fontTools.ttLib import TTFont  # 获取书名def get_book_name(xml_obj):    name_list = xml_obj.xpath("//div[@class='book-mid-info']/h5/a/text()")    return name_list  # 获取月票加密数据def get_yuepiao(str_data):    # 这里我们之前分析发现xpath取出来的数据是空值,我们直接对网页源代码使用re正则匹配获取加密数据    yuepiao_list = re.findall(r'''(.*?)''', str_data)    return yuepiao_list  def get_font(xml_obj, headers_):    # 使用xpath与re获取字体加密数据包地址    font_div = xml_obj.xpath("//span/style/text()")[0]    font_url = re.findall("eot.*?(https:.*?.woff)", font_div)[0]    font_name = str(font_url).rsplit('/', 1)[1]    # 获取font文件进行本地保存    font_data = requests.get(font_url, headers_).content    with open(f'{font_name}', 'wb') as f:        f.write(font_data)    # 加载字体文件    font_data = TTFont(f'{font_name}')    # font_data.saveXML('字体.xml')    font_doct01 = font_data.getBestCmap()    font_doct02 = {        'period': '.',        'zero': '0',        'one': '1',        'two': '2',        'three': '3',        'four': '4',        'five': '5',        'six': '6',        'seven': '7',        'eight': '8',        'nine': '9'     }    for i in font_doct01:        font_doct01[i] = font_doct02[font_doct01[i]]    return font_doct01  def jiemi(miwen_list, font_list):    yuepiao = []    for i in miwen_list:        num = ''        mw_list=re.findall('&#(.*?);', i)         for j in mw_list:            num += font_list[int(j)]        yuepiao.append(int(num))    return yuepiao  if __name__ == '__main__':    # 设置我们通用的请求头,避免被反爬拦截    headers_ = {        'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.45 Safari/537.36',        'referer': 'https://www.qidian.com/rank/',        'cookie': 'e1=%7B%22pid%22%3A%22qd_P_rank_19%22%2C%22eid%22%3A%22%22%2C%22l1%22%3A5%7D; e2=%7B%22pid%22%3A%22qd_P_rank_19%22%2C%22eid%22%3A%22%22%2C%22l1%22%3A5%7D; _yep_uuid=6a2ad124-678f-04d3-7195-2e4e9f5c470e; _gid=GA1.2.501012674.1638335311; newstatisticUUID=1638335311_1217304635; _csrfToken=adBfL5dzru0KuzVgLJpxtsE8zQcfgZT8MzKf0aMs; e2=; e1=%7B%22pid%22%3A%22qd_p_qidian%22%2C%22eid%22%3A%22qd_A16%22%2C%22l1%22%3A3%7D; _ga_FZMMH98S83=GS1.1.1638362844.2.1.1638362855.0; _ga_PFYW0QLV3P=GS1.1.1638362844.2.1.1638362855.0; _ga=GA1.2.2025243050.1638335311; _gat_gtag_UA_199934072_2=1'    }    url_ = 'https://www.qidian.com/rank/yuepiao/'    # 请求网页源代码    str_data = requests.get(url_, headers=headers_).text    # 使用xpath解析书名    xml_obj = etree.HTML(str_data)    # print(get_book_name(    #     xml_obj))  # ['从红月开始', '人族镇守使', '全属性武道', '深空彼岸', '我的云养女友', '我用闲书成圣人', '明克街13号', '星门', '东晋北府一丘八', '夜的命名术', '这个人仙太过正经', '顶级气运,悄悄修炼千年', '不科学御兽', '我的治愈系游戏', '这游戏也太真实了', '长夜余火', '赤心巡天', '轮回乐园', '合道', '宇宙职业选手']    # print(get_yuepiao(    #     str_data))  # ['𘢒𘢒𘢐𘢉𘢎', '𘢌𘢋𘢐𘢐', '𘢌𘢏𘢌𘢑', '𘢑𘢉𘢒𘢎', '𘢑𘢎𘢋𘢔', '𘢑𘢏𘢏𘢉', '𘢎𘢑𘢐𘢉', '𘢎𘢏𘢑𘢔', '𘢎𘢒𘢉𘢏', '𘢏𘢎𘢏𘢎', '𘢔𘢑𘢑𘢔', '𘢔𘢎𘢐𘢓', '𘢔𘢔𘢑𘢐', '𘢔𘢒𘢑𘢏', '𘢔𘢐𘢒𘢐', '𘢒𘢌𘢉𘢌', '𘢒𘢑𘢌𘢓', '𘢒𘢑𘢎𘢓', '𘢒𘢎𘢓𘢉', '𘢒𘢎𘢏𘢐']    # print(get_font(xml_obj, headers_))    # 书名列表    book_name_list = get_book_name(xml_obj)    # 月票列表    yuepiao_list = jiemi(get_yuepiao(str_data), get_font(xml_obj, headers_))    for i in range(len(book_name_list)):        print(f'{book_name_list[i]}:{yuepiao_list[i]}')

到此,相信大家对"python起点网月票榜字体反爬的方法是什么"有了更深的了解,不妨来实际操作一番吧!这里是网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!

数据 字体 月票 文件 书名 加密 源代码 地址 网页 方法 点网 丘八 乐园 余火 千年 圣人 女友 宇宙 密文 属性 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 广州百单互联网科技有限公司 科技制造互联网公司 深圳互联网科技公司 合肥互联网科技公司 互联网科技英文 远信互联网科技 上海喔噻互联网科技 中国互联网有什么科技含量 成都铂石互联网科技做什么的 互联网科技与管理 科技互联网大厂 崇明区互联网教育科技诚信经营 996高科技互联网公司 玉溪新华互联网科技好不好 全球科技与互联网公司市值变化 互联网科技手机排行榜 广州三三互联网科技有限公司 数字科技和互联网金融哪个好 互联网企业和网络科技有限公司 广州全民伙伴互联网科技有限公司 上海睿民互联网科技有限公司 今日互联网科技 合肥互联网科技公司 伴你行互联网科技有限公司 互联网高科技股票 开启互联网科技时代小说 福建科技产业互联网发展 青岛科技大学互联网大赛研究生 中国互联网公司排名锤子科技 本届互联网大会上的黑科技
0