前面基础不再叙述,因为某点评的反爬一直比较有意思,可以一直拿来练手。。

日常反爬虫措施有css文字映射和字体库反爬虫作妖。

直接找到他的动态加载的字体文件:

找到这个字体下载下来:

该页面结果简单,爬取提取数据基本上一行代码就可以解决。但是爬取下来的为字体加密后的字符。

所以我现在要做的就是,怎么去将&#x…;字符转为对应的汉字。

先手动下载页面中的字体文件。然后使用fontTools模块,读取字体文件,并将其保存为xml格式(正常情况下,字体文件是无法打开查看的)

字体文件的xml结构为:

字体编码名称表:

cmap映射表:

每个字体对应的笔画坐标表(这个是不会变的,但是编码名称会变):

将该字体文件导入百度字体在线识别看一看对应的文字

可以读取出所有编码名称对应的数字及其汉字,总共601个。我们需要将其拿出来与字符编码名称对应起来,生成一个映射表

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

现在介绍一下fontTools获取字体文件数据的一些方法:
getBestCmap()返回cmap表中对应的映射,只不过code字段返回的为十进制数据,如果想转为十六进制,使用hex()内置方法即可

getGlyphOrder()方法返回所有字符编码名称,按表格顺序提取,类型为列表

字体编码名称和对应的解码数据数量必须一样,由于解码数据是我从百度字体识别中抓取出来的,固定的,而且位置也是固定的;字体编码名称根据每次请求可能不一样,但是对应位置是固定的。所以可以动态提取字体编码名称和解码数据一一对应。

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

根据此处理过的映射表就可以替换网页中的特殊字符,替换为正常的文字。当然这种方法可能存在一定的问题,不可能100%真实还原。
最好的办法还是根据字符笔画的坐标去解决。这里能力有限,就不演示了。

完整字体解密代码:

import random
import requests
import re
from lxml import etree
from fontTools.ttLib import TTFont# 下载动态字体文件
def save_font_file():"""请求目标网站,下载动态字体文件:return: 并返回页面内容"""# 请求头cookies = "_lxsdk_cuid=1686df829b53b-032a9bde9e0acd-77143d4c-1fa400-1686df829b6c8; _lxsdk=1686df829b53b-032a9bde9e0acd-77143d4c-1fa400-1686df829b6c8; _hc.v=4b301a65-22a7-b98e-083d-2bf77fb37b23.1548033207; cy=5; cye=nanjing; _lx_utm=utm_source%3DBaidu%26utm_medium%3Dorganic; _lxsdk_s=16f63f7fe45-a44-2f7-e0b%7C%7C188"headers = {"Cookie":cookies,"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.108 Safari/537.36"}# 目标页面urlurl = "http://www.dianping.com/shop/4209136"# 开始请求resp = requests.get(url=url, headers=headers)resp.encoding = "utf-8"# print(response)# 提取动态字体url链接sub_font_url = re.findall(r'href="(//s3plus\.meituan\.net/v{,100}?)"',resp.text,re.S)if sub_font_url:css_href = "http:" + sub_font_url[0]text = requests.get(css_href).textprint(text)font_url = re.findall(r'(//s3plus\.meituan\.net/.{,100}?woff)',text)[0]# 拼接完整的url链接full_font_url = "http:"+ font_url# 请求字体链接,保存字体res = requests.get(full_font_url).contentwith open("11.woff","wb") as f:f.write(res)return resp.text# 读取字体
# from fontTools.ttLib import TTFont
# font = TTFont('字体.woff')
# font.saveXML('字体.xml')# 读取字体文件,生成字体编码与文字的映射表
def get_font_map():"""读取字体文件,生成字体编码与文字的映射表:return: 返回编码文字映射字典"""# 这个字体文件需要先析网页,找到这个url,然后下载下来到本地,然后使用TTFont()加载字体文件#       字体文件的名字font = TTFont('11.woff')# 得到cmap 字体对应代码->字体名字# font_cmap = font.getBestCmap()# 得到所有的字体名字 类似:unif2abfont_names = font.getGlyphOrder()print('字体编码名称数量:', len(font_names))# 使用百度在线字体识别工具获取的文字数据texts = [上面字体库中的字体]print('字体编码对应解码字符数量:', len(texts))# 将 字体名字 和 我们查看到的值 组成一个字典 如:'unif2ab': '副'font_name_map = {}for index, value in enumerate(texts):font_name_map[font_names[index]] = value# 转为页面抓取的字符格式映射表,如:'': '美'mappings = {}for k, v in font_name_map.items():if k.startswith('uni'):key_ = k.replace('uni', '&#x')mappings[key_] = velse:mappings[k] = vreturn mappings# 根据处理后的映射表和网页内容,进行解码并提取文字内容
def html_font_parse(response, mappings):# 解码后的响应内容变量response_ = response# 循环处理后的字体映射表for k, v in mappings.items():# 拼接页面中完整的乱码字符uni_font = k + ';'# 判断乱码字符是否存在抓取下来的网页内容中if uni_font in response_:# 如果存在,将其替换为解码后的汉字response_ = response_.replace(uni_font, mappings[k])# print(response_)# 根据解码后的网页内容提取数据parse_html = etree.HTML(response_)li_list = parse_html.xpath('//div[@id="comment"]//ul//li')for li in li_list[0:10]:  user_name = li.xpath('./p[@class="user-info"]//a[@class="name"]//text()')comment = li.xpath('./div[@class="content"]//p[@class="desc"]//text()')print("用户名:", user_name[0], "  评论:", "".join(comment))

