字体反爬-动态字库

这次是动态字体库的字体反爬

猫眼电影榜单国内票房榜,地址:https://maoyan.com/board/1

可以看出又是字体反爬,需要获得字体文件,定位字体文件的url,在页面或css里搜@font-face或font-famil

在network选font标签刷新页面几次发现每次用的字体都不一,加密用的字体库是动态的,手动建立关系表然后全局替换的方法不管用了。

解决方案

建立字符和动态字体库unicode的联系

原理

首先要了解字体文件内部有很多表,上篇用到记录unicode索引和字形关系的cmap表就在里面,

这此要用到glyf表,这个表里记录了具体的字形数据,表里只记录了字形数据,没有表头索引。

有专门的表loca按顺序记录glyf里每个字形的位置,在使用字体时通过loca表来找到具体字形。

所以反爬不是改变字形的话可以利用字形数据来找到自定义字体unicode与真实字符的联系。

这部分详细资料见 https://www.cnblogs.com/shenyiyangle/p/10700156.html 中的glyf表。

找关联的思路如图:

1.下载一个网站字体做为基准,建立基准字体unicode和真实字符关系。

2.在页面刷新网页字体库变化,重新下载字体,记为网站字体2,通过比较网站字体1和网站字体2的字形找到unicode和新unicode联系。

3.再通过相同的unicode来建立真实字符和变化字体库unicode的联系,最后全局将新unicode替换成真实字符。

代码

headers={"User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.86 Safari/537.36"}
r=requests.get("https://maoyan.com/board/1",headers=headers)
font1_url="http:"+re.findall("url\(\‘(\/\/.*?woff)\‘\)",r.text,re.M)[0]#创建font目录保存基准字体
if not os.path.exists("font"):
    font1=requests.get(font1_url,headers=headers)
    os.mkdir("font")
    with open("./font/base.woff","wb")as f:
        f.write(font1.content)

下载一次基准字体并保存到font目录

base_font = TTFont(‘./font/base.woff‘)
base_dict=[]
for i in range(len(baseFont.getGlyphOrder()[2:])):
    print(f"对应的数字{i+1}:")
    w=input()
    base_dict.append({"code":baseFont.getGlyphOrder()[2:][i],"num":w})

建立基准字体的unicode和真实字符的关系,看字体可以用FontCreator

上面的代码只需要执行一次,已经跳过前两项直接按顺序输入数字即可

new_font_url="http:"+re.findall("url\(\‘(\/\/.*?woff)\‘\)",r.text,re.M)[0]
font=requests.get(new_font_url,headers=headers)
with open("new_font.woff","wb")as f:
    f.write(font.content)
new_font = TTFont(‘new_font.woff‘)
new_font_code_list=new_font.getGlyphOrder()[2:]

页面改变后的字体下载,获取unicode列表

replace_dic=[]
for i in range(10):
    news = new_font[‘glyf‘][new_font_code_list[i]]
    for j in range(10):
        bases = base_font[‘glyf‘][base_dict[j]["code"]]
        if news == bases:
            unicode=new_font_code_list[i].lower().replace("uni","&#x")+";"
            num= base_dict[j]["num"]
            replace_dic.append({"code":unicode,"num":num})

建立新unicode和字符的关系

org_data=r.text
for i in range(len(replace_dic)):
    new_data=new_data.replace(replace_dic[i]["code"],replace_dic[i]["num"])

全局替换unicode成字符

