glidedsky-爬虫-字体反爬-2

  直接看题目。

  

 

 

   

 

 

   这里看起来和之前的字体反爬不太一样,但是道理是相似的,只要找到映射关系,就可以得到对应的数字了,先看一下源码。

  

  

 

   数字显示那块的源码是这样的,用了中文,字体的文件和之前的一样,放在了style这里,先用之前的方法下载下来用FontCreator看看。

  

 

   这啥也看不出来,直接看xml文件吧。

  

 

 

   xml文件也和之前的不一样了,不只10id,看name这里,像是Unicode编码,而源码里面显示的就是中文,那先把ni去掉看一下解码,第一个u529D解码出来是’劝’字。

  

  可以知道这里字体的映射逻辑是用源码中的中文转为unicode编码,映射到对应的id,那就是显示出来的数字了,这里要注意xml文件里面有些Unicode编码是康熙字体的编码,看上去是同一个字,但实际上是两个不一样的编码,所以需要加异常处理,当这个字在xml文件里面找不到映射的时候,要换成康熙字体去找映射的id

kangxi={'': '','': '','': '','': '','': '','': '','': '','': '','': '','': '','': '',
     '': '','': '','': '','': '','': '','': '','': '','': '','': '','': '','': '',
     '': '','': '','': '','': '','': '','': '','广': '','': '','': '','': '','': '⼿',
     '': '','': '','': '','': '','': '','': '','': '','': '','': '','': '','': '',
     '': '','': '','': '','': '','': '','': '','': '','': '','': '','': '','': '',
     '': '','': '','': '','': '','': '','': '','': '','': '','': '','': '','': '',
     '': '','': '','': '','': '','': '','': '','': '','': '','': '','': '','': '',
     '': '','': '','': '','': '','': '','': '','': '','': '','': '','': '⽿','': '',
     '': '','': '','': '','': '','': '','': '','': '','': '','': '','': '','': '',
     '': '','': '','': '','': '','': '','': '','': '','': '','': '','': '','': '',
     '': '','': '','': '','': '','': '','': '','': '','': '','': '','': '','': '',
     '': '','': '','': '','': '','': '','': '','': '','': '','': '','': '','': '',
     '': '','': '','': '','': '','': '','': '','': '','鹿': '','': '','': '','': '',
     '': '','': '','': '','': '','齿': '','': '','': '','': '', '': '','': '','𡯂': '',
     '': '','': '','': '','': '','': '','': '','': '','': '','西': '','': '','𧢲': '',
     '': '','': '','': '','𩠐': '','': '','': '','': '','': '','': '','': '','': '',
     '': ''}

  上面是常用的康熙字体,键是平时使用的中文,值是康熙字体。

for i in range(len(chinese)):
        unicode = chinese[i].encode('unicode_escape')
        name = 'uni' + str(unicode)[-5:-1].upper()
        try:
            num = font.getGlyphID(name) - 1
        except:
            unicode = kangxi[chinese[i]].encode('unicode_escape')
            name = 'uni' + str(unicode)[-5:-1].upper()
            num = font.getGlyphID(name) - 1

  这里chinese<div class="col-md-1">下的几个中文,因为中文编码成Unicode再转字符串是这样的"b'\\\\u529d'",只要’529d’这几个,再将字母大写,加上前面的’uni就得到了xml里面的name了。

posted @ 2021-04-22 10:28  一个小哥哥  阅读(137)  评论(0编辑  收藏  举报