有问题可联系交流。

参考:https://blog.csdn.net/z_ipython/article/details/101291500

侵权联删。

基于某点评字体库的字体反爬相关推荐

  1. Linux 安装字体库 中文字体

    Linux 安装字体库 & 中文字体 发现有中文乱码和中文字体不整齐(重叠)的情况,首先考虑的就是操作系统是否有中文字体,在CentOS 7中发现输入命令查看字体列表是提示命令无效: 如上图可 ...

  2. 本地跑项目正常,部署至云服务器上就出现中文验证码 显示小方块儿;参考文章“Centos7 安装字体库中文字体”才得以解决问题

    一.问题描述 登录页面中文验证码 无法正常显示 只看到小框框,但服务器那边是可以正常输出中文的: 下面这样改了之后还是不行: 二.解决办法:安装字体库&中文字体 1.先查看当前(服务器上)系统 ...

  3. 【Vue-Element】矢量字体库iconfont字体图标库使用

    矢量字体库iconfont字体图标库使用 1.注册并登录 2.图标管理 >> 我的项目 >> 新建项目 3.新建完成后,搜索我们想要的图标,然后添加到购物车 4.添加完成后,购 ...

  4. CentOS 7 安装字体库 中文字体

    前言 报表中发现有中文乱码和中文字体不整齐(重叠)的情况,首先考虑的就是操作系统是否有中文字体,在CentOS 7中发现输入命令查看字体列表是提示命令无效:    如上图可以看出,不仅没有中文字体,连 ...

  5. html 中加入字体库,css字体库怎么用?

    CSS是一种定义样式结构如字体.颜色.位置等的语言,被用于描述网页上的信息格式化和现实的方式.CSS样式可以直接存储于HTML网页或者单独的样式单文件. css字体库使用方法: 1.下载字体库文件 自 ...

  6. CentOS7中安装字体库中文字体

    若存在中文乱码的情况,这是因为操作系统中没有安装中文字体. 安装字体库 yum install fontconfig -y 安装更新字体命令 yum install mkfontscale -y 添加 ...

  7. Linux CentOS 7 安装字体库 中文字体

    前言 报表中发现有中文乱码和中文字体不整齐(重叠)的情况,首先考虑的就是操作系统是否有中文字体,在CentOS 7中发现输入命令查看字体列表是提示命令无效: 如上图可以看出,不仅没有中文字体,连字体库 ...

  8. centos7 默认中文字体_Linux CentOS 7 安装字体库 中文字体

    前言 报表中发现有中文乱码和中文字体不整齐(重叠)的情况,首先考虑的就是操作系统是否有中文字体,在CentOS 7中发现输入命令查看字体列表是提示命令无效: 如上图可以看出,不仅没有中文字体,连字体库 ...

  9. html5 在线字体库,网络字体@font-face,如何处理网页中的特殊字体?

    网络字体@font-face 如何处理网页中的特殊字体 HTML5学堂:随着网页的发展,网页中出现了越来越多的字体种类,网页自带的微软雅黑.宋体.黑体已经越来越难以满足设计的需要,那么,如何在网站中使 ...

  10. python爬取大众点评_【Python3爬虫】大众点评爬虫(破解CSS反爬)

    本次爬虫的爬取目标是大众点评上的一些店铺的店铺名称.推荐菜和评分信息. 一.页面分析 进入大众点评,然后选择美食(http://www.dianping.com/wuhan/ch10),可以看到一页有 ...

最新文章

  1. (笔试题)将数组分成两组,使两组的和的差的绝对值最小
  2. android object数组赋值_Java对象数组定义与用法详解
  3. Objective-C成员变量声明方式探究
  4. 安卓 dex 通用脱壳技术研究(四)
  5. .Net程序集强签名详解
  6. 55.Linux/Unix 系统编程手册(下) -- 文件加锁
  7. 计算机论文对比实验怎么做,如何查找别人论文(计算机类文献)中实验部分的代码?...
  8. 视觉slam十四讲 编程学习
  9. 如何快速提取pdf中矢量图
  10. 数据采集工具:八爪鱼
  11. [机器学习]模型评估指标:ROC/AUC,KS,GINI,Lift/Gain, PSI 总结
  12. Hilditch细化算法
  13. CodeForces 372A Counting Kangaroos is Fun 动物PK
  14. html+css实现京东、英雄联盟静态页面
  15. win8 如何摄像头测试软件,高手解说win8系统摄像头检测不到的设置教程
  16. 百度地图常用jsapi
  17. hive:函数:trim
  18. 私有化部署VideoTogether一起看视频
  19. Spark RDD 论文详解(四)表达 RDDs
  20. Share mouse and keyboard (synergy)

热门文章

  1. 如何将旧电脑变成文件存储服务器,免费的NAS系统,把旧电脑改造成NAS
  2. 宏发41F-1Z-C2接线
  3. 快手科技更新招股书:前11个月营收525亿元,引入10家基石投资者
  4. 荣耀MagicOS 7.0正式发布;快手科技2022年第三季度收入同比增长12.9% | 美通企业日报...
  5. JetBrains 全家桶的全流程详解
  6. 微服务系统架构的演变
  7. SQLServer过期解决步骤
  8. HTML frameset 标签 cols 属性
  9. 三菱q系列plc连接电脑步骤_三菱Q系列PLC 以太网通信设置方法
  10. wordpress批量导入html文章,wordpress文章采集发布批量上传教程(火车头)