欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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

程序员文章站 2022-06-09 09:42:36
...

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

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

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

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