解决58同城使用font-face进行字符替换
最近在抓取58同城简历数据的时候,发现网页使用font-face进行字符替换。比如23岁,页面中编码是。也就是说,2的编码是0xe045,3的编码是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