字体反爬-解析字体文件

 字体反爬数据包的特征:

入门级字体反爬【高级KNN,OCR,
1.每一个网站的都不一样,可以理解是一种加密算法
2.是一种后缀为woff的文件
3.每一次请求的字体反爬数据都不一样,需要根据response实时获取到数据包的url,请求url,下载数据包再转换为xml,拿到解析后的关系映射表

案例

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

# 1.确认url
url = 'https://www.qidian.com/rank/yuepiao/'
headers = {
    'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.55 Safari/537.36 Edg/96.0.1054.43',
    'cookie': 'e1=%7B%22pid%22%3A%22qd_P_rank_01%22%2C%22eid%22%3A%22qd_C19%22%2C%22l1%22%3A4%7D; e2=%7B%22pid%22%3A%22qd_p_qidian%22%2C%22eid%22%3A%22qd_A16%22%2C%22l1%22%3A3%7D; _yep_uuid=9fdf2526-1ded-bb81-8b5d-591444a96ba7; newstatisticUUID=1638689982_849023807; _csrfToken=4NGHnQkTfBxOPk6yeffwA7Xlhqqv0GI7JYOJycux; _gid=GA1.2.1042302247.1638690002; e2=; e1=%7B%22pid%22%3A%22qd_p_qidian%22%2C%22eid%22%3A%22qd_A16%22%2C%22l1%22%3A3%7D; _ga=GA1.2.652085068.1638690001; _ga_FZMMH98S83=GS1.1.1638690000.1.1.1638690045.0; _ga_PFYW0QLV3P=GS1.1.1638690000.1.1.1638690045.0',
    'referer': 'https://www.qidian.com/rank/'
}
# 2.提交请求
response = requests.get(url, headers=headers)
# 3.解析数据
str_data = response.text
html = etree.HTML(str_data)
title = html.xpath('//div[@class="book-mid-info"]/h2/a/text()')
rank = html.xpath('//div[@class="book-img-box"]/span/text()')

# poll_str = '''
# <div class="book-right-info"> <div class="total">  <p><span><style>@font-face { font-family: RjpXnDny; src: url('https://qidian.gtimg.com/qd_anti_spider/RjpXnDny.eot?') format('eot'); src: url('https://qidian.gtimg.com/qd_anti_spider/RjpXnDny.woff') format('woff'), url('https://qidian.gtimg.com/qd_anti_spider/RjpXnDny.ttf') format('truetype'); } .RjpXnDny { font-family: 'RjpXnDny' !important;     display: initial !important; color: inherit !important; vertical-align: initial !important; }</style><span class="RjpXnDny">&#100364;&#100358;&#100357;&#100357;&#100360;</span></span>月票</p>
# '''
poll_pattern = '<div class="book-right-info.*?<span class=".*?">(.*?)</span></span>月票</p>'
poll_list = re.findall(poll_pattern, str_data)

# 解析字体加密
# 字体加密数据包
font_str = html.xpath('//div[@class="total"]//style/text()')[0]
font_url = re.findall("format\W+eot\W+ src: url\W+(.*?)\W+\s+format\('woff'\)", font_str)[0]
print(font_url)
font_file = requests.get(font_url, headers=headers)
with open('font.woff', 'wb')as f:
    f.write(font_file.content)

# 创建对象
font_obj = TTFont('font.woff')
# # 转格式
# font_obj.saveXML('font03.xml')
# 获取加密映射关系表
camp_dict = font_obj.getBestCmap()
# print(camp_dict)
dict_e_a = {
    "one": "1", "two": "2", "three": "3", "four": '4', "five": "5", "six": "6", "seven": "7", "eight": "8", "nine": "9",
    "zero": "0", "period": "."
}

r_poll_list = []
for poll in poll_list:
    poll = poll.replace('&#', '').split(';')
    drop_index = poll.index('')
    poll.pop(drop_index)
    r_poll = ''.join([dict_e_a[camp_dict[int(i)]] for i in poll])
    r_poll_list.append(r_poll)

with open('起点图书.json', 'a', encoding='utf-8') as f:
    for i, j in zip(title, r_poll_list):
        dict_ = {}
        dict_[i] = j
        json_data = json.dumps(dict_, ensure_ascii=False) + ',\n'
        f.write(json_data)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值