概述
字体(@font-face)防爬-学习记录
解析步骤
更新:2021-3-10 08:57:01
- 下载、加载woff文件
- 按百度字体编辑器解析结果,截图识别出汉字,按顺序复制出汉字列表
font = TTFont(woff_path)
base_word= list('这里是按顺序复制出的汉字')
- 提取
uniname
列表,结合2中的汉字列表,构成uni->汉字
的映射
base_uniname = font.getGlyphOrder()[2:]
base_uniname_map_word = dict(zip(base_uniname, base_word))
- 提取
$E->uni
的映射
base_hex_map_uniname = font.getBestCmap()
- 由4,5构成
$E->汉字
的映射
dict_hex_map_word = {}
for k, v in base_hex_map_uniname.items():
if not str(v).startswith('uni'):
continue
base_hex_map_uniname[k] = base_uniname_map_word.get(v, '')
str_k = hex(k)
str_k1 = "<em class='iconfont'>&#x{};</em>".format(str_k[2:])
# print(str_k1)
dict_hex_map_word[str_k1] = base_uniname_map_word.get(v, '')
原网址:【http://www.dianping.com/shop/124413166】 ,对应位置数字和文字被加密
参考
1、针对@font-face反爬
2、第五章(上):诡异的字体
搜索关键字 “font-face
”
@font-face {
font-family: <fontFamily>; /* 自定义的字体名称; */
src: <source> [<format>][,<source> [<format>]]*;
/* 自定义的字体的存放路径、格式; */
[font-weight: <weight>]; /*
是否为粗体 */
[font-style: <style>]; /*
定义字体样式,如斜体 */
}
在源码中没有找到, 那就打开开发者调试工具, 在Network
中搜索 font 字体, 找到字体的url地址, 进行下载, url太长,使用md5压缩
dataBase64 = r'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'
#我这里拿到的自定义字体是采用js使用base64硬编码在网页里面的
import base64
from fontTools.ttLib import TTFont
import io
data = base64.b64decode(s)
fonts = TTFont(io.BytesIO(data))
#从解析出来的xml找到对应字体编码的结构并读取出来
fonts.saveXML("text.xml")
print(fonts.getBestCmap())
download as 7260090a.woff
将图中url里面的内容复制,在浏览器新标签页面打开,会直接下载一个文件。使用FontCreator字体查看工具 ,可以看到隐藏字符都有一个对应的编码
在原地址页面中观察目标内容
观察完毕,代码解析
# pip3 install fonttools
from fontTools.ttLib import TTFont
# 解析字体文件,获取字体映射关系
def parse_font():
font1 = TTFont(r"E:workspace20191029_zhaopin7260090a.woff")
keys, values = [], []
for k, v in font1.getBestCmap().items():
if v.startswith('uni'):
keys.append(eval("u'\u{:x}".format(k) + "'"))
values.append(chr(int(v[3:], 16)))
else:
keys.append("&#x{:x}".format(k))
values.append(v)
#
font1.saveXML('temp.xml')
return dict(zip(keys, values))
截止到目前,并没有解决大众点评的解析,
参考1、 听说你爬回来的都是乱码?三个案例教你破解字体加密,这个说要建立2个列表:汉字列表和编码列表,然而这2个列表好像需要手动构建,持续搜索别的方法。是不是可以使用 ==> 网上搜到字典列表,可以用。
参考2、 反爬终极方案总结—字体反爬
参考2、 用matplotlib,画出坐标
-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
2019-12-11 17:15:21-解决办法:
参考大众点评 数据爬取 (字体反爬)
1、获取woff(2个address.woff and num.woff)
通过观察,页面每次加载的css是同一个,意味着address和num的woff文件是仅有一套
手动下载woff文件,此处以address.woff 为例
2、加载woff文件,获取编码
addrFont = TTFont('address.woff') # 加载woff文件
addrFont.saveXML('addrFont.xml') # 转为xml文件,方便对比
3、构造目标字典
character = list('1234567890店中美家馆小车大市公酒行国品发电金心业商司超生装园场食有新限天面工服海华水房饰城乐汽香部利子老艺花专东肉菜学福饭人百餐茶务通味所山区门药银农龙停尚安广鑫一容动南具源兴鲜记时机烤文康信果阳理锅宝达地儿衣特产西批坊州牛佳化五米修爱北养卖建材三会鸡室红站德王光名丽油院堂烧江社合星货型村自科快便日民营和活童明器烟育宾精屋经居庄石顺林尔县手厅销用好客火雅盛体旅之鞋辣作粉包楼校鱼平彩上吧保永万物教吃设医正造丰健点汤网庆技斯洗料配汇木缘加麻联卫川泰色世方寓风幼羊烫来高厂兰阿贝皮全女拉成云维贸道术运都口博河瑞宏京际路祥青镇厨培力惠连马鸿钢训影甲助窗布富牌头四多妆吉苑沙恒隆春干饼氏里二管诚制售嘉长轩杂副清计黄讯太鸭号街交与叉附近层旁对巷栋环省桥湖段乡厦府铺内侧元购前幢滨处向座下県凤港开关景泉塘放昌线湾政步宁解白田町溪十八古双胜本单同九迎第台玉锦底后七斜期武岭松角纪朝峰六振珠局岗洲横边济井办汉代临弄团外塔杨铁浦字年岛陵原梅进荣友虹央桂沿事津凯莲丁秀柳集紫旗张谷的是不了很还个也这我就在以可到错没去过感次要比觉看得说常真们但最喜哈么别位能较境非为欢然他挺着价那意种想出员两推做排实分间甜度起满给热完格荐喝等其再几只现朋候样直而买于般豆量选奶打每评少算又因情找些份置适什蛋师气你姐棒试总定啊足级整带虾如态且尝主话强当更板知己无酸让入啦式笑赞片酱差像提队走嫩才刚午接重串回晚微周值费性桌拍跟块调糕')
4、目标字典
numDict = {'': '0', '': '1', '': '2', '': '3', '': '4', '': '5', '': '6', '': '7', '': '8', '': '9'}
# -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
addrDict = {'': '店', '': '中', '': '美', '': '家', '': '馆', '': '小', '': '车', '': '大', '': '市', '': '公', '': '酒', '': '行', '': '国', '': '品', '': '发', '': '电', '': '金', '': '心', '': '业', '': '商', '': '司', '': '超', '': '生', '': '装', '': '园', '': '场', '': '食', '': '有', '': '新', '': '限', '': '天', '': '面', '': '工', '': '服', '': '海', '': '华', '': '水', '': '房', '': '饰', '': '城', '': '乐', '': '汽', '': '香', '': '部', '': '利', '': '子', '': '老', '': '艺', '': '花', '': '专', '': '东', '': '肉', '': '菜', '': '学', '': '福', '': '饭', '': '人', '': '百', '': '餐', '': '茶', '': '务', '': '通', '': '味', '': '所', '': '山', '': '区', '': '门', '': '药', '': '银', '': '农', '': '龙', '': '停', '': '尚', '': '安', '': '广', '': '鑫', '': '一', '': '容', '': '动', '': '南', '': '具', '': '源', '': '兴', '': '鲜', '': '记', '': '时', '': '机', '': '烤', '': '文', '': '康', '': '信', '': '果', '': '阳', '': '理', '': '锅', '': '宝', '': '达', '': '地', '': '儿', '': '衣', '': '特', '': '产', '': '西', '': '批', '': '坊', '': '州', '': '牛', '': '佳', '': '化', '': '五', '': '米', '': '修', '': '爱', '': '北', '': '养', '': '卖', '': '建', '': '材', '': '三', '': '会', '': '鸡', '': '室', '': '红', '': '站', '': '德', '': '王', '': '光', '': '名', '': '丽', '': '油', '': '院', '': '堂', '': '烧', '': '江', '': '社', '': '合', '': '星', '': '货', '': '型', '': '村', '': '自', '': '科', '': '快', '': '便', '': '日', '': '民', '': '营', '': '和', '': '活', '': '童', '': '明', '': '器', '': '烟', '': '育', '': '宾', '': '精', '': '屋', '': '经', '': '居', '': '庄', '': '石', '': '顺', '': '林', '': '尔', '': '县', '': '手', '': '厅', '': '销', '': '用', '': '好', '': '客', '': '火', '': '雅', '': '盛', '': '体', '': '旅', '': '之', '': '鞋', '': '辣', '': '作', '': '粉', '': '包', '': '楼', '': '校', '': '鱼', '': '平', '': '彩', '': '上', '': '吧', '': '保', '': '永', '': '万', '': '物', '': '教', '': '吃', '': '设', '': '医', '': '正', '': '造', '': '丰', '': '健', '': '点', '': '汤', '': '网', '': '庆', '': '技', '': '斯', '': '洗', '': '料', '': '配', '': '汇', '': '木', '': '缘', '': '加', '': '麻', '': '联', '': '卫', '': '川', '': '泰', '': '色', '': '世', '': '方', '': '寓', '': '风', '': '幼', '': '羊', '': '烫', '': '来', '': '高', '': '厂', '': '兰', '': '阿', '': '贝', '': '皮', '': '全', '': '女', '': '拉', '': '成', '': '云', '': '维', '': '贸', '': '道', '': '术', '': '运', '': '都', '': '口', '': '博', '': '河', '': '瑞', '': '宏', '': '京', '': '际', '': '路', '': '祥', '': '青', '': '镇', '': '厨', '': '培', '': '力', '': '惠', '': '连', '': '马', '': '鸿', '': '钢', '': '训', '': '影', '': '甲', '': '助', '': '窗', '': '布', '': '富', '': '牌', '': '头', '': '四', '': '多', '': '妆', '': '吉', '': '苑', '': '沙', '': '恒', '': '隆', '': '春', '': '干', '': '饼', '': '氏', '': '里', '': '二', '': '管', '': '诚', '': '制', '': '售', '': '嘉', '': '长', '': '轩', '': '杂', '': '副', '': '清', '': '计', '': '黄', '': '讯', '': '太', '': '鸭', '': '号', '': '街', '': '交', '': '与', '': '叉', '': '附', '': '近', '': '层', '': '旁', '': '对', '': '巷', '': '栋', '': '环', '': '省', '': '桥', '': '湖', '': '段', '': '乡', '': '厦', '': '府', '': '铺', '': '内', '': '侧', '': '元', '': '购', '': '前', '': '幢', '': '滨', '': '处', '': '向', '': '座', '': '下', '': '県', '': '凤', '': '港', '': '开', '': '关', '': '景', '': '泉', '': '塘', '': '放', '': '昌', '': '线', '': '湾', '': '政', '': '步', '': '宁', '': '解', '': '白', '': '田', '': '町', '': '溪', '': '十', '': '八', '': '古', '': '双', '': '胜', '': '本', '': '单', '': '同', '': '九', '': '迎', '': '第', '': '台', '': '玉', '': '锦', '': '底', '': '后', '': '七', '': '斜', '': '期', '': '武', '': '岭', '': '松', '': '角', '': '纪', '': '朝', '': '峰', '': '六', '': '振', '': '珠', '': '局', '': '岗', '': '洲', '': '横', '': '边', '': '济', '': '井', '': '办', '': '汉', '': '代', '': '临', '': '弄', '': '团', '': '外', '': '塔', '': '杨', '': '铁', '': '浦', '': '字', '': '年', '': '岛', '': '陵', '': '原', '': '梅', '': '进', '': '荣', '': '友', '': '虹', '': '央', '': '桂', '': '沿', '': '事', '': '津', '': '凯', '': '莲', '': '丁', '': '秀', '': '柳', '': '集', '': '紫', '': '旗', '': '张', '': '谷', '': '的', '': '是', '': '不', '': '了', '': '很', '': '还', '': '个', '': '也', '': '这', '': '我', '': '就', '': '在', '': '以', '': '可', '': '到', '': '错', '': '没', '': '去', '': '过', '': '感', '': '次', '': '要', '': '比', '': '觉', '': '看', '': '得', '': '说', '': '常', '': '真', '': '们', '': '但', '': '最', '': '喜', '': '哈', '': '么', '': '别', '': '位', '': '能', '': '较', '': '境', '': '非', '': '为', '': '欢', '': '然', '': '他', '': '挺', '': '着', '': '价', '': '那', '': '意', '': '种', '': '想', '': '出', '': '员', '': '两', '': '推', '': '做', '': '排', '': '实', '': '分', '': '间', '': '甜', '': '度', '': '起', '': '满', '': '给', '': '热', '': '完', '': '格', '': '荐', '': '喝', '': '等', '': '其', '': '再', '': '几', '': '只', '': '现', '': '朋', '': '候', '': '样', '': '直', '': '而', '': '买', '': '于', '': '般', '': '豆', '': '量', '': '选', '': '奶', '': '打', '': '每', '': '评', '': '少', '': '算', '': '又', '': '因', '': '情', '': '找', '': '些', '': '份', '': '置', '': '适', '': '什', '': '蛋', '': '师', '': '气', '': '你', '': '姐', '': '棒', '': '试', '': '总', '': '定', '': '啊', '': '足', '': '级', '': '整', '': '带', '': '虾', '': '如', '': '态', '': '且', '': '尝', '': '主', '': '话', '': '强', '': '当', '': '更', '': '板', '': '知', '': '己', '': '无', '': '酸', '': '让', '': '入', '': '啦', '': '式', '': '笑', '': '赞', '': '片', '': '酱', '': '差', '': '像', '': '提', '': '队', '': '走', '': '嫩', '': '才', '': '刚', '': '午', '': '接', '': '重', '': '串', '': '回', '': '晚', '': '微', '': '周', '': '值', '': '费', '': '性', '': '桌', '': '拍', '': '跟', '': '块', '': '调', '': '糕'}
5、替换规则
def parseHtmlToGetCSSUrl2(companyInfoHtmlText=None):
parseHtml = r"parseHtml.html"
with open(parseHtml, 'r', encoding='utf-8') as f:
fReadLines = f.readlines()
companyInfoHtmlText = ''.join([text for text in fReadLines])
assert companyInfoHtmlText, "html must is not None"
companyInfoHtmlText = re.sub(r'[n|t]?', '', companyInfoHtmlText)
# 替换 Num
for key in numDict:
strReplace1 = "class="num">{};".format(key)
strReplace2 = "class="num">{}".format(numDict[key])
companyInfoHtmlText = companyInfoHtmlText.replace(strReplace1, strReplace2)
# 替换 address
for key in addrDict:
strReplace1 = "class="address">{};".format(key)
strReplace2 = "class="address">{}".format(addrDict[key])
companyInfoHtmlText = companyInfoHtmlText.replace(strReplace1, strReplace2)
最后
以上就是超级小馒头为你收集整理的字体加密woff(@font-face)防爬-学习记录字体(@font-face)防爬-学习记录2019-12-11 17:15:21-解决办法:的全部内容,希望文章能够帮你解决字体加密woff(@font-face)防爬-学习记录字体(@font-face)防爬-学习记录2019-12-11 17:15:21-解决办法:所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复