1、下载安装包

pip install fontTools

2、下载查看工具FontCreator

百度后一路傻瓜式安装即可

3、反爬虫机制

网页上看见的

后台源代码里面的

从上面可以看出,生这个字变成了乱码,请大家特别注意箭头所指的数字。

3、解决

1、确定反爬方法

在看了别人的解析文章之后,确定采取的是字体反爬机制,即网站定义了字体文件,然后进行相应的查找替换,在前端看起来,是没有任何差异的。其实从审查元素的也是可以看到的:

和大众点评的反爬差不多,都是通过css搞得。

2、寻找字体文件

以上面方框里的”customfont“为关键词搜了一下,发现就在源代码里面:

而且还有base64,直接进行解密,但是解密出来的其实是乱码,这个时候其实要做的很简单,把解密后的内容保存为.ttf格式即可。

ttf文件: *.ttf是字体文件格式。TTF(TrueTypeFont)是Apple公司和Microsoft公司共同推出的字体文件格式,随着windows的流行,已经变成最常用的一种字体文件表示方式。

@font-face 是CSS3中的一个模块,主要是实现将自定义的Web字体嵌入到指定网页中去。

因为我们要对字体进行研究,所以必须将它打开,这里我是用的是FontCreator,打开以后是这个样子(其实很多字,在这里为了看的清楚,所以只截了下面的图):

很明显,每个字可以看到字形和字形编码。

观察现在箭头指的地方和前面箭头指的地方的数字是不是一样啊,没错,就是通过这种方法进行映射的。

所以我们现在的思路似乎就是在源代码里找到箭头指的数字,然后再来字体里找到后替换就行了。

恭喜你,如果你也是这么想的,那你就掉坑里了。

因为每次访问,字体字形是不变的,但字符的编码确是变化的。因此,我们需要根据每次访问,动态解析字体文件。

字体1:

字体2:

所以想通过写死的方式也是行不通的。

这个时候我们就要对字体文件进行更深一步的研究了。

3、研究字体文件

刚刚的.ttf文件我们是看不到内部的东西的,所以这个时候我们要对字体文件进行转换格式,将其转换为xml格式,然后来查看:

具体操作如下:

 
 
1
2
3
from fontTools.ttLib import TTFont
font_1 = TTFont('58_font_1.ttf')
font_base.saveXML('font_1.xml')

xml的格式如下:

文件很长,我只截取了一部分。

仔细的观察一下,你会发现~这俩下面的x,y,on值都是一毛一样的。所以我们的思路就是以一个已知的字体文件为基本,然后将获取到的新的字体文件的每个文字对应的x,y,on值进行比较,如果相同,那么说明新的文字对就 可以在基础字体那里找到对应的文字,有点绕,下面举个小例子。

假设: “我” 在基本字体中的名为uni1,对应的x=1,y=1,n=1新的字体文件中,一个名为uni2对应的x,y, n分别于上面的相等,那么这个时候就可以确定uni2 对应的文字为”我”。

查资料的时候,发现在特殊情况下,有时候两个字体中的文字对应的x,y不相等,但是差距都是在某一个阈值之内,处理方法差不多,只不过上面是相等,这种情况下就是要比较一下。

其实,如果你用画图工具按照上面的x与y值把点给连起来,你会发现,就是汉字的字形~

所以,到此总结一下:

一、将某次请求获取到的字体文件保存到本地[基本字体];
二、用软件打开后,人工的找出每一个数字对应的编码[
一定要保证顺序的正确,要不然会出事];
三、我们以后访问网页时,需要保存新字体文件;
四、用Fonttools库对基本字体与新字体进行处理,找
到新的字体与基本字体之间的映射;
五、替换;

4、代码

