不列颠“燕尾服”——阿斯顿马丁DB11。实喜欢这篇内容,照片拍的真心漂亮。
为此我也特意找朋友帮忙给我的马丁来一组,拍的不请家多担待!
<div layer1="text-s">div><div class="tz-paragraph"><span style='font-family: myfont;'>span><span style='font-family: myfont;'>span>列颠“燕尾服”——阿斯顿马丁DB11。<span style='font-family: myfont;'>span>实喜欢这篇内容,照片拍的真心漂亮。<br /><br />为此我也特意找朋友帮忙给我的马丁来<span style='font-family: myfont;'>span>组,拍的<span style='font-family: myfont;'>span>好请<span style='font-family: myfont;'>span>家多担待!<br />div><div layer1="text-e">div>
<style type="text/css">
@font-face {font-family: 'myfont';src: url('//k2.autoimg.cn/g24/M06/3F/FF/wKgHH1qWFoGALXlaAABiXrRwbBM42..eot');src: url('//k3.autoimg.cn/g24/M06/3F/FF/wKgHH1qWFoGALXlaAABiXrRwbBM42..eot?#iefix') format('embedded-opentype'),url('//k3.autoimg.cn/g24/M06/3F/FF/wKgHH1qWFoGATQa3AABhmFKVVrQ43..ttf') format('woff');}
style>
# 看到了几个文件:
1. eot文件: *.eot是一种压缩字库,目的是解决在网页中嵌入特殊字体的难题。在网页中嵌入的字体只能是 OpenType 类型,其他类型的字体只有转换成 OpenType 类型(eot格式)的字体才能在网页中进行嵌入。
2. ttf文件: *.ttf是字体文件格式。TTF(TrueTypeFont)是Apple公司和Microsoft公司共同推出的字体文件格式,随着windows的流行,已经变成最常用的一种字体文件表示方式。
列颠“燕尾服”——阿斯顿马丁DB11。实喜欢这篇内容,照片拍的真心漂亮。
为此我也特意找朋友帮忙给我的马丁来组,拍的好请家多担待!
大不列颠“燕尾服”――阿斯顿马丁DB11。着实喜欢这篇内容,照片拍的真心漂亮。
为此我也特意找朋友帮忙给我的马丁来一组,拍的不好请大家多担待
字形 | 网页源代码中呈现的编码 | ttf字体文件中的编码 |
---|---|---|
大 | | uniED83 |
不 | | uniECD2 |
着 | | uniEDCB |
一 | | uniED4F |
不 | | uniECD2 |
大 | | uniED83 |
对比,发现两者不一样,长得就不像是亲兄弟。经过尝试比对,发现这其实分别是unicode编码和utf-8编码。
而且,我发现每次访问,字体字形顺序是不变的,但字符的编码确是变化的。因此,我们需要根据每次访问,动态解析字体文件。
# -*- coding:utf-8 -*-
import requests
from lxml import html
import re
from fontTools.ttLib import TTFont
# 定义字体文件的名字
fontFileName = "autohomeFont.ttf"
headerInfo = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/59.0.3071.86 Safari/537.36",
'host':'club.autohome.com.cn',
}
# 爬取链接
url = "https://club.autohome.com.cn/bbs/thread/9b952e4f093e6295/64890206-1.html"
# 获取页面源代码
resp = requests.get(url, headers = headerInfo)
# 用正则表达式提取ttf字体文件的地址
# url('//k3.autoimg.cn/g24/M06/3F/FF/wKgHH1qWFoGATQa3AABhmFKVVrQ43..ttf') format('woff');}
ttfUrlRe = re.search(",url\('(//.*.ttf)'\) format\('woff'\)", resp.text, re.DOTALL)
ttfUrl = ""
if ttfUrlRe:
ttfUrl = "https:" + ttfUrlRe.group(1)
if ttfUrl:
# 以文件流的方式,抓取ttf字体文件
ttfFileStream = requests.get(ttfUrl, stream = True)
# 将数据流保存在本地的ttf文件中(新创建)
with open(fontFileName, "wb") as fp:
for chunk in ttfFileStream.iter_content(chunk_size=1024):
if chunk:
fp.write(chunk)
# 用fontTools模块解析字体库文件
fontObject = TTFont(fontFileName)
# 按顺序拿到各个字符的unicode编码
# ['.notdef', 'uniED8F', 'uniED3D', …… ]
uniWordList = fontObject['cmap'].tables[0].ttFont.getGlyphOrder()
print(f"自定义字体列表(unicorn编码): {uniWordList}")
# 将各个字符的unicode编码转换成utf-8编码
# [b'\xee\xb6\x8f', b'\xee\xb4\xbd', b'\xee\xb7\xb1', …… ]
utf8WordList = [eval("u'\\u" + uniWord[3:] + "'").encode("utf-8") for uniWord in uniWordList[1:]]
print(f"自定义字体列表( utf-8 编码): {utf8WordList}")
# 获取发帖内容文字
response = html.fromstring(resp.text)
contentLst = response.xpath("//div[@class='tz-paragraph']//text()")
# 这个部分的逻辑需要特别注意,因为自定义字体,也就是隐藏字符是以utf-8的形式存在的
# 所有一开始,我们就要以utf-8的编码形式来保持文本内容
content = ''.encode("utf-8")
for elem in contentLst:
content += elem.encode("utf-8")
# 录入字体文件中的字符。必须要以国际标准的unicode编码,取代汽车之家自己定义的字体编码
# 这个部分目前是手动输入,但是多次请求,每次拿到的ttf文件可能都不一样,甚至同一个字形,在不同的ttf文件中编码也不同,这个部分需要尤其注意
# 因为是python3,所以这些字符直接就是Unicode编码
wordList = ['一', '七', '三', '上', '下', '不', '九', '了', '二', '五', '低', '八',
'六', '十', '的', '着', '近', '远', '长', '右', '呢', '和', '四', '地', '坏',
'多', '大', '好', '小', '少', '短', '矮', '高', '左', '很', '得', '是', '更',
]
print(f"字体文件中字形列表: {wordList}")
print(f"contentBefort = {content.decode('utf-8')}")
print('--------------- After Convert -----------------')
# 因为之前提到过,在网页源代码中,这种“” 特殊字符是utf-8编码,所以我们要以utf-8的模式去进行查找替换
# content 是字符串,是Unicode编码
for i in range(len(utf8WordList)):
# 将自定的字体信息,替换成国际标准
content = content.replace(utf8WordList[i], wordList[i].encode('utf-8'))
print(f"contentAfter = {content.decode('utf-8')}")
自定义字体列表(unicorn编码): ['.notdef', 'uniED8F', 'uniED3D', 'uniEDF1', 'uniECB0', 'uniEC5E', 'uniED12', 'uniEDC5', 'uniED73', 'uniEC33', 'uniEDD5', 'uniEC94', 'uniED48', 'uniECF6', 'uniEDA9', 'uniEC69', 'uniEE0B', 'uniECCA', 'uniEC78', 'uniED2C', 'uniEDDF', 'uniED8D', 'uniEC4D', 'uniED00', 'uniECAE', 'uniED62', 'uniED10', 'uniEDC3', 'uniEC83', 'uniEC31', 'uniECE4', 'uniED98', 'uniED46', 'uniEDF9', 'uniEDA8', 'uniEC67', 'uniED1A', 'uniECC9', 'uniED7C']
自定义字体列表( utf-8 编码): [b'\xee\xb6\x8f', b'\xee\xb4\xbd', b'\xee\xb7\xb1', b'\xee\xb2\xb0', b'\xee\xb1\x9e', b'\xee\xb4\x92', b'\xee\xb7\x85', b'\xee\xb5\xb3', b'\xee\xb0\xb3', b'\xee\xb7\x95', b'\xee\xb2\x94', b'\xee\xb5\x88', b'\xee\xb3\xb6', b'\xee\xb6\xa9', b'\xee\xb1\xa9', b'\xee\xb8\x8b', b'\xee\xb3\x8a', b'\xee\xb1\xb8', b'\xee\xb4\xac', b'\xee\xb7\x9f', b'\xee\xb6\x8d', b'\xee\xb1\x8d', b'\xee\xb4\x80', b'\xee\xb2\xae', b'\xee\xb5\xa2', b'\xee\xb4\x90', b'\xee\xb7\x83', b'\xee\xb2\x83', b'\xee\xb0\xb1', b'\xee\xb3\xa4', b'\xee\xb6\x98', b'\xee\xb5\x86', b'\xee\xb7\xb9', b'\xee\xb6\xa8', b'\xee\xb1\xa7', b'\xee\xb4\x9a', b'\xee\xb3\x89', b'\xee\xb5\xbc']
字体文件中字形列表: ['一', '七', '三', '上', '下', '不', '九', '了', '二', '五', '低', '八', '六', '十', '的', '着', '近', '远', '长', '右', '呢', '和', '四', '地', '坏', '多', '大', '好', '小', '少', '短', '矮', '高', '左', '很', '得', '是', '更']
contentBefort = 大不列颠“燕尾服”――阿斯顿马丁DB11。着实喜欢这篇内容,照片拍真心漂亮。为此我也特意找朋友帮忙给我马丁来一组,拍不好请大家多担待!阿斯顿马丁在国内知名度高,但是买并不是很多,虽是众车型,但是这绝不会影响铁杆粉丝对它热爱,众大众主要还是在于品牌定位,就不多提了,选择马丁原因主要是同级别车型中马丁比较调,没有特别张扬外观和排气声,加速快但是很平稳,不会给我一种要失控感。感觉完全不别于法拉和兰博。个品牌各有特点,如果说前两款是血气方刚少年,那马丁一定是稳重大哥,处事不惊。任风雨来袭,我自岿然不动!!这就是马丁气场。,像Lamborghini Huracan,Mclaren625C,FerrariCalifornia T都去看过太过扎眼。所以综合比较最终还是定了AstonMartinDB11。Lamborghini Huracan,内饰我看着乱,而且有点太招摇了,Mclaren625C,他们注重f1,毕竟f1出身,注重速度与激情,我总感觉车内设计不大气,个人意见。FerrariCalifornia T,见比较多,身边有伙伴在开,所以想买个不一样,而且这车和Lamborghini一样高调,不适合我,四款车内饰特点不同,但是都具有现代科技美!!权衡再最终还是定了DB11,中控部分设计和家里车有相同方,用着比较顺手也比较喜欢。有后排可以放东西,后备箱点,但是开这车也基本都是市内跑,出远门也不会开车去。车头给我感觉没有车尾那么强烈,从尾部看肌肉感十足,有点美式肌肉车feel,db11虽然是跑车,但是更好定位我个人觉着是轿跑吧,动力方面搭载5.2L V12双涡轮增压发动机,最大功率608马力,动力总成方面不输于任何品牌,官方给出百米加速是3.9秒,不过我没有体验过,包括s+模式目前也没有感受过,内饰感觉整体要比其他几款品牌好。价格没什么可说,大家都差不多。所以综合下来最终还是比较喜欢db11,车大概4个月右提回来。目前跑了9000多公里。刹车方面需要适应一段时间,最开始老是各种点头,急刹。慢慢适应吧(我个人车技一般)后备箱空间不是很大哦,所以一般出门游玩,后排也可以放一些东西,但是箱子不易过大,要不放进去比较费劲。整体来说两个人出行,后备箱+后排基本满足长途旅行吧!用车感优点:动力十足,缺点:空间有点,外观:回头率超高内饰:真皮触感很棒,做工精细,英国制造!空间:储物空间略,略少动力:提速快,加速平稳,不会有失控感操控:悬挂调校好,转向精准舒适:驾驶空间充足,是不是跑车通病,开久了腰累其它个别问题,每个人可能遇到不同,也不好发表意见和建议,慢慢体会交流心得吧,照片是朋友帮忙给拍,感谢伙伴@张拍摄!!
--------------- After Convert -----------------
contentAfter = 大不列颠“燕尾服”――阿斯顿马丁DB11。着实喜欢这篇内容,照片拍的真心漂亮。为此我也特意找朋友帮忙给我的马丁来一组,拍的不好请大家多担待!阿斯顿马丁在国内知名度高,但是买的并不是很多,虽是小众车型,但是这绝不会影响铁杆粉丝对它的热爱,小众大众主要还是在于品牌的定位,就不多提了,选择马丁的原因主要是同级别车型中马丁比较低调,没有特别张扬的外观和排气声,加速快但是很平稳,不会给我一种要失控感。感觉完全不别于法拉和兰博。三个品牌各有特点,如果说前两款是血气方刚的少年,那马丁一定是稳重的大哥,处事不惊。任风雨来袭,我自岿然不动!!这就是马丁的气场。,像Lamborghini 的Huracan,Mclaren的625C,Ferrari的California T都去看过太过扎眼。所以综合比较最终还是定了AstonMartin的DB11。Lamborghini 的Huracan,内饰我看着乱,而且有点太招摇了,Mclaren的625C,他们注重的f1,毕竟f1出身,注重速度与激情,我总感觉车内设计不大气,个人意见。Ferrari的California T,见的比较多,身边有伙伴在开,所以想买个不一样的,而且这车和Lamborghini一样高调,不适合我,四款车的内饰特点不同,但是都具有现代科技美!!权衡再三最终还是定了DB11,中控部分设计和家里车有相同的地方,用着比较顺手也比较喜欢。有后排可以放东西,后备箱小点,但是开这车也基本都是市内跑,出远门也不会开车去。车头给我的感觉没有车尾那么强烈,从尾部看肌肉感十足,有点美式肌肉车的feel,db11虽然是跑车,但是更好的定位我个人觉着是轿跑吧,动力方面搭载5.2L V12双涡轮增压发动机,最大功率608马力,动力总成方面不输于任何品牌,官方给出的百米加速是3.9秒,不过我没有体验过,包括s+模式目前也没有感受过,内饰感觉整体要比其他几款品牌的好。价格没什么可说的,大家都差不多。所以综合下来最终还是比较喜欢db11,车大概4个月左右提回来的。目前跑了9000多公里。刹车方面需要适应一段时间,最开始老是各种点头,急刹。慢慢适应吧(我个人车技一般)后备箱空间不是很大哦,所以一般出门游玩,后排也可以放一些东西,但是箱子不易过大,要不放进去比较费劲。整体来说两个人出行,后备箱+后排基本满足长短途旅行吧!用车感优点:动力十足,缺点:空间有点小,外观:回头率超高内饰:真皮的触感很棒,做工精细,英国制造!空间:储物空间略小,略少动力:提速快,加速平稳,不会有失控感操控:悬挂调校好,转向精准舒适:驾驶空间充足,是不是跑车通病,开久了腰累其它的的个别小问题,每个人可能遇到的不同,也不好发表意见和建议,慢慢体会交流心得吧,照片是朋友帮忙给拍的,感谢小伙伴@张的拍摄!!
ttf字体文件的解析:
https://blog.csdn.net/blueangle17/article/details/23750999
https://github.com/fonttools/fonttools
字符集详解:
https://blog.csdn.net/qq_28098067/article/details/53486032
字体反爬技术:
https://www.cnblogs.com/h2zZhou/p/7248261.html
遗留问题: