根据公司的业务需求,需要抓取一个企业信息的数据查询网站做公司内部的业务支撑,网站网址https://www.weimao.com/search?key=阿里巴巴&type=enterprise&filter=,这个网站打开的时候页面上面的数据是正常显示的,经过仔细分析调试发现它的反爬机制是字体反爬,一个简单而又特殊的字体反爬,为什么说它简单而又特殊呢?因为它是字体反爬但是它的字体文件的编码不会随着页面的刷新而刷新,但是它的字有点多390个字,特殊在于它不像我们常见的反爬网页源代码显示的是编码而是中文汉字,这样就起到了混淆的作用。

目标分析

我们先打开该网站 微猫搜索

可以发现浏览器Elements里的(渲染后)段落数据不一样,简直词不达意,但是段落里的有些字还是在页面渲染是正确的,比如网络两字,页面看到的和渲染的是一样。再看阿里两个字在Elements里显示的是 要 识 两个字,我们可以确定这是一个字体反爬,根据之前的经验我们打开源码搜索woff可以看到

发现在网页源码中是通过CSS进行动态加载进来的字体文件,我们知道该网站编码实现了自己的一套字体编码文件,那么我们可以下载这个字体文件查看一下是什么内容,下载完成之后我们在百度搜索百度WOFF打开字体文件查看

经过测试之后发现这个文件并不是之前那种直接对应的编码进行固定替换的,然后每一次新的请求该字体文件也是随机的,


我们仔细分析发现每个字体对应的编码是一样的,我们把编码进行替换用python的chr()函数解密试下发现就是如猜测的一样


找到了它的编码对应的规律,接下来我们进行做一个字典映射然后批量替换就可以了,首先,我们需要先定义好,字体以及编码后的映射关系

实现方案

