基于vc的freetype字体轮廓解析_Python爬虫大众点评字体加密评论采集!听说这个网站很难?...

前序


最近在研究反爬虫策略,写了一个大众点评评论采集的程序,途中遇到了一些坑有感而发分享给大家,
大众点评是基于css机制实现的字体加密技术来阻碍我的进行准确数据的抓取

正文

图1

736d9356c5a0788f76513bda5c423b02.png


根据图1我们可以看出部分文字在源码中是无法得到正常显示的,对应的我们解析也只能得到一些无用的svg标签,且又由于文字本身就是一个svg标签所以此时我们的selenium也爱莫能助,初步认定字体正确显示在网页中是根据svg的class解析出的

图2

e2ca44854cc1017681a710ec4863f596.png


由上图可以看出svg的每一个类都是对应着特定的坐标,并且还得知了网页加载时加载了一个svg文件,我们打开此链接看下对应内容为何物

图3

44e85d7a12ff23f48508be25e7db318a.png


可以看到图2处的免字在该svg链接返回内容中可以获取到,且图2处显示标签width: 14px ,坐标为x=112 y = 2322,我们来找一下规律,免字在图3当前行内处于第九位,而112/14=8, 在我们程序中又经常使用下标展示内容,那么我们继续对照确定解析方式

859411ac04431f8e10c436257ede529b.png
519e2b0b6a03378aefb5de42cc4825b0.png


图4

3e2c2e0bac617568715bdbe3820bd6c5.png


图5

3386788167008cd08ab393bc71f1e24f.png


通过图四和图五可以发现确实如同我们所猜想,x坐标/14就对应字体在svg文件内的x轴位置,现在就仅剩y轴坐标需要我们找寻规律了

图6

f7a1dea3c801709c401a07021dd08097.png


通过查看svg链接对应的网页源代码图6得知每一行字都是对应着y坐标,我们再来看下之前两个例子可以看出加密的svg标签对应的y坐标跟字体文件中的y坐标是存在明确关联的, 即现在我们的大致思路为得到一个svg标签的坐标就相当于得到了正确的文字,那么所有的坐标又在哪呢,我们通过控制台查看得知坐标属性来源于一个css文件中,并且css路径就存在于网页源代码中,见下图所示

03ac8f03a07e41d36339bd47dc414f5e.png
92d105a721e0b341ad3b61ee71d60eb0.png


既然可以在网页源代码中查找到css文件链接,那我们则可以直接请求网页解析出css链接下载保存,逻辑代码如下

import reimport requestsurl = "http://www.dianping.com/shop/GavvJBWdqYcLjBwy/review_all/p1"headers = {    "Accept": 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9',    'Cookie': 'cy=27; cityid=27; cye=handan; _lxsdk_cuid=173c6514b30c8-0e6711b8a2f35c-3323765-1fa400-173c6514b31c8; _lxsdk=173c6514b30c8-0e6711b8a2f35c-3323765-1fa400-173c6514b31c8; _hc.v=cf8f5b37-3861-f1f3-6c0e-19eda7cf1586.1596760084; s_ViewType=10; ua=%E6%B6%9B_564185; ctu=b689a74c52ba985ea6916abc613db7bb2b8fdd33076d2fe769beab344a903ff1; fspop=test; cy=27; cye=handan; _lx_utm=utm_source%3DBaidu%26utm_medium%3Dorganic; Hm_lvt_602b80cf8079ae6591966cc70a3940e7=1598251294,1598252432,1598314846,1598424884; thirdtoken=f70d51d9-4aa6-4b5b-a9df-cdb8ddf1e704; dper=229946c9c4e1e1a2f4ee1aa7e6bb59480b3239f64245a9f169c2f2b6403e9e1f3976e7b1f6b30ed85e477c1b2736d0e6504d7bc1d608fbc3e9b3b477146c218d62be39d25e7faf4cf702f0c0c849a01e5ac6d4124a0c5d9379bcdb729f2791b0; ll=7fd06e815b796be3df069dec7836c3df; ctu=e3484a94f676ae112c7ef5969592c697269c1d07df30ee75c2e77c1457a5cbaefc7d0488ebf9bc8ac603acc1da69eebf; dplet=49dd30d40ac37ddd886a35da22ae62d8; Hm_lpvt_602b80cf8079ae6591966cc70a3940e7=1598425074; _lxsdk_s=174298c21a2-3dd-90e-e71%7C%7C147',    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/84.0.4147.105 Safari/537.36'}con = requests.get(url, headers=headers).content.decode()# 通过正则取出css文件对应链接css_url = re.findall('', con)# 得到正确链接css_url = "http:" + css_url[0]css_response = requests.get(css_url).textwith open("./font.css", "w") as f:    f.write(css_response)

下载后的文件内容如下图所示

cb33d55bcd244b9a4770be85c62d356e.png


可以看到每一对坐标都对应着wt***, 而wt***则是我们一开始图2处的svg标签对应的class,并且css文件中是有我们的svg文件对应的链接的,那么我们现在有了所有的svg标签和其对应坐标,并且有其正确字体文件链接,那么通过对比即可得到我们所有的正确内容,大致逻辑即为:
1.获取网页源代码
2.解析出css文件路径并获取css文件内容
3.解析css文件内容中的svg class和对应的坐标的映射关系
4.根据css内容解析出svg文件内容即正确字体文件
5.根据svg class和对应的坐标的映射关系和正确字体文件完成网页中的svg标签解密,将svg标签替换为正确内容后利用xpath 正则 或bs4等手段即可完成数据采集

效果如下图所示

266609bd8cdadd1534df5a043358f9cb.png

完整视频教程以录好,文章还是没那么透彻吗 所以加群获取后台私信小编 01

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值