字形相同的字体反爬问题解析

  1. 问题所在:部分数据加载时使用网站自定义的字体,浏览器访问网页时字体文件会加载到浏览器中,爬虫访问时没有对应的自定义字体,所以就得不到那部分数据,如图1,加密的这部分数据在源码中以字体编码的形式存在,如图2。

  2. 分析问题:下载字体用字体分析工具查看字体后发现字体编码的后4位与源码代替加密数据的编码的后四位是相同的,再与实际数据进行比对后发现他们表示的是同一个文字,如下图所示,所以可利用编码与字形对应关系来替换源码中的编码。


  3. 解决问题
    3.1 因大众点评不同字体的字形是相同的,所以首先可以自己创建一套对应的字体对照表,如下:
font=['1', '2', '3', '4', '5', '6', '7', '8', '9', '0', '店', '中', '美', '家', '馆', '小', '车', '大', '市', '公', '酒','行', '国', '品', '发', '电', '金', '心', '业', '商', '司', '超', '生', '装', '园', '场', '食', '有', '新', '限', '天', '面','工', '服', '海', '华', '水', '房', '饰', '城', '乐', '汽', '香', '部', '利', '子', '老', '艺', '花', '专', '东', '肉', '菜','学', '福', '饭', '人', '百', '餐', '茶', '务', '通', '味', '所', '山', '区', '门', '药', '银', '农', '龙', '停', '尚', '安','广', '鑫', '一', '容', '动', '南', '具', '源', '兴', '鲜', '记', '时', '机', '烤', '文', '康', '信', '果', '阳', '理', '锅','宝', '达', '地', '儿', '衣', '特', '产', '西', '批', '坊', '州', '牛', '佳', '化', '五', '米', '修', '爱', '北', '养', '卖','建', '材', '三', '会', '鸡', '室', '红', '站', '德', '王', '光', '名', '丽', '油', '院', '堂', '烧', '江', '社', '合', '星','货', '型', '村', '自', '科', '快', '便', '日', '民', '营', '和', '活', '童', '明', '器', '烟', '育', '宾', '精', '屋', '经','居', '庄', '石', '顺', '林', '尔', '县', '手', '厅', '销', '用', '好', '客', '火', '雅', '盛', '体', '旅', '之', '鞋', '辣','作', '粉', '包', '楼', '校', '鱼', '平', '彩', '上', '吧', '保', '永', '万', '物', '教', '吃', '设', '医', '正', '造', '丰','健', '点', '汤', '网', '庆', '技', '斯', '洗', '料', '配', '汇', '木', '缘', '加', '麻', '联', '卫', '川', '泰', '色', '世','方', '寓', '风', '幼', '羊', '烫', '来', '高', '厂', '兰', '阿', '贝', '皮', '全', '女', '拉', '成', '云', '维', '贸', '道','术', '运', '都', '口', '博', '河', '瑞', '宏', '京', '际', '路', '祥', '青', '镇', '厨', '培', '力', '惠', '连', '马', '鸿','钢', '训', '影', '甲', '助', '窗', '布', '富', '牌', '头', '四', '多', '妆', '吉', '苑', '沙', '恒', '隆', '春', '干', '饼','氏', '里', '二', '管', '诚', '制', '售', '嘉', '长', '轩', '杂', '副', '清', '计', '黄', '讯', '太', '鸭', '号', '街', '交','与', '叉', '附', '近', '层', '旁', '对', '巷', '栋', '环', '省', '桥', '湖', '段', '乡', '厦', '府', '铺', '内', '侧', '元','购', '前', '幢', '滨', '处', '向', '座', '下', '県', '凤', '港', '开', '关', '景', '泉', '塘', '放', '昌', '线', '湾', '政','步', '宁', '解', '白', '田', '町', '溪', '十', '八', '古', '双', '胜', '本', '单', '同', '九', '迎', '第', '台', '玉', '锦','底', '后', '七', '斜', '期', '武', '岭', '松', '角', '纪', '朝', '峰', '六', '振', '珠', '局', '岗', '洲', '横', '边', '济','井', '办', '汉', '代', '临', '弄', '团', '外', '塔', '杨', '铁', '浦', '字', '年', '岛', '陵', '原', '梅', '进', '荣', '友','虹', '央', '桂', '沿', '事', '津', '凯', '莲', '丁', '秀', '柳', '集', '紫', '旗', '张', '谷', '的', '是', '不', '了', '很','还', '个', '也', '这', '我', '就', '在', '以', '可', '到', '错', '没', '去', '过', '感', '次', '要', '比', '觉', '看', '得','说', '常', '真', '们', '但', '最', '喜', '哈', '么', '别', '位', '能', '较', '境', '非', '为', '欢', '然', '他', '挺', '着','价', '那', '意', '种', '想', '出', '员', '两', '推', '做', '排', '实', '分', '间', '甜', '度', '起', '满', '给', '热', '完','格', '荐', '喝', '等', '其', '再', '几', '只', '现', '朋', '候', '样', '直', '而', '买', '于', '般', '豆', '量', '选', '奶','打', '每', '评', '少', '算', '又', '因', '情', '找', '些', '份', '置', '适', '什', '蛋', '师', '气', '你', '姐', '棒', '试','总', '定', '啊', '足', '级', '整', '带', '虾', '如', '态', '且', '尝', '主', '话', '强', '当', '更', '板', '知', '己', '无','酸', '让', '入', '啦', '式', '笑', '赞', '片', '酱', '差', '像', '提', '队', '走', '嫩', '才', '刚', '午', '接', '重', '串','回', '晚', '微', '周', '值', '费', '性', '桌', '拍', '跟', '块', '调', '糕']

3.2 下载字体并创建基准对照字典

import requests
from fontTools.ttLib import TTFonturl=""
headers={}
def get_base_dict():html=requests.get(url,headers=headers).text# 找出网站自建字体url进行字体下载font_url="http:"+''.join(re.findall(r'<link.*type="text/css" href="(//s3plus.*?)">',text,re.S))font_html=requests.get(font_url).content# 提取不同字体的url及名称(有效的3种字体对应不同的页面数据)urls=re.findall(r',url\("(.*?\.woff)',text,re.S)names=re.findall(r'font-family: "(.*?)";',text,re.S)for url,name in zip(urls,names):woff_url="http:"+''.join(url)name= name.split('-')[-1]# print(woff_url)res_woff=(requests.get(url=woff_url)).contentwith open(f'./{name}.woff','wb') as f:f.write(res_woff)# 打开一个字体文件font=TTFont('./name.woff')# 以xml格式保存查看字体的各种对应关系font.saveXML('name.xml')font_unicode = base_font.getGlyphOrder()[2:]for unicode, font in zip(font_unicode, basefont_char):# print(unicode, font)# 获取字体对应的像素坐标base_contour = base_font['glyf'][unicode].coordinates# 将像素坐标信息加密成32位字符串base_contour_md5 = hashlib.md5(bytes(str(base_contour), encoding='utf-8')).hexdigest()# 设置成基准对照字典base_glyph[base_contour_md5] = {'value': font, 'unicode': unicode}

3.3 得到对照字典后再将网址事实获取的字体信息处理成与对照字典相同的形式

# 根据不同字体以基准字典的形式创建各自的对照字典
def address_font(base_glyph):"""网站所有新字体解析出坐标信息与基准信息对照并替换"""address_font = TTFont('address.woff')# tagName_font = TTFont('tagName.woff')# reviewTag_font = TTFont('reviewTag.woff')# 获取名称与字体间的对应关系address_unicodes = address_font.getGlyphOrder()[2:]# print(address_unicodes)# 拿出基准字典的MD5加密keyfor key in base_glyph.keys():# 取出每个字体的名称for address_unicode in address_unicodes:# 根据字体名称获取字体对应的坐标信息address_contour = address_font['glyf'][address_unicode].coordinates# 获取字体坐标的MD5加密值address_contour_md5 = hashlib.md5(bytes(str(address_contour), encoding='utf-8')).hexdigest()# print(address_contour_md5)# 对比基准字典与网站自建字体坐标加密信息if key == address_contour_md5:# 将自建字体的信息以基准字典的形式进行替换创建新的对照字典address_glyph[address_contour_md5] = {'value': base_glyph[key]['value'],'unicode':'&#x'+ address_unicode[3:]}# print(address_glyph)return address_glyph

3.4 得到实时的真实字体与编码的对应关系后,将源码中的编码替换成对应的文字即可,然后再进行数据提取。

# 根据字体对照字典对获取到的网页源码的加密信息进行替换
def replace_shopNum(html):# 取出对应字体的名称与实际文字的对应关系for uni_dic in shopNum_glyph.values():old =uni_dic['unicode']+';'new = uni_dic['value']# 判断源码中是否存在对应的字体名称,再进行替换if old in html:html=re.sub(old,new,html)return html
  1. 整体思路总结
    4.1 字形相同的网址先需要获取到左右文字信息,可使用ocr识别或者只用字体分析模块输出打印;
    4.2 再根据获取到的字体文件创建各个文字与Unicode之间的关系,得到基准对照字典;
    4.3 用同样的方式创建实时获取的不同字体文件与基准字典形式相同的字典,并与基准字典就MD5加密的key进行对比,将相同的进行替换,以此得到最终的文字与unicode的关系;
    4.4 得到文字与Unicode的关系后用文字替换源码中相对应的编码,即得到解密后的数据。

python爬虫大众点评字体反爬相关推荐

  1. Python爬虫六:字体反爬处理(猫眼+汽车之家)-2018.10

    环境:Windows7 +Python3.6+Pycharm2017 目标:猫眼电影票房.汽车之家字体反爬的处理 ---全部文章: 京东爬虫 .链家爬虫.美团爬虫.微信公众号爬虫.字体反爬.Djang ...

  2. Python爬虫编程12——字体反爬

    什么是字体反爬 就是网页的制作者,他在发布他网页数据的时候.将其中一部分的字体变成乱码.即使你把网页的数据爬取下来,你也获取不到真实数据的样貌.这样就达到了一个反爬虫的目的. 如何解决字体反爬 1.下 ...

  3. Python爬虫大众点评字体加密评论采集!听说这个网站很难?

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

  4. Python爬虫——大众点评,爬取用户电影评论,CSS字体加密

    导航 爬取网址 字体加密原理分析 代码 获取3个字体加密文件 提取用户信息和评论 解密评论 结果 总结 最近一直在学习爬虫,刚好到了反爬这一块,听朋友说大众点评的反爬挺厉害,分析了一下发现还是老熟人, ...

  5. python爬虫大众点评店铺信息(字体加密)

    python爬虫大众点评店铺信息(字体加密) 1.观察网站 发现部分字体加密 2.查看请求的字体文件 发现请求到了两个字体文件,把他下载打开 3. 这就是对应该网页每个字体的unicode,发现两个字 ...

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

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

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

    文章目录 说说这个网站 今天要爬去的网页 反爬措施展示 爬取关键信息 找关键因素 处理汽车参数 关键字破解 入库操作 小扩展:格式化JS 思路汇总 关注公众账号 说说这个网站 汽车之家,反爬神一般的存 ...

  8. 大众点评评论反爬解决方案

    目前大众点评主要有两种反爬的机制:css反爬和字体反爬. css反爬的解决方案 具体详见反爬机制之css反爬详解 字体反爬的解决方案

  9. 一次Python爬虫实战,解决反爬问题!

    人生苦短,快学Python! 随着互联网的发展,Python的崛起,很多网站经常被外面的爬虫程序骚扰,有什么方法可以阻止爬虫吗? 阻止爬虫也就称之为反爬虫,反爬虫涉及到的技术比较综合,说简单也简单,说 ...

  10. python读取ttf_python解析字体反爬

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

最新文章

  1. 怎么让百度快速重新收录
  2. E0144“const char *“ 类型的值不能用于初始化 “char *“ 类型的实体
  3. Beanstalkd工作队列
  4. Spark任务提交后是如何完成提交过程的?源码解析!
  5. Yii2系列教程三:Database And Gii
  6. LeetCode - Easy - 169. Majority Element
  7. Xtrabackup备份与恢复
  8. IT工作者平日要做好自我调节
  9. 【Java 基础】字符串(String、StringBuilder),日期(Date、SimpleDateFormat、Calendar)
  10. 2018-2019-2 20165222《网络对抗技术》Exp9 Web安全基础
  11. Nginx SSL 性能调优
  12. Ubuntu 16.04 安装搜狗输入法
  13. java命名规则及规范
  14. android adb am start,Android adb shell am start命令总结
  15. 【PC】如何让程序开机自启动/如何打开开机自启动文件夹
  16. 计算机中MAX函数是求什么,MAX函数
  17. MFC 视图-OpenGL场景-CDialogBar三个界面保存为图片
  18. C#,深入浅出全接触
  19. mysql时间函数详解
  20. 模板网站与定制网站有什么区别 定制网站好不好

热门文章

  1. 联想如何打开计算机配置,联想电脑如何进入BIOS以及设置启动菜单
  2. JVM学习笔记(12) 垃圾回收-垃圾回收相关算法
  3. fullpage插件
  4. 第11章 Linux的网络管理
  5. 【信息系统项目管理师】第二十五章 量化的项目管理(考点汇总篇)
  6. opencc对文档的繁体中文转换为简体
  7. Jupyter Notebook与Pycharm代码连接Docker容器中的远程服务器运行
  8. C++运算符重载(简单易懂)
  9. python心得总结知识点和收获,千锋Python培训学员心得 在总结中收获提升
  10. 【ArcGIS】道路中心线提取、河道中心线的提取