python爬虫大众点评字体反爬

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

  1. 问题所在:部分数据加载时使用网站自定义的字体,浏览器访问网页时字体文件会加载到浏览器中,爬虫访问时没有对应的自定义字体,所以就得不到那部分数据,如图1,加密的这部分数据在源码中以字体编码的形式存在,如图2。
    图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的关系后用文字替换源码中相对应的编码,即得到解密后的数据。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://xiahunao.cn/news/254126.html

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

五笔字根语法口决

一、字根助记词 11G   王旁青头戋五一 12F   土士二干十寸雨 13D   大犬三&#xff08;羊&#xff09;古石厂 (“羊”指羊字底) 14S   木丁西 15A   工戈草头右框七   (“右框”即“匚”) 21H   目具上止卜虎皮   (“具”指具字的上部) 22J   日早…

字体反爬案例解析:大众点评

文章目录 字体反爬简介发送请求&#xff0c;获取网页源码提取字体信息&#xff0c;并将字体文件下载到本地建立基准字典引例提取需要字体反爬处理的信息提取不需要字体反爬的信息整理提取到的所有信息&#xff0c;并存入excel 字体反爬简介 什么是字体反爬&#xff1f; …

作文 我眼中的计算机1000字,我眼中的自己作文范文1000字(精选6篇)

我眼中的自己作文范文1000字(精选6篇) 在日常生活或是工作学习中&#xff0c;许多人都有过写作文的经历&#xff0c;对作文都不陌生吧&#xff0c;作文根据写作时限的不同可以分为限时作文和非限时作文。还是对作文一筹莫展吗&#xff1f;以下是小编为大家整理的我眼中的自己作…

基于深度学习的高精度家禽猪检测识别系统(PyTorch+Pyside6+YOLOv5模型)

摘要&#xff1a;基于深度学习的高精度家禽猪检测识别系统可用于日常生活中或野外来检测与定位家禽猪目标&#xff0c;利用深度学习算法可实现图片、视频、摄像头等方式的家禽猪目标检测识别&#xff0c;另外支持结果可视化与图片或视频检测结果的导出。本系统采用YOLOv5目标检…

智能管理PoE交换机

在这个万物互联的时代&#xff0c;数据与数据之间的相互传输交流&#xff0c;显得尤为重要。那么要怎样才能使计算机与传统的物联设备相连接呢&#xff1f;这时&#xff0c;串口服务器这一媒介的作用就凸显出来了。那么&#xff0c;你知道什么是串口服务器吗&#xff1f;串口服…

chatgpt赋能python:Python中构造函数的名称

Python中构造函数的名称 作为一名有10年Python编程经验的工程师&#xff0c;我深知Python语言中构造函数的重要性。在本文中&#xff0c;我将着重介绍Python中构造函数的名称&#xff0c;并阐述其在Python编程中的作用。 什么是构造函数&#xff1f; 构造函数是一种特殊类型…

C++ stack容器介绍

&#x1f914;stack容器介绍&#xff1a; &#x1f4d6; stack是一种数据结构&#xff0c;也可以被称为堆栈。它是一个容器&#xff0c;只允许在最顶层进行插入和删除&#xff0c;并且只能访问最后一个插入的元素。这个元素称为栈顶。所有新插入的元素都被放置在栈顶上面&#…

Mysql source命令报错

Mysql source命令报错 情况一&#xff1a;目录包含中文 放到没有中文的路径再执行 情况二&#xff1a;不小心加了分号 mysql会将分号当做文件名的一部分 固然报错 情况三&#xff1a;没有选择数据库 使用 use加数据库名 选择数据库后再执行 执行成功画面

Linux中的source命令

Linux中的source命令 1、source命令是什么&#xff1f; source命令也称为“点命令”&#xff0c;也就是一个点符号&#xff08;.&#xff09;&#xff0c;是bash的内部命令。 注意&#xff1a;该命令通常用命令“.”来替代 2、source命令 功能&#xff08;能干什么&#xff0…

qsort函数排序举例

使用qsort函数快速排序应用举例 这篇博客是用qsort函数来快速排列float型数据&#xff0c;分别按照年龄&#xff08;int型&#xff09;、姓名&#xff08;char型&#xff09;排列结构体。看懂就看懂&#xff0c;看不懂我也不想解释了。 简略解释一下qsort函数&#xff1a; v…

C语言qsort函数详解

目录 一、qsort函数的使用 二、qsort函数的模拟 一、qsort函数的使用 快排函数qsort是C的库函数&#xff0c;它可以对输入的任何类型的数组排序&#xff0c;通过该函数的函数声明我们可以看出它的使用方法&#xff1a; 举个栗子&#xff1a; #include<stdio.h> #inclu…

C语言 - qsort函数详解

文章目录 一.qsort函数简介1.qsort函数是C标准库<stdlib.h>库中的函数&#xff0c;使用时引入#include <stdlib.h>。**2.它的函数原型是 void qsort(void* base, size_t num, size_t width, int (*compare)(const void*, const void*))3.这些参数都是什么意思&…

qsort函数详解

上篇文章&#xff0c;笔者讲解了冒泡排序的方法&#xff0c;原文链接为&#xff1a;一个典列来带领大家了解冒泡排序思想_念君思宁的博客-CSDN博客&#xff0c;有意者请参考一下&#xff01; 最近笔者又浅学关于qsort函数的排序方法&#xff01;下面且听笔者一一道来&#xff…

C语言函数——qsort函数的使用

目录 一、qsort函数&#xff1a; 1、定义&#xff1a; 2、参数&#xff1a; &#xff08;1&#xff09;.基础 &#xff08;2&#xff09;.数字 &#xff08;3&#xff09;.大小 &#xff08;4&#xff09;.比较 二、总代码&#xff1a; 1、整型比较&#xff1a; 2、浮…

利用qsort函数快速排序

一.qsort函数的类型及参数 void qsort(void *base,size_t num,size_t width,int (*compare)(const void* elem1),const void* elem2)1.第一个参数base&#xff1a;待排序数组的首元素的地址&#xff0c;数据类型为void*。 2.第二个参数 num&#xff1a;待排序数组的元素个数&…

详解c语言中的qsort函数(有图)

目录 目录 一、qsort函数是什么 1、自定义冒泡函数时遇到的问题 2、qsort函数的作用 &#xff08;1&#xff09;int整形数组排序&#xff08;2&#xff09;浮点型数组排序&#xff08;3&#xff09;字符数组排序 &#xff08;4&#xff09;结构体排序 二、qsort函数…

qsort函数详情

文章目录 一.qsort函数的使用1.qsort函数定义&#xff1a;2.使用 二.qsort函数的模拟实现 一.qsort函数的使用 1.qsort函数定义&#xff1a; qsort函数实现的功能为&#xff1a;对一组数据进行排序。 表现形式&#xff1a; void qsort(void *base, size_t num, size_t size,…

qsort函数

目录 1.什么是qsort函数2.实现一个qsort函数3.用qsort函数排序一个结构体4.模仿qsort的功能实现一个通用的冒泡排序 1.什么是qsort函数 我们以前学习过的一些排序算法&#xff0c;如冒泡、希尔、快排等等&#xff0c;它们速度有快有满&#xff0c;但是这些排序都只能排序一种类…

qsort函数的使用方法

前言 qsort函数是C语言库函数内给我们提供的一个可以实现排序的函数 它不仅可以排序数组&#xff0c;还可以排序字符串&#xff0c;以及结构体类型 下面是qsort函数的使用方法以及注意事项 一、了解qsort函数 根据MSDN提供的参数 由此我们可以知道 使用qsort函数需要引用头文…

简单介绍一下qsort函数

目录 一.回调函数 二.qsort函数 三.void*指针 四.用qsort函数进行升序排序 1.整形数组排序 2.结构体数组排序 3.字符数组排序 五.使用冒泡排序模拟实现qsort函数 一.回调函数 回调函数就是一个通过函数指针调用的函数。如果你把函数的指针&#xff08;地址&#xff09;…