解决58同城使用font-face进行字符替换

最近在抓取58同城简历数据的时候,发现网页使用font-face进行字符替换。比如23岁,页面中编码是。也就是说,2的编码是0xe0453的编码是0xe032。同时,对比多个网页,发现同一个字符,在页面中的编码不一样,如2在不同页面中的编码可能不断变化。

这样替换有个好处,即使浏览器将页面渲染出来,显示出来的文字仍然是不可复制粘贴的,这是因为字符的编码值和常用文字编码的编码值不一致。

font-face实际上是一种字体,58用的是woff字体格式。可以学习一下woff字体的编码。注意,这里用的是woff,不是woff2。woff的字体定义见:https://www.w3.org/TR/2012/REC-WOFF-20121213。我下面的映射是基于其编码来的,所以需要好好看一下。

字符映射的原理是y=x-a的分段函数,x是网页编码,y最终是从0开始编号,表示字符在字体文件中的编号,通过这个编号寻找字体数据。

看了一篇文章,也是讲这个事,但是同一个字符,其y是不变的,比如2,始终对应1,也就是第1个字体(渲染出来,人看起来就是2的样子)。但58这里的替换,同一个字符,最终在字体文件中的编号不断变化。每次的字体数据也相应的不断变化。

那怎么办?首先想到的是,58的程序员,总不会为每个字符创造很多种字体(字符的样子)吧?也就是说,每个字符,在字体文件中的最终编号虽然不一样,但是其字体是不变的,那只需要记录下字符的最终字体就行,这个映射不变。

怎么记录呢?我用了一个简单的方法,就是使用了字符字体的外轮廓,每个字体的外轮廓不一样(当两个字长得差不多时,可能存在重复,但58替换的少,只替换46个字符,够用,更好的方式是比较每个字符的完整字体)。对外轮廓的编码求个MD5,也就是找到了真实的字符和MD5的唯一映射。

搞定。

顺便附上最终得到的映射。部分代码见这里:58同城字符替换破解。注意啊,全部的代码我没保留,这里只是核心代码,有需要全部代码的,留言给我,我重新写一下。

技	139d979591546d5dbc67ef91180759e3
校	dbbc6996c0cfde0b6af4c73a84bed4a4
验	3cf694ead2e8983b3fdbd5b8360eff2e
中	3aee43e816b4eaa008a17de313975eac
经	dd3b6cfa12821ea9e4f1083b5e44cd4c
0	696e5a800eb8b73e7609f0953b8254a3
1	0d8c09783cace0527eb025dff0fc83ce
3	4d7937f2d5e3479e16bf60e3e018fd11
4	faab9407ed648109eb20040c3bffe748
6	0463607c2f7089996e85a5b77d1977e8
男	d18ab46a7dcaf6766243814e322ea12c
无	d412dfb05aa6cdf7fcb96c975f45a2d3
2	01851bb3d5cb6d3511a277be33bde3fc
女	225a7e68d2b009df8536a0d53a457aa1
以	fe9c6f98807ad953f7a6c53b8d2cdf16
高	d223d8e6f3721839503b4aabe23c169e
下	97ac383894335937280c318b99372570
大	a71fe52bd36a921ee17e3c480e891ce1
士	963823d9856cdfd835df4b70f1498975
应	d74f6f1cbd4da0d2fee7d3d2c688de04
届	7f03322c4deacee2465cc6f0f34eb631
生	e58d3419c2d13a060955b9a9a367434d
8	94437ab8cdac55c8dba31eee0ee50e9c
9	a223deb187cdf1691fd397af0f21f4c7
7	b2b5ebca99ae3f12215dddc28a60a34a
5	05ffa80920e6d92e38e6b81c0c712cce
吴	8c3da9829dd22c3f623597d1a3039a97
黄	f80914b5be8a7838a458a3151e306dee
周	95848d87bed78e2acdc818f3dd316511
张	948c6bf8ba5562cc613a09f21ceb60f0
李	f5f7b638abfde33a37d0c9c1048e473b
A	10d07153249839f1e1f499b1f782022e
B	8dcbbc18474b3311f7a7e351989e44cb
E	6d955c023912da9e571ff21992aa5770
M	706cdc353a59d5351264e7b51ddbdad8
科	84c7a0208ae400af4dada6be5d707531
本	6e291343b641d51614b38dcf0bd985c0
王	dc486d0f76401ee48cda346e5d2f1cc4
陈	5c03f34140b9d9bafc7cb8832a0624d0
杨	0e657fa46f946686401a4f5fec56c7d5
刘	2d7920835b210d00b4c6ca316609830c
博	60f7762c5e1a6fb18348bd4b774e6817
赵	5df029b99c890618ad6ed66cb60ba767
硕	bd1547d220e511af1e3b21b1750152ab

 


 

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值