tree=etree.HTML(org_data)
dds=tree.xpath(‘//dl[@class="board-wrapper"]/dd‘)
info=[]
for dd in dds:
    title=dd.xpath(‘.//p[@class="name"]/a/@title‘)[0]
    star=dd.xpath(‘.//p[@class="star"]/text()‘)[0].replace("主演:","")
    time=dd.xpath(‘.//p[@class="releasetime"]/text()‘)[0].replace("上映时间:","")
    realticket=dd.xpath(‘.//p[@class="realtime"]//text()‘)[1]+dd.xpath(‘.//p[@class="realtime"]//text()‘)[2].strip()
    totalticket=dd.xpath(‘.//p[@class="total-boxoffice"]//text()‘)[1]+dd.xpath(‘.//p[@class="total-boxoffice"]//text()‘)[2].strip()
    info.append({"标题":title,"主演":star,"上映时间":time,"实时票房":realticket,"总票房":totalticket})

抓一些信息,下面是结果

json保存成csv

import csv
csv_file = open("1325.csv", ‘w‘, newline=‘‘)
keys = []
writer = csv.writer(csv_file)
keys = info[1].keys()
writer.writerow(keys)
for dic in info:
    for key in keys:
        if key not in dic:
            dic[key ] = ‘‘
    writer.writerow(dic.values())
csv_file.close()

结果

引入的库

以上是全部代码

原文地址:https://www.cnblogs.com/shenyiyangle/p/10711065.html

时间: 2024-10-09 12:46:29

字体反爬-动态字库的相关文章

python解析字体反爬

爬取一些网站的信息时,偶尔会碰到这样一种情况:网页浏览显示是正常的,用python爬取下来是乱码,F12用开发者模式查看网页源代码也是乱码.这种一般是网站设置了字体反爬 一.58同城 用谷歌浏览器打开58同城:https://sz.58.com/chuzu/,按F12用开发者模式查看网页源代码,可以看到有些房屋出租标题和月租是乱码,但是在网页上浏览却显示是正常的. 用python爬取下来也是乱码: 回到网页上,右键查看网页源代码,搜索font-face关键字,可以看到一大串用base64加密的字

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

说说这个网站 汽车之家,反爬神一般的存在,字体反爬的鼻祖网站,这个网站的开发团队,一定擅长前端吧,2019年4月19日开始写这篇博客,不保证这个代码可以存活到月底,希望后来爬虫coder,继续和汽车之间对抗. CSDN上关于汽车之家的反爬文章千千万万了,但是爬虫就是这点有意思,这一刻写完,下一刻还能不能用就不知道了,所以可以一直不断有人写下去.希望今天的博客能帮你学会一个反爬技巧. 今天要爬去的网页 https://car.autohome.com.cn/config/series/59.htm

Python爬虫进阶 | 某音字体反爬分析

字体反爬案例 爬取一些网站的信息时,偶尔会碰到这样一种情况:网页浏览显示是正常的,用 python 爬取下来是乱码,F12用开发者模式查看网页源代码也是乱码.这种一般是网站设置了字体反爬. 1. 准备url 网址: https://www.iesdouyin.com/share/user/88445518961 2. 获取数据 分析字体加密方式 任务:爬取个人信息展示页中的关注.粉丝人数和点赞数据,页面内容如图 下 所示. 在编写代码之前,我们需要确定目标数据的元素定位.定位时,我们在 HTML

字体反爬----字体加密

学习用字体对数据进行加密来反爬 字体加密首先得准备一个字体库,测试的话可以在网上随便找,本例字体是本墨悠圆,链接:http://www.zhaozi.cn/html/fonts/china/benmo/2019-02-01/25085.html 字体重命名成bmyy.ttf 从字体库提取要加密的字符需要用到fonttools fonttools安装: pip install fonttools 使用方法: pyftsubset <字体文件> --text=<需要的字形> --out

58同城 字体反爬理解...和猫眼不同

import requests import re import base64 import io from lxml import etree from fontTools.ttLib import TTFont url = 'https://gz.58.com/zufang/?utm_source=market&spm=u-2d2yxv86y3v43nkddh1.BDPCPZ_BT&PGTID=0d100000-0000-31f5-5967-5384271a3920&Click

爬虫之路: 字体文件反爬二(动态字体文件)

上一篇解决了但页面的字体反爬, 这篇记录下如何解决动态字体文件, 编码不同, 文字顺序不同的情况 源码在最后 冷静分析页面 打开一个页面, 发现字体文件地址是动态的, 这个倒是好说, 写个正则, 就可以动态匹配出来 先下载下来一个新页面的字体文件, 做一下对比, 如图 mmp, 发现编码, 字体顺序那那都不一样, 这可就过分了, 心里一万个xxx在奔腾 头脑风暴ing.gif (与伙伴对话ing...) 不着急, 还是要冷静下来, 再想想哪里还有突破点 同一个页面的字体文件地址是动态的, 但是,

常见的反爬机制及应对策略

1.Headers: 从用户的headers进行反爬是最常见的反爬策略,Headers是一种最常见的反爬机制Headers是一种区分浏览器行为和机器行为中最简单的方法,还有一些网站会对Referer (上级链接)进行检测 从而实现爬虫. 相应的解决措施:通过审查元素或者开发者工具获取相应的headers 然后把相应的headers 传输给python 的requests,这样就能很好地绕过. 2.IP 限制 一些网站会根据你的IP 地址访问的频率,次数进行反爬.也就是说如果你用单一的IP 地址访

Python爬虫|深入请求(四)常见的反爬机制以及应对方法

作者:David Qian 链接:https://zhuanlan.zhihu.com/p/21558661 来源:知乎 著作权归作者所有.商业转载请联系作者获得授权,非商业转载请注明出处. 大家好!我是厦门大学王亚南经济研究院的大一学生,今天将由我来为大家介绍一下常见的反爬机制以及应对方法. 注:非商业转载注明作者即可,商业转载请联系作者授权并支付稿费.本人已授权"维权骑士"网站(http://rightknights.com)对我在知乎发布文章的版权侵权行为进行追究与维权. ---

爬虫与反爬

爬虫与反爬 (1) 基本的概念 爬虫: 自动获取网站数据的程序 关键是 定时,定量的,批量的获取 反爬虫: 使用技术手段 防止爬虫程序的方法 存在误伤,即 反爬技术 将普通用户识别为爬虫 如果误伤高 --- 效果再好也不能使用 例子: 比如 限制 ip === 用户的ip 一般都是 局域网内动态分配的, 一个爬虫的ip 可能分配给 另一个 非爬虫的用户 有效的方法: 可以在一段时间内 限制 ip,过一段时间 再把 ip释放 反爬的成本: 成功率越高成本越大,拦截率越高,误伤率越高 反爬虫的目的: