爬取数据不难,恶心的是各网站的各种反爬技术,替换字体,精灵图,数据加密等等,猫眼就是用到字体替换,简单来说就是字体映射,
首先先导入库,没有先pip安装
from fontTools.ttLib import TTFont
作用是把woff字体文件转成xml文件,
woff字体文件在猫眼页面css哪里
html页面位置
@font-face {
font-family: stonefont;
src: url('//vfile.meituan.net/colorstone/83d4dbb88976ee21d2cb2620b6051da23168.eot');
src: url('//vfile.meituan.net/colorstone/83d4dbb88976ee21d2cb2620b6051da23168.eot?#iefix') format('embedded-opentype'),
url('//vfile.meituan.net/colorstone/636dfb48d34fec199c62eb80acb2830b2080.woff') format('woff');
}
.stonefont {
font-family: stonefont;
font=TTFont('./猫眼2084_new.woff')#读取woff文件 # font.saveXML('./m.xml')#转成xml
xml文件打开如下图
先找出数字的规律,然后再提取数据再替换就行了,那么问题又来了,猫眼每次刷新页面对应数字的位置又不一样,那之前找出来的规律是不是没有了?所以还需要进一步的处理,
第一次获取字体的规律
dict={}
num = [6, 2, 9, 0, 1, 8, 4, 3, 7, 5] list=font.getGlyphOrder()[2:]
for n,p in zip(list,num): dict[n]=p
先把第一次获取的字体规律对应好合成一个字典,
然后再通过
getGlyphNames()对象的方法对应起来就行了
看代码吧
font=TTFont('./猫眼2084_new.woff')#读取woff文件 # font.saveXML('./m.xml')#转成xml num = [6, 2, 9, 0, 1, 8, 4, 3, 7, 5] list=font.getGlyphOrder()[2:] print(list) for n,p in zip(list,num): dict[n]=p print(dict) font1 = TTFont('./猫眼222字体.woff') # 读取新的woff文件 # font1.saveXML('./m999.xml') # 转成xml ff_list=font1.getGlyphNames()#返回一个对象 ff_news=font1.getGlyphOrder() for fo in ff_news: fo2=font1['glyf'][fo] for fff1 in list: fo3=font['glyf'][fff1] if fo2==fo3: print(fo,dict[fff1])
关系对应起来了
那么剩下来把提取的字体替换就行了
因为
显示是&#x
所以把字符uni替换成&#x
这就用到字符串方法了replace()
效果如图
好了,还有天眼网站的反爬也挺恶心,只要找到字体的规律就可以了