Python爬虫-字体反爬-猫眼国内票房榜
2019-05-17 00:00:39来源:博客园 阅读 ()
偶然间知道到了字体反爬这个东西, 所以决定了解一下.
目标: https://maoyan.com/board/1
问题: 类似下图中的票房数字无法获取, 直接复制粘贴的话会显示 □ 等无法识别的字符, 且网页源码中该类数字均被 . 之类的字符串代替.
解决:
出现这种情况的原因是因为网页字体是在 CSS3 @font-face 规则中定义的, 我觉得这种字体就类似描点连线那种方式绘制出来的.
因为定义规则是动态随机获取的, 不能保证每次都是一个字体文件.
如下:
可以看到, 同一数字所对应的字符是不一样的, 所以我们也就动态下载实时字体文件, 具体分析.
虽然每次对应的字符可能不一样, 但是可以发现同一数字的字形是一样的, 也就是"描点的坐标"应该相同.
事实证明在这个例子中是确实如此.
如下:
同一数字对象里的这些值是一样的.
既然找到问题所在和规律了, 就可以直接开始写代码了.
1 import re 2 from urllib.request import urlretrieve, urlopen 3 from fontTools.ttLib import TTFont 4 5 6 def process_font(url): 7 # loc.woff是事先下载好的字体文件 8 # 可以通过font1.saveXML()来了解文件的结构, font1就像一个的字典, XML文件里的tag可以对font1用字典的方法获取 9 font1 = TTFont('loc.woff') 10 # 使用百度的FontEditor手动确认本地字体文件name和数字之间的对应关系, 保存到字典中 11 loc_dict = {'uniE8B2': '5', 'uniF818': '3', 'uniECCC': '8', 'uniE622': '1', 'uniEC92': '2', 'uniF31A': '4', 12 'uniE86D': '9', 'uniE33C': '6', 'uniE1FA': '7', 'uniE13E': '0'} 13 # 获取字符的name列表, 打印出来后发现第一个和最后一个name所对应的不是数字, 所以切片 14 uni_list1 = font1.getGlyphNames()[1: -1] 15 16 # 网页源码 17 rsp = urlopen(url).read().decode() 18 # 获取动态的字体文件并下载 19 font_url = 'http://' + re.findall(r'url\(\'//(.*?\.woff)', rsp)[0] 20 # web字体文件落地名 21 filename = font_url.split('/')[-1] 22 # 下载web字体文件 23 urlretrieve(font_url, filename) 24 25 # 打开web字体文件 26 font2 = TTFont(filename) 27 # 获取字符的name列表 28 uni_list2 = font2.getGlyphNames()[1: -1] 29 30 # web字体文件中name和num映射 31 new_map = {} 32 33 for uni2 in uni_list2: 34 # 获取name 'uni2' 在font2中对应的对象 35 obj2 = font2['glyf'][uni2] 36 for uni1 in uni_list1: 37 # 获取name 'uni1' 在font1中对应的对象 38 obj1 = font1['glyf'][uni1] 39 # 如果两个对象相等, 说明对应的数字一样 40 if obj1 == obj2: 41 # 将name键num值对加入new_map 42 new_map[uni2] = loc_dict[uni1] 43 44 # 将数字替换至源码 45 for i in uni_list2: 46 pattern = '&#x' + i[3:].lower() + ';' 47 rsp = re.sub(pattern, new_map[i], rsp) 48 49 # 返回处理处理后的源码 50 return rsp 51 52 53 if __name__ == '__main__': 54 # 猫眼国内实时票房top10 55 url = 'https://maoyan.com/board/1' 56 # 替换数字后的网页源码 57 res = process_font(url)
代码里loc.woff文件是先下载好的, 通过它找到数字和"描点坐标"之间的对应关系. 这个文件大家可以自己提前下载, 并且手动找到对应关系.
这里也提供了我下载的loc.woff文件, https://github.com/ysl125963/maoyan, 里面的font.xml文件就是通过saveXML()方法得到的, 可以看到字体文件的具体结构.
这是第一次写分享博客, 而且github也没怎么用过, 希望以后能坚持吧.
原文链接:https://www.cnblogs.com/yangshaolun/p/10865379.html
如有疑问请与原作者联系
标签:
版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有
下一篇:设置开发环境字体
- python3基础之“术语表(2)” 2019-08-13
- python3 之 字符串编码小结(Unicode、utf-8、gbk、gb2312等 2019-08-13
- Python3安装impala 2019-08-13
- 小白如何入门 Python 爬虫? 2019-08-13
- python_字符串方法 2019-08-13
IDC资讯: 主机资讯 注册资讯 托管资讯 vps资讯 网站建设
网站运营: 建站经验 策划盈利 搜索优化 网站推广 免费资源
网络编程: Asp.Net编程 Asp编程 Php编程 Xml编程 Access Mssql Mysql 其它
服务器技术: Web服务器 Ftp服务器 Mail服务器 Dns服务器 安全防护
软件技巧: 其它软件 Word Excel Powerpoint Ghost Vista QQ空间 QQ FlashGet 迅雷
网页制作: FrontPages Dreamweaver Javascript css photoshop fireworks Flash