# coding=utf-8
import requests
import re
import time
import lxml.html as H
import base64
from fontTools.ttLib import TTFont
import requests
from lxml import etree
def get_data(url):
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.106 Safari/537.36',
}
response = requests.get(url, headers=headers)
font_data_origin = re.search(r'base64,(.*?)\)', response.text, re.S).group(1)
font_data_after_decode = base64.b64decode(font_data_origin)
new_font_name = "font_new.ttf"
with open(new_font_name, 'wb') as f:
f.write(font_data_after_decode)
# font_base = TTFont('font_base.ttf').saveXML('font_base.xml')
# font_base = TTFont('font_new.ttf').saveXML('font_new.xml')
map_data = tff_parse(new_font_name)
names = etree.HTML(response.text).xpath('//span[@class="infocardName fl stonefont resumeName"]/text()')
# 有的时候会找不到,可以多执行几次;
if names:
for name in names:
print('name in page source', name)
for j in map_data.keys():
name = name.replace(j, map_data[j])
print('name actual', name) def tff_parse(font_parse_name):
# 我这里的字体的顺序,如果你的不同,一定要修改
font_dict = [u'博', u'经', u'硕', u'届', u'大', u'刘', u'', u'', u'士', u'E', u'', u'', u'张',
u'M', u'验', u'', u'本', u'赵', u'陈', u'吴', u'李', u'生', u'', u'校', u'以', u'应', u'黄',
u'技', u'无', u'女', u'A', u'周', u'中', u'', u'王', u'', u'', u'', u'科', u'高', u'男',
u'杨', u'专', u'下', u'B']
font_base = TTFont('font_base.ttf')
font_base_order = font_base.getGlyphOrder()[1:]
# font_base.saveXML('font_base.xml') #调试用 font_parse = TTFont(font_parse_name)
# font_parse.saveXML('font_parse_2.xml')调试用
font_parse_order = font_parse.getGlyphOrder()[1:]
f_base_flag = []
for i in font_base_order:
flags = font_base['glyf'][i].flags
f_base_flag.append(list(flags))
f_flag = []
for i in font_parse_order:
flags = font_parse['glyf'][i].flags
f_flag.append(list(flags))
result_dict = {}
for a, i in enumerate(f_base_flag):
for b, j in enumerate(f_flag):
if comp(i, j):
key = font_parse_order[b].replace('uni', '')
key = eval(r'u"\u' + str(key) + '"').lower()
result_dict[key] = font_dict[a]
return result_dict def comp(L1, L2):
if len(L1) != len(L2):
return 0
for i in range(len(L2)):
if L1[i] == L2[i]:
pass
else:
return 0
return 1 if __name__ == '__main__':
url = "https://su.58.com/qztech/"
get_data(url)

看一下成果

参考链接:

https://cuiqingcai.com/6431.html