import requests
import re
import hashlib
from qy_search.common import REQ,get_log,ABY
from lxml.etree import HTML
from fontTools.ttLib import TTFontfrom lxml import etreeclass WM_Search(REQ):def __init__(self):super(REQ).__init__()self.s = requests.session()self.s.headers.update({"User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.100 Safari/537.36",})self.proxy, self.ipItem = ABY()self.IPcount = 0self.log = get_log()self.baseUrl = 'https://www.weimao.com/search?key={}&type=enterprise&filter='self.str_name = ['.', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J','K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', 'a', 'b', 'c', 'd', 'e','f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z','七', '万', '三', '上', '东', '中', '主', '么', '义', '乐', '九', '乱', '事', '二', '于', '亚', '些', '交', '亦', '京', '仍','从', '代', '令', '任', '企', '会', '传', '但', '体', '作', '使', '便', '保', '信', '修', '倒', '候', '假', '像', '儿', '党','全', '八', '共', '其', '具', '写', '准', '击', '分', '刘', '制', '前', '力', '功', '加', '务', '包', '化', '区', '半', '华','南', '卫', '历', '原', '县', '参', '又', '友', '取', '另', '只', '叫', '可', '台', '司', '合', '名', '后', '向', '吗', '君','听', '命', '和', '品', '响', '商', '喜', '器', '四', '回', '团', '国', '图', '地', '场', '坐', '基', '增', '士', '声', '处','备', '复', '外', '多', '夜', '够', '大', '女', '始', '姐', '字', '存', '孩', '它', '宗', '实', '害', '察', '对', '封', '将','少', '就', '局', '居', '属', '山', '岁', '工', '差', '己', '已', '巴', '市', '布', '常', '干', '年', '并', '广', '底', '度','式', '强', '归', '影', '律', '德', '志', '念', '怎', '怕', '性', '情', '惊', '感', '愿', '所', '才', '找', '承', '技', '把','护', '报', '据', '推', '提', '支', '收', '政', '故', '文', '断', '新', '日', '早', '时', '易', '春', '显', '晚', '曰', '更','最', '月', '朝', '术', '机', '杀', '条', '来', '某', '标', '校', '格', '案', '止', '段', '母', '每', '比', '民', '气', '水','汉', '江', '没', '河', '活', '济', '海', '满', '火', '然', '物', '特', '独', '率', '玉', '甚', '用', '由', '电', '男', '界','病', '益', '真', '眼', '着', '研', '示', '社', '神', '称', '究', '空', '突', '章', '等', '答', '米', '类', '精', '系', '素','紧', '约', '级', '经', '给', '绝', '续', '维', '置', '美', '群', '老', '联', '自', '至', '致', '般', '船', '节', '英', '被','装', '西', '要', '观', '规', '视', '觉', '解', '让', '记', '论', '设', '识', '该', '语', '说', '诸', '谈', '谓', '责', '质','费', '越', '路', '较', '边', '运', '近', '还', '远', '连', '选', '造', '部', '都', '采', '里', '金', '银', '间', '阳', '阿','陈', '院', '除', '随', '需', '青', '革', '须', '领', '题', '验', '黄']self.hex_name = ['0x2e', '0x30', '0x31', '0x32', '0x33', '0x34', '0x35', '0x36', '0x37', '0x38', '0x39', '0x41', '0x42','0x43', '0x44', '0x45', '0x46', '0x47', '0x48', '0x49', '0x4a', '0x4b', '0x4c', '0x4d', '0x4e', '0x4f','0x50', '0x51', '0x52', '0x53', '0x54', '0x55', '0x56', '0x57', '0x58', '0x59', '0x5a', '0x61', '0x62','0x63', '0x64', '0x65', '0x66', '0x67', '0x68', '0x69', '0x6a', '0x6b', '0x6c', '0x6d', '0x6e', '0x6f','0x70', '0x71', '0x72', '0x73', '0x74', '0x75', '0x76', '0x77', '0x78', '0x79', '0x7a', '0x4e03', '0x4e07','0x4e09', '0x4e0a', '0x4e1c', '0x4e2d', '0x4e3b', '0x4e48', '0x4e49', '0x4e50', '0x4e5d', '0x4e71','0x4e8b', '0x4e8c', '0x4e8e', '0x4e9a', '0x4e9b', '0x4ea4', '0x4ea6', '0x4eac', '0x4ecd', '0x4ece','0x4ee3', '0x4ee4', '0x4efb', '0x4f01', '0x4f1a', '0x4f20', '0x4f46', '0x4f53', '0x4f5c', '0x4f7f','0x4fbf', '0x4fdd', '0x4fe1', '0x4fee', '0x5012', '0x5019', '0x5047', '0x50cf', '0x513f', '0x515a','0x5168', '0x516b', '0x5171', '0x5176', '0x5177', '0x5199', '0x51c6', '0x51fb', '0x5206', '0x5218','0x5236', '0x524d', '0x529b', '0x529f', '0x52a0', '0x52a1', '0x5305', '0x5316', '0x533a', '0x534a','0x534e', '0x5357', '0x536b', '0x5386', '0x539f', '0x53bf', '0x53c2', '0x53c8', '0x53cb', '0x53d6','0x53e6', '0x53ea', '0x53eb', '0x53ef', '0x53f0', '0x53f8', '0x5408', '0x540d', '0x540e', '0x5411','0x5417', '0x541b', '0x542c', '0x547d', '0x548c', '0x54c1', '0x54cd', '0x5546', '0x559c', '0x5668','0x56db', '0x56de', '0x56e2', '0x56fd', '0x56fe', '0x5730', '0x573a', '0x5750', '0x57fa', '0x589e','0x58eb', '0x58f0', '0x5904', '0x5907', '0x590d', '0x5916', '0x591a', '0x591c', '0x591f', '0x5927','0x5973', '0x59cb', '0x59d0', '0x5b57', '0x5b58', '0x5b69', '0x5b83', '0x5b97', '0x5b9e', '0x5bb3','0x5bdf', '0x5bf9', '0x5c01', '0x5c06', '0x5c11', '0x5c31', '0x5c40', '0x5c45', '0x5c5e', '0x5c71','0x5c81', '0x5de5', '0x5dee', '0x5df1', '0x5df2', '0x5df4', '0x5e02', '0x5e03', '0x5e38', '0x5e72','0x5e74', '0x5e76', '0x5e7f', '0x5e95', '0x5ea6', '0x5f0f', '0x5f3a', '0x5f52', '0x5f71', '0x5f8b','0x5fb7', '0x5fd7', '0x5ff5', '0x600e', '0x6015', '0x6027', '0x60c5', '0x60ca', '0x611f', '0x613f','0x6240', '0x624d', '0x627e', '0x627f', '0x6280', '0x628a', '0x62a4', '0x62a5', '0x636e', '0x63a8','0x63d0', '0x652f', '0x6536', '0x653f', '0x6545', '0x6587', '0x65ad', '0x65b0', '0x65e5', '0x65e9','0x65f6', '0x6613', '0x6625', '0x663e', '0x665a', '0x66f0', '0x66f4', '0x6700', '0x6708', '0x671d','0x672f', '0x673a', '0x6740', '0x6761', '0x6765', '0x67d0', '0x6807', '0x6821', '0x683c', '0x6848','0x6b62', '0x6bb5', '0x6bcd', '0x6bcf', '0x6bd4', '0x6c11', '0x6c14', '0x6c34', '0x6c49', '0x6c5f','0x6ca1', '0x6cb3', '0x6d3b', '0x6d4e', '0x6d77', '0x6ee1', '0x706b', '0x7136', '0x7269', '0x7279','0x72ec', '0x7387', '0x7389', '0x751a', '0x7528', '0x7531', '0x7535', '0x7537', '0x754c', '0x75c5','0x76ca', '0x771f', '0x773c', '0x7740', '0x7814', '0x793a', '0x793e', '0x795e', '0x79f0', '0x7a76','0x7a7a', '0x7a81', '0x7ae0', '0x7b49', '0x7b54', '0x7c73', '0x7c7b', '0x7cbe', '0x7cfb', '0x7d20','0x7d27', '0x7ea6', '0x7ea7', '0x7ecf', '0x7ed9', '0x7edd', '0x7eed', '0x7ef4', '0x7f6e', '0x7f8e','0x7fa4', '0x8001', '0x8054', '0x81ea', '0x81f3', '0x81f4', '0x822c', '0x8239', '0x8282', '0x82f1','0x88ab', '0x88c5', '0x897f', '0x8981', '0x89c2', '0x89c4', '0x89c6', '0x89c9', '0x89e3', '0x8ba9','0x8bb0', '0x8bba', '0x8bbe', '0x8bc6', '0x8be5', '0x8bed', '0x8bf4', '0x8bf8', '0x8c08', '0x8c13','0x8d23', '0x8d28', '0x8d39', '0x8d8a', '0x8def', '0x8f83', '0x8fb9', '0x8fd0', '0x8fd1', '0x8fd8','0x8fdc', '0x8fde', '0x9009', '0x9020', '0x90e8', '0x90fd', '0x91c7', '0x91cc', '0x91d1', '0x94f6','0x95f4', '0x9633', '0x963f', '0x9648', '0x9662', '0x9664', '0x968f', '0x9700', '0x9752', '0x9769','0x987b', '0x9886', '0x9898', '0x9a8c', '0x9ec4']self.str_name_dict = {}self.hex_name_dict = {}self.GlyphOrder_item = {}def wm_font_save(self,content):'''匹配字体文件并生成动态映射关系'''# 动态下载字体文件# wotf = re.findall(r"src: url\((.*?)\);\n",content)[0]wotf = re.findall(r"url\((.*?)\) format\(\'woff\'\)",content)[0]eot_url = "https://www.weimao.com" + wotfeot_res = self.get_req(eot_url)# 存到本地file_name = r'E:\code\spider\spider_process\qy_search\wm_font\wm_font.woff'with open(file_name,'wb') as fp:fp.write(eot_res.content)#转换为xmlfont = TTFont(file_name)target_name = r'E:\code\spider\spider_process\qy_search\wm_font\wm_font.xml'font.saveXML(target_name)# 处理xml文件 建立映射关系etre = etree.parse(target_name)root = etre.getroot(); root.findall(".")# 建立 GlyphOrder映射GlyphOrder = root.findall('.//cmap/cmap_format_12/map')for _ in GlyphOrder:self.GlyphOrder_item[_.get("code")] = "0x" + (_.get("name").replace("uni",""))self.str_name_dict = dict(zip(self.str_name,self.hex_name))self.hex_name_dict = dict(zip(self.hex_name,self.str_name))def spider(self,company):''':param company: 公司名称:return:'''try:url = self.baseUrl.format(company)resp = self.get_req(url=url)resp.encoding = 'utf-8'self.wm_font_save(resp.text)etre = HTML(resp.text)name_lt = etre.xpath('//div[@class="wraper-liat-a"]/a')for names in name_lt:date_item = {}name = "".join(names.xpath(".//text()"))url = "https://www.weimao.com" + "".join(names.xpath(".//@href"))str_name = ""for _ in name:if _ == '(' or _ == ')':passelse:try:hex_name_dict_keys = self.str_name_dict[_]except Exception as e:print("该字体没有被混淆")str_name += _continueGlyphOrder_key = self.GlyphOrder_item[hex_name_dict_keys].lower()name = self.hex_name_dict[GlyphOrder_key]_ = namestr_name += _date_item["name"] = str_namedate_item["url"] = urldate_item["_id"] = hashlib.md5(date_item["url"].encode('utf-8')).hexdigest()except Exception as e:passst = WM_Search()
st.spider("阿里巴巴")
name_ORM ={}

python处理字体(动态字体库)相关推荐

  1. Python爬虫:猫眼电影反爬—动态字体处理(2020)

    2020年5月25日更新,在爬了几百条后发现,有少部分数据会出错,出错概率很小.目前推测其原因是因为欧氏距离在对于(-1,0)和(0,1)这种数据计算结果差异不大的原因.有精度需求的建议改用别的距离计 ...

  2. Python反反爬系列(一)----K近邻算法与CSS动态字体加密

    声明:文章仅源自个人兴趣爱好,不涉及他用,侵权联系删. 网站不好直接给出,给出论坛无法过审,观看破解过程即可. 1.字体反爬 字体反爬也就是自定义字体加密映射,通过调用自定义的字体文件来渲染网页中的文 ...

  3. python爬取猫眼遇到动态字体反爬

    前一段时间,爬取了58同城,发现当时的网页对数字有字体反爬虫,然后废了九牛二虎之力找到了规律,终于破解了反爬虫,后来发现猫眼的这个网页虽然使用了字体反爬,但是和原来的58同城还是有很大的差别,后来了解 ...

  4. 【JavaScript 逆向】猿人学 web 第七题:动态字体,随风漂移

    案例目标 网址:第七题 动态字体,随风漂移 - 猿人学 本题目标:采集 5 页中胜点列的数据,找出胜点最高的召唤师,将召唤师姓名填入答案中 字体反爬 演变的基本阶段: 1. 固定字体编码.固定字体坐标 ...

  5. js逆向-猿人学(7-8)动态字体-图文点选

    猿人学爬虫比赛第七题:<动态字体,随风漂移> 地址: http://match.yuanrenxue.com/match/7 召唤师名字是在html 的 script 标签中,字体是从接口 ...

  6. JS逆向实战17——猿人学第七题 动态字体 随风漂移

    声明 本文章中所有内容仅供学习交流,抓包内容.敏感网址.数据接口均已做脱敏处理,严禁用于商业用途和非法用途,否则由此产生的一切后果均与作者无关,若有侵权,请联系我立即删除! 网站 第七题 动态字体,随 ...

  7. Unity3D中的动态字体和静态字体

    Unity3D中支持动态字体和静态字体两种格式字体,动态字体即使用TTF格式字体库,静态字体则需要自己打包字体图集.动态字体和静态字体区别在于,动态字体如果出现字体库中不存在的字体,会使用系统字体,而 ...

  8. 猫眼电影某页面动态字体bypass

    注意本文的版权声明. 0x00 起手 主要介绍了笔者对猫眼电影https://piaofang.maoyan.com/?ver=normal的动态字体反爬的分析工作和处理.这种字体反爬的手段还经常运用 ...

  9. Python画图新罗马字体调整

    Python画图新罗马字体调整 本文主要依据参考连接一完成,实际效果表明可行,推荐阅读 未改变字体 import matplotlib as mpl import matplotlib.pyplot ...

  10. Android进阶之路 - 深入浅出字体、字体库

    当时组内临时接到一个换字体库的需求,这个需求相对简单,因为手头有其他事情,同时之前也没换过字体库,就交给了同事去做了:现在有时间就好好充实下自己 ( 我写的也未必全对,如有不足可直接提出,相互探讨) ...

最新文章

  1. NeHe教程Qt实现——lesson01
  2. sublime按ctrl+B不能运行
  3. 【收藏】Chrome 错误代码:ERR_UNSAFE_PORT
  4. 【C++】const成员函数
  5. 计算机or笔记本,笔记本or台式机?大学生第一个烦恼被它解决了
  6. Linux内核分析 - 网络[七]:NetFilter
  7. Linux Apache服务详解——Apache服务访问控制
  8. android的JNI标准 android的NDK
  9. -1.#IND,1.#INF 的判断
  10. SLAM论文写作经验 | 小白、跨专业、无人指导、一年多从零到发顶会,他如何做到?
  11. IOS15.4无法运行WebGL2.0问题
  12. div左对齐与里面的内容偏左但是距离左边有点儿距离
  13. 量化投资_期货日内交易几个问题的考证
  14. 网站被qq拦截应该怎么处理
  15. POI和POI-TL操作Word
  16. Java面试中的常见问题
  17. 北斗卫星同步时钟在分布式系统时钟同步的重要性
  18. [附源码]Python计算机毕业设计SSM基于B_S的汽车售后服务管理系统(程序+LW)
  19. 打开html文件需要网络吗,html文件如何打开?
  20. Word字号与磅值之间的关系

热门文章

  1. matlab的模型文件扩展名,[转载]matlab simulink基础知识
  2. 计算机装固态硬盘会不会卡,加装SSD固态硬盘,电脑还是卡?揭晓背后原因,教你10S开机!...
  3. 百度网盘下载显示系统限制,无法下载解决
  4. Django开发微信公众号
  5. hadoop之MapReduce统计选修课程人数,不及格门数,选课人数
  6. 学习ui设计软件有哪些
  7. HTML5 Video播放本地文件
  8. Java5、8、9章复习总结
  9. DevExpress控件学习总结
  10. 客快物流大数据项目(三十):软件下载后存放位置