58 字体反爬攻略 python3的更多相关文章

  1. Python爬虫入门教程 63-100 Python字体反爬之一,没办法,这个必须写,反爬第3篇

    背景交代 在反爬圈子的一个大类,涉及的网站其实蛮多的,目前比较常被爬虫coder欺负的网站,猫眼影视,汽车之家,大众点评,58同城,天眼查......还是蛮多的,技术高手千千万,总有五花八门的反爬技术 ...

  2. k 近邻算法解决字体反爬手段|效果非常好

    字体反爬,是一种利用 CSS 特性和浏览器渲染规则实现的反爬虫手段.其高明之处在于,就算借助(Selenium 套件.Puppeteer 和 Splash)等渲染工具也无法拿到真实的文字内容. 这种反 ...

  3. python解析字体反爬

    爬取一些网站的信息时,偶尔会碰到这样一种情况:网页浏览显示是正常的,用python爬取下来是乱码,F12用开发者模式查看网页源代码也是乱码.这种一般是网站设置了字体反爬 一.58同城 用谷歌浏览器打开 ...

  4. 记一次css字体反爬

    前段时间在看css反爬的时候,发现很多网站都做了css反爬,比如,设置字体反爬的(58同城租房版块,实习僧招聘https://www.shixiseng.com/等)设置雪碧图反爬的(自如租房http ...

  5. python爬取实习僧招聘信息字体反爬

    参考博客:http://www.cnblogs.com/eastonliu/p/9925652.html 实习僧招聘的网站采用了字体反爬,在页面上显示正常,查看源码关键信息乱码,如下图所示: 查看网页 ...

  6. Python爬虫入门教程 64-100 反爬教科书级别的网站-汽车之家,字体反爬之二

    说说这个网站 汽车之家,反爬神一般的存在,字体反爬的鼻祖网站,这个网站的开发团队,一定擅长前端吧,2019年4月19日开始写这篇博客,不保证这个代码可以存活到月底,希望后来爬虫coder,继续和汽车之 ...

  7. Python爬虫实例:爬取猫眼电影——破解字体反爬

    字体反爬 字体反爬也就是自定义字体反爬,通过调用自定义的字体文件来渲染网页中的文字,而网页中的文字不再是文字,而是相应的字体编码,通过复制或者简单的采集是无法采集到编码后的文字内容的. 现在貌似不少网 ...

  8. Python爬虫-字体反爬-猫眼国内票房榜

    偶然间知道到了字体反爬这个东西, 所以决定了解一下. 目标:  https://maoyan.com/board/1 问题: 类似下图中的票房数字无法获取, 直接复制粘贴的话会显示 □ 等无法识别的字 ...

  9. Spider-天眼查字体反爬

    字体反爬也就是自定义字体反爬,通过调用自定义的woff文件来渲染网页中的文字,而网页中的文字不再是文字,而是相应的字体编码,通过复制或者简单的采集是无法采集到编码后的文字内容! 1.思路 近期在爬取天 ...

随机推荐

  1. solr 入门

    这个博客写的不错,很详细 https://blog.csdn.net/wzy18210825916/article/details/80946454

  2. DTcms 模版用vs2015或2017 打开编辑时候 粘贴出问题 代码被调整

    因为模版语言不是标准的HTML格式 ,所以HTML粘帖的时候会格式化 导致原标签出问题,这里修改下就可以了

  3. Java作业二(2017-9-18)

    /*程序员龚猛,求整数各个位上的和*/ import java.util.Scanner; public class Helloworld{ public static void main(Strin ...

  4. Overview of .rdp file settings

    On this page you will find an overview of most of the available .rdp file settings which can be used ...

  5. 关于HTTP协议学习(一)

    一,目录结构 B/S 结构定义 URI (统一资源标志符) HTTP 协议 HTTP 请求报文 HTTP 响应报文 HTTP Methods HTTP Status Code 二,B/S,C/S 结构 ...

  6. JavaWeb的学习路线

    JavaWeb的学习路线 一.BS结构 B/S结构(Browser/Server,浏览器/服务器模式),是WEB兴起后的一种网络结构模式,WEB浏览器是客户端最主要的应用软件.这种模式统一了客户端,将 ...

  7. VisualStudioCode创建的asp.net core控制台程序部署到linux

    1.asp.net core控制台程序 static void Main(string[] args) { ; ) { Console.WriteLine("Hello World!&quo ...

  8. springboot新增swagger2配置

    转自http://www.cnblogs.com/jtlgb/p/8532433.html SpringBoot整合Swagger2 相信各位在公司写API文档数量应该不少,当然如果你还处在自己一个人 ...

  9. Python文件常用操作方法

    Python文件常用操作方法 一.对File对象常用操作方法: file= open(file, mode='r', buffering=-1, encoding=None, errors=None, ...

  10. 实验吧MD5之守株待兔解题思路

    解题链接 http://ctf5.shiyanbar.com/misc/keys/keys.php 解题思路 首先我们多打开几次解题链接,发现系统密钥大约在一秒钟左右变一次,所以联想到时间戳. 解题